From 706cb319061a5fa533ee9d8f655442bef38e25c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Mon, 29 Sep 2025 17:16:10 +0200 Subject: [PATCH 1/2] pages: Add coverage report for EEST Osaka --- reports/coverage_eest_osaka/coverage.lcov | 15851 ++++++++++++++++ reports/coverage_eest_osaka/html/control.js | 99 + .../project/include/evmmax/evmmax.hpp.html | 40 + .../project/lib/evmone/baseline.hpp.html | 1 + .../lib/evmone/baseline_analysis.cpp.html | 15 + .../lib/evmone/baseline_execution.cpp.html | 35 + .../baseline_instruction_table.cpp.html | 1 + .../project/lib/evmone/delegation.cpp.html | 1 + .../project/lib/evmone/delegation.hpp.html | 1 + .../lib/evmone/execution_state.hpp.html | 1 + .../project/lib/evmone/instructions.hpp.html | 157 + .../lib/evmone/instructions_calls.cpp.html | 799 + .../lib/evmone/instructions_storage.cpp.html | 49 + .../lib/evmone/instructions_xmacro.hpp.html | 1 + .../lib/evmone_precompiles/blake2b.cpp.html | 1 + .../lib/evmone_precompiles/bls.cpp.html | 49 + .../lib/evmone_precompiles/bn254.cpp.html | 17 + .../lib/evmone_precompiles/ecc.hpp.html | 78 + .../lib/evmone_precompiles/keccak.c.html | 15 + .../lib/evmone_precompiles/keccak.hpp.html | 1 + .../lib/evmone_precompiles/kzg.cpp.html | 1 + .../lib/evmone_precompiles/modexp.cpp.html | 1 + .../pairing/bn254/fields.hpp.html | 1 + .../pairing/bn254/pairing.cpp.html | 80 + .../pairing/bn254/utils.hpp.html | 33 + .../pairing/field_template.hpp.html | 1 + .../lib/evmone_precompiles/ripemd160.cpp.html | 1 + .../lib/evmone_precompiles/secp256k1.cpp.html | 23 + .../lib/evmone_precompiles/secp256r1.cpp.html | 39 + .../lib/evmone_precompiles/sha256.cpp.html | 29 + .../project/test/state/account.hpp.html | 20 + .../project/test/state/blob_schedule.hpp.html | 1 + .../builder/project/test/state/block.cpp.html | 17 + .../builder/project/test/state/block.hpp.html | 1 + .../project/test/state/bloom_filter.cpp.html | 1 + .../project/test/state/bloom_filter.hpp.html | 1 + .../project/test/state/errors.hpp.html | 1 + .../test/state/ethash_difficulty.cpp.html | 1 + .../project/test/state/hash_utils.hpp.html | 1 + .../builder/project/test/state/host.cpp.html | 283 + .../builder/project/test/state/host.hpp.html | 1 + .../builder/project/test/state/mpt.cpp.html | 33 + .../project/test/state/mpt_hash.cpp.html | 1 + .../project/test/state/mpt_hash.hpp.html | 1 + .../project/test/state/precompiles.cpp.html | 131 + .../test/state/precompiles_stubs.cpp.html | 30 + .../project/test/state/requests.cpp.html | 16 + .../project/test/state/requests.hpp.html | 1 + .../builder/project/test/state/rlp.hpp.html | 17 + .../builder/project/test/state/state.cpp.html | 166 + .../builder/project/test/state/state.hpp.html | 1 + .../project/test/state/state_view.hpp.html | 1 + .../test/state/system_contracts.cpp.html | 1 + .../project/test/state/test_state.cpp.html | 1 + .../project/test/state/test_state.hpp.html | 1 + .../project/test/state/transaction.cpp.html | 1 + .../project/test/state/transaction.hpp.html | 1 + reports/coverage_eest_osaka/html/index.html | 3 + reports/coverage_eest_osaka/html/style.css | 194 + reports/coverage_eest_osaka/report.txt | 61 + 60 files changed, 18410 insertions(+) create mode 100644 reports/coverage_eest_osaka/coverage.lcov create mode 100644 reports/coverage_eest_osaka/html/control.js create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/include/evmmax/evmmax.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline_analysis.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline_execution.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline_instruction_table.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/delegation.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/delegation.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/execution_state.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions_calls.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions_storage.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions_xmacro.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/blake2b.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/bls.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/bn254.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/ecc.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/keccak.c.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/keccak.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/kzg.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/modexp.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/bn254/fields.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/bn254/pairing.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/bn254/utils.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/field_template.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/ripemd160.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/secp256k1.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/secp256r1.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/sha256.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/account.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/blob_schedule.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/block.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/block.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/bloom_filter.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/bloom_filter.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/errors.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/ethash_difficulty.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/hash_utils.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/host.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/host.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/mpt.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/mpt_hash.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/mpt_hash.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/precompiles.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/precompiles_stubs.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/requests.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/requests.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/rlp.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/state.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/state.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/state_view.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/system_contracts.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/test_state.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/test_state.hpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/transaction.cpp.html create mode 100644 reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/transaction.hpp.html create mode 100644 reports/coverage_eest_osaka/html/index.html create mode 100644 reports/coverage_eest_osaka/html/style.css create mode 100644 reports/coverage_eest_osaka/report.txt diff --git a/reports/coverage_eest_osaka/coverage.lcov b/reports/coverage_eest_osaka/coverage.lcov new file mode 100644 index 0000000000..27e821dccf --- /dev/null +++ b/reports/coverage_eest_osaka/coverage.lcov @@ -0,0 +1,15851 @@ +SF:/home/builder/project/include/evmmax/evmmax.hpp +FN:67,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE7to_montERKS3_ +FN:81,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3mulERKS3_S6_ +FN:51,_ZN6evmmax8ModArithIN4intx4uintILj256EEEE6addmulEmmmm +FN:128,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3subERKS3_S6_ +FN:119,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3addERKS3_S6_ +FN:137,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3invERKS3_ +FN:42,_ZN6evmmax8ModArithIN4intx4uintILj256EEEE17compute_r_squaredERKS3_ +FN:28,_ZN6evmmax8ModArithIN4intx4uintILj256EEEE15compute_mod_invEm +FN:58,_ZN6evmmax8ModArithIN4intx4uintILj256EEEEC2ERKS3_ +FN:73,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE9from_montERKS3_ +FN:58,_ZN6evmmax8ModArithIN4intx4uintILj384EEEEC2ERKS3_ +FN:42,_ZN6evmmax8ModArithIN4intx4uintILj384EEEE17compute_r_squaredERKS3_ +FN:28,_ZN6evmmax8ModArithIN4intx4uintILj384EEEE15compute_mod_invEm +FN:67,_ZNK6evmmax8ModArithIN4intx4uintILj384EEEE7to_montERKS3_ +FN:81,_ZNK6evmmax8ModArithIN4intx4uintILj384EEEE3mulERKS3_S6_ +FN:51,_ZN6evmmax8ModArithIN4intx4uintILj384EEEE6addmulEmmmm +FN:73,_ZNK6evmmax8ModArithIN4intx4uintILj384EEEE9from_montERKS3_ +FN:119,_ZNK6evmmax8ModArithIN4intx4uintILj384EEEE3addERKS3_S6_ +FN:128,_ZNK6evmmax8ModArithIN4intx4uintILj384EEEE3subERKS3_S6_ +FN:137,_ZNK6evmmax8ModArithIN4intx4uintILj384EEEE3invERKS3_ +FN:58,_ZN6evmmax8ModArithIN4intx4uintILj128EEEEC2ERKS3_ +FN:42,_ZN6evmmax8ModArithIN4intx4uintILj128EEEE17compute_r_squaredERKS3_ +FN:28,_ZN6evmmax8ModArithIN4intx4uintILj128EEEE15compute_mod_invEm +FN:67,_ZNK6evmmax8ModArithIN4intx4uintILj128EEEE7to_montERKS3_ +FN:81,_ZNK6evmmax8ModArithIN4intx4uintILj128EEEE3mulERKS3_S6_ +FN:51,_ZN6evmmax8ModArithIN4intx4uintILj128EEEE6addmulEmmmm +FN:73,_ZNK6evmmax8ModArithIN4intx4uintILj128EEEE9from_montERKS3_ +FN:58,_ZN6evmmax8ModArithIN4intx4uintILj512EEEEC2ERKS3_ +FN:42,_ZN6evmmax8ModArithIN4intx4uintILj512EEEE17compute_r_squaredERKS3_ +FN:28,_ZN6evmmax8ModArithIN4intx4uintILj512EEEE15compute_mod_invEm +FN:67,_ZNK6evmmax8ModArithIN4intx4uintILj512EEEE7to_montERKS3_ +FN:81,_ZNK6evmmax8ModArithIN4intx4uintILj512EEEE3mulERKS3_S6_ +FN:51,_ZN6evmmax8ModArithIN4intx4uintILj512EEEE6addmulEmmmm +FN:73,_ZNK6evmmax8ModArithIN4intx4uintILj512EEEE9from_montERKS3_ +FN:58,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEEC2ERKS3_ +FN:42,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEE17compute_r_squaredERKS3_ +FN:28,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEE15compute_mod_invEm +FN:67,_ZNK6evmmax8ModArithIN4intx4uintILj1024EEEE7to_montERKS3_ +FN:81,_ZNK6evmmax8ModArithIN4intx4uintILj1024EEEE3mulERKS3_S6_ +FN:51,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEE6addmulEmmmm +FN:73,_ZNK6evmmax8ModArithIN4intx4uintILj1024EEEE9from_montERKS3_ +FN:58,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEEC2ERKS3_ +FN:42,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEE17compute_r_squaredERKS3_ +FN:28,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEE15compute_mod_invEm +FN:67,_ZNK6evmmax8ModArithIN4intx4uintILj2048EEEE7to_montERKS3_ +FN:81,_ZNK6evmmax8ModArithIN4intx4uintILj2048EEEE3mulERKS3_S6_ +FN:51,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEE6addmulEmmmm +FN:73,_ZNK6evmmax8ModArithIN4intx4uintILj2048EEEE9from_montERKS3_ +FN:58,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEEC2ERKS3_ +FN:42,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEE17compute_r_squaredERKS3_ +FN:28,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEE15compute_mod_invEm +FN:67,_ZNK6evmmax8ModArithIN4intx4uintILj8192EEEE7to_montERKS3_ +FN:81,_ZNK6evmmax8ModArithIN4intx4uintILj8192EEEE3mulERKS3_S6_ +FN:51,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEE6addmulEmmmm +FN:73,_ZNK6evmmax8ModArithIN4intx4uintILj8192EEEE9from_montERKS3_ +FNDA:54518,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE7to_montERKS3_ +FNDA:40674616,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3mulERKS3_S6_ +FNDA:1301587712,_ZN6evmmax8ModArithIN4intx4uintILj256EEEE6addmulEmmmm +FNDA:23975972,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3subERKS3_S6_ +FNDA:38554056,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3addERKS3_S6_ +FNDA:8464,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3invERKS3_ +FNDA:2094,_ZN6evmmax8ModArithIN4intx4uintILj256EEEE17compute_r_squaredERKS3_ +FNDA:2094,_ZN6evmmax8ModArithIN4intx4uintILj256EEEE15compute_mod_invEm +FNDA:2094,_ZN6evmmax8ModArithIN4intx4uintILj256EEEEC2ERKS3_ +FNDA:20302,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE9from_montERKS3_ +FNDA:0,_ZN6evmmax8ModArithIN4intx4uintILj384EEEEC2ERKS3_ +FNDA:0,_ZN6evmmax8ModArithIN4intx4uintILj384EEEE17compute_r_squaredERKS3_ +FNDA:0,_ZN6evmmax8ModArithIN4intx4uintILj384EEEE15compute_mod_invEm +FNDA:0,_ZNK6evmmax8ModArithIN4intx4uintILj384EEEE7to_montERKS3_ +FNDA:0,_ZNK6evmmax8ModArithIN4intx4uintILj384EEEE3mulERKS3_S6_ +FNDA:0,_ZN6evmmax8ModArithIN4intx4uintILj384EEEE6addmulEmmmm +FNDA:0,_ZNK6evmmax8ModArithIN4intx4uintILj384EEEE9from_montERKS3_ +FNDA:0,_ZNK6evmmax8ModArithIN4intx4uintILj384EEEE3addERKS3_S6_ +FNDA:0,_ZNK6evmmax8ModArithIN4intx4uintILj384EEEE3subERKS3_S6_ +FNDA:0,_ZNK6evmmax8ModArithIN4intx4uintILj384EEEE3invERKS3_ +FNDA:590,_ZN6evmmax8ModArithIN4intx4uintILj128EEEEC2ERKS3_ +FNDA:590,_ZN6evmmax8ModArithIN4intx4uintILj128EEEE17compute_r_squaredERKS3_ +FNDA:590,_ZN6evmmax8ModArithIN4intx4uintILj128EEEE15compute_mod_invEm +FNDA:1180,_ZNK6evmmax8ModArithIN4intx4uintILj128EEEE7to_montERKS3_ +FNDA:259742,_ZNK6evmmax8ModArithIN4intx4uintILj128EEEE3mulERKS3_S6_ +FNDA:2077936,_ZN6evmmax8ModArithIN4intx4uintILj128EEEE6addmulEmmmm +FNDA:590,_ZNK6evmmax8ModArithIN4intx4uintILj128EEEE9from_montERKS3_ +FNDA:551,_ZN6evmmax8ModArithIN4intx4uintILj512EEEEC2ERKS3_ +FNDA:551,_ZN6evmmax8ModArithIN4intx4uintILj512EEEE17compute_r_squaredERKS3_ +FNDA:551,_ZN6evmmax8ModArithIN4intx4uintILj512EEEE15compute_mod_invEm +FNDA:1102,_ZNK6evmmax8ModArithIN4intx4uintILj512EEEE7to_montERKS3_ +FNDA:74280,_ZNK6evmmax8ModArithIN4intx4uintILj512EEEE3mulERKS3_S6_ +FNDA:9507840,_ZN6evmmax8ModArithIN4intx4uintILj512EEEE6addmulEmmmm +FNDA:551,_ZNK6evmmax8ModArithIN4intx4uintILj512EEEE9from_montERKS3_ +FNDA:42,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEEC2ERKS3_ +FNDA:42,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEE17compute_r_squaredERKS3_ +FNDA:42,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEE15compute_mod_invEm +FNDA:84,_ZNK6evmmax8ModArithIN4intx4uintILj1024EEEE7to_montERKS3_ +FNDA:756,_ZNK6evmmax8ModArithIN4intx4uintILj1024EEEE3mulERKS3_S6_ +FNDA:387072,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEE6addmulEmmmm +FNDA:42,_ZNK6evmmax8ModArithIN4intx4uintILj1024EEEE9from_montERKS3_ +FNDA:70,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEEC2ERKS3_ +FNDA:70,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEE17compute_r_squaredERKS3_ +FNDA:70,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEE15compute_mod_invEm +FNDA:140,_ZNK6evmmax8ModArithIN4intx4uintILj2048EEEE7to_montERKS3_ +FNDA:44464,_ZNK6evmmax8ModArithIN4intx4uintILj2048EEEE3mulERKS3_S6_ +FNDA:91062272,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEE6addmulEmmmm +FNDA:70,_ZNK6evmmax8ModArithIN4intx4uintILj2048EEEE9from_montERKS3_ +FNDA:156,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEEC2ERKS3_ +FNDA:156,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEE17compute_r_squaredERKS3_ +FNDA:156,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEE15compute_mod_invEm +FNDA:312,_ZNK6evmmax8ModArithIN4intx4uintILj8192EEEE7to_montERKS3_ +FNDA:2120,_ZNK6evmmax8ModArithIN4intx4uintILj8192EEEE3mulERKS3_S6_ +FNDA:69468160,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEE6addmulEmmmm +FNDA:156,_ZNK6evmmax8ModArithIN4intx4uintILj8192EEEE9from_montERKS3_ +FNF:10 +FNH:10 +DA:28,3503 +DA:30,3503 +DA:31,3503 +DA:32,227695 +DA:33,224192 +DA:34,224192 +DA:35,224192 +DA:36,224192 +DA:37,3503 +DA:38,3503 +DA:42,3503 +DA:45,3503 +DA:46,3503 +DA:47,3503 +DA:51,1474090992 +DA:52,1474090992 +DA:53,1474090992 +DA:54,1474090992 +DA:58,3503 +DA:59,3503 +DA:60,3503 +DA:61,3503 +DA:67,57336 +DA:73,21711 +DA:81,41055978 +DA:87,41055978 +DA:89,41055978 +DA:90,206574470 +DA:91,165518492 +DA:92,165518492 +DA:93,165518492 +DA:94,902563988 +DA:95,737045496 +DA:96,165518492 +DA:97,165518492 +DA:98,165518492 +DA:100,165518492 +DA:101,165518492 +DA:102,165518492 +DA:103,737045496 +DA:104,571527004 +DA:105,165518492 +DA:106,165518492 +DA:107,165518492 +DA:108,165518492 +DA:110,41055978 +DA:111,3424600 +DA:113,41055978 +DA:114,41055978 +DA:119,38554056 +DA:120,38554056 +DA:121,38554056 +DA:122,38554056 +DA:123,38554056 +DA:128,23975972 +DA:129,23975972 +DA:130,23975972 +DA:131,23975972 +DA:132,23975972 +DA:137,8464 +DA:138,8464 +DA:139,8464 +DA:145,8464 +DA:153,8464 +DA:154,8464 +DA:160,8464 +DA:161,8464 +DA:163,2060144 +DA:164,2051680 +DA:165,2051680 +DA:166,1119942 +DA:168,1119942 +DA:169,588780 +DA:171,588780 +DA:172,588780 +DA:174,588780 +DA:175,588780 +DA:176,588780 +DA:177,531162 +DA:178,531162 +DA:179,531162 +DA:180,531162 +DA:181,1119942 +DA:182,1119942 +DA:185,2051680 +DA:189,2051680 +DA:190,2051680 +DA:191,2051680 +DA:192,1021188 +DA:193,2051680 +DA:195,8464 +DA:196,2578 +DA:197,5886 +DA:198,8464 +BRDA:32,0,0,35264 +BRDA:32,0,1,551 +BRDA:32,1,2,4480 +BRDA:32,1,3,70 +BRDA:32,2,4,- +BRDA:32,2,5,- +BRDA:32,3,6,134016 +BRDA:32,3,7,2094 +BRDA:32,4,8,2688 +BRDA:32,4,9,42 +BRDA:32,5,10,37760 +BRDA:32,5,11,590 +BRDA:32,6,12,9984 +BRDA:32,6,13,156 +BRDA:90,0,0,271360 +BRDA:90,0,1,2120 +BRDA:90,1,2,519484 +BRDA:90,1,3,259742 +BRDA:90,2,4,1422848 +BRDA:90,2,5,44464 +BRDA:90,3,6,162698464 +BRDA:90,3,7,40674616 +BRDA:90,4,8,594240 +BRDA:90,4,9,74280 +BRDA:90,5,10,- +BRDA:90,5,11,- +BRDA:90,6,12,12096 +BRDA:90,6,13,756 +BRDA:94,0,0,4753920 +BRDA:94,0,1,594240 +BRDA:94,1,2,1038968 +BRDA:94,1,3,519484 +BRDA:94,2,4,193536 +BRDA:94,2,5,12096 +BRDA:94,3,6,650793856 +BRDA:94,3,7,162698464 +BRDA:94,4,8,- +BRDA:94,4,9,- +BRDA:94,5,10,45531136 +BRDA:94,5,11,1422848 +BRDA:94,6,12,34734080 +BRDA:94,6,13,271360 +BRDA:103,0,0,181440 +BRDA:103,0,1,12096 +BRDA:103,1,2,- +BRDA:103,1,3,- +BRDA:103,2,4,4159680 +BRDA:103,2,5,594240 +BRDA:103,3,6,44108288 +BRDA:103,3,7,1422848 +BRDA:103,4,8,34462720 +BRDA:103,4,9,271360 +BRDA:103,5,10,519484 +BRDA:103,5,11,519484 +BRDA:103,6,12,488095392 +BRDA:103,6,13,162698464 +BRDA:110,0,0,140 +BRDA:110,0,1,616 +BRDA:110,1,2,280 +BRDA:110,1,3,74000 +BRDA:110,2,4,322 +BRDA:110,2,5,44142 +BRDA:110,3,6,72 +BRDA:110,3,7,2048 +BRDA:110,4,8,- +BRDA:110,4,9,- +BRDA:110,5,10,3423576 +BRDA:110,5,11,37251040 +BRDA:110,6,12,210 +BRDA:110,6,13,259532 +BRDA:122,0,0,- +BRDA:122,0,1,- +BRDA:122,1,2,33673626 +BRDA:122,1,3,4880430 +BRDA:122,2,4,- +BRDA:122,2,5,- +BRDA:122,3,6,20724674 +BRDA:122,3,7,12948952 +BRDA:131,0,0,- +BRDA:131,0,1,- +BRDA:131,1,2,11202490 +BRDA:131,1,3,12773482 +BRDA:163,0,0,- +BRDA:163,0,1,- +BRDA:163,1,2,2051680 +BRDA:163,1,3,8464 +BRDA:165,0,0,- +BRDA:165,0,1,- +BRDA:165,1,2,1119942 +BRDA:165,1,3,931738 +BRDA:168,0,0,- +BRDA:168,0,1,- +BRDA:168,1,2,588780 +BRDA:168,1,3,531162 +BRDA:191,0,0,- +BRDA:191,0,1,- +BRDA:191,1,2,1021188 +BRDA:191,1,3,1030492 +BRDA:195,0,0,2578 +BRDA:195,0,1,5886 +BRDA:195,1,2,- +BRDA:195,1,3,- +BRF:26 +BRH:26 +LF:94 +LH:94 +end_of_record +SF:/home/builder/project/lib/evmone/baseline.hpp +FN:25,_ZN6evmone10BitsetSpanC2EPm +FN:28,_ZNK6evmone10BitsetSpan4testEm +FN:34,_ZNK6evmone10BitsetSpan3setEm +FN:47,_ZNK6evmone10BitsetSpan7get_refEm +FN:73,_ZN6evmone8baseline12CodeAnalysisC2ESt10unique_ptrIA_hSt14default_deleteIS3_EEmNS_10BitsetSpanE +FN:81,_ZN6evmone8baseline12CodeAnalysisC2ESt17basic_string_viewIhN4evmc11byte_traitsIhEEES6_NS_10EOF1HeaderE +FN:85,_ZNK6evmone8baseline12CodeAnalysis8raw_codeEv +FN:88,_ZNK6evmone8baseline12CodeAnalysis15executable_codeEv +FN:91,_ZNK6evmone8baseline12CodeAnalysis10eof_headerEv +FN:94,_ZNK6evmone8baseline12CodeAnalysis8eof_dataEv +FN:98,_ZNK6evmone8baseline12CodeAnalysis14check_jumpdestEm +FNDA:2751709,_ZN6evmone10BitsetSpanC2EPm +FNDA:6960598,_ZNK6evmone10BitsetSpan4testEm +FNDA:88484341,_ZNK6evmone10BitsetSpan3setEm +FNDA:95444939,_ZNK6evmone10BitsetSpan7get_refEm +FNDA:2751709,_ZN6evmone8baseline12CodeAnalysisC2ESt10unique_ptrIA_hSt14default_deleteIS3_EEmNS_10BitsetSpanE +FNDA:0,_ZN6evmone8baseline12CodeAnalysisC2ESt17basic_string_viewIhN4evmc11byte_traitsIhEEES6_NS_10EOF1HeaderE +FNDA:2751709,_ZNK6evmone8baseline12CodeAnalysis8raw_codeEv +FNDA:15207635,_ZNK6evmone8baseline12CodeAnalysis15executable_codeEv +FNDA:2751709,_ZNK6evmone8baseline12CodeAnalysis10eof_headerEv +FNDA:0,_ZNK6evmone8baseline12CodeAnalysis8eof_dataEv +FNDA:6960676,_ZNK6evmone8baseline12CodeAnalysis14check_jumpdestEm +FNF:11 +FNH:9 +DA:25,2751709 +DA:28,6960598 +DA:29,6960598 +DA:30,6960598 +DA:31,6960598 +DA:34,88484341 +DA:35,88484341 +DA:36,88484341 +DA:37,88484341 +DA:47,95444939 +DA:48,95444939 +DA:49,95444939 +DA:50,95444939 +DA:51,95444939 +DA:52,95444939 +DA:73,2751709 +DA:74,2751709 +DA:75,2751709 +DA:76,2751709 +DA:77,2751709 +DA:81,0 +DA:82,0 +DA:85,2751709 +DA:88,15207635 +DA:91,2751709 +DA:94,0 +DA:98,6960676 +DA:99,6960676 +DA:100,78 +DA:101,6960598 +DA:102,6960676 +BRDA:99,0,0,78 +BRDA:99,0,1,6960598 +BRF:2 +BRH:2 +LF:31 +LH:28 +end_of_record +SF:/home/builder/project/lib/evmone/baseline_analysis.cpp +FN:80,_ZN6evmone8baseline7analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEEb +FN:64,baseline_analysis.cpp:_ZN6evmone8baseline12_GLOBAL__N_112analyze_eof1ESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:37,baseline_analysis.cpp:_ZN6evmone8baseline12_GLOBAL__N_114analyze_legacyESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:20,baseline_analysis.cpp:_ZN6evmone8baseline12_GLOBAL__N_117analyze_jumpdestsENS_10BitsetSpanESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:2751709,_ZN6evmone8baseline7analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEEb +FNDA:0,baseline_analysis.cpp:_ZN6evmone8baseline12_GLOBAL__N_112analyze_eof1ESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:2751709,baseline_analysis.cpp:_ZN6evmone8baseline12_GLOBAL__N_114analyze_legacyESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:2751709,baseline_analysis.cpp:_ZN6evmone8baseline12_GLOBAL__N_117analyze_jumpdestsENS_10BitsetSpanESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNF:4 +FNH:3 +DA:20,2751709 +DA:24,2751709 +DA:26,377147979 +DA:27,374396270 +DA:28,374396270 +DA:29,374396270 +DA:30,64225003 +DA:31,310171267 +DA:32,88484341 +DA:33,374396270 +DA:34,2751709 +DA:37,2751709 +DA:41,2751709 +DA:43,2751709 +DA:45,2751709 +DA:46,2751709 +DA:47,2751709 +DA:48,2751709 +DA:49,2751709 +DA:51,2751709 +DA:52,2751709 +DA:53,2751709 +DA:55,2751709 +DA:56,2751709 +DA:57,2751709 +DA:58,2751709 +DA:60,2751709 +DA:61,2751709 +DA:64,0 +DA:65,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:75,0 +DA:76,0 +DA:80,2751709 +DA:81,2751709 +DA:82,0 +DA:83,2751709 +DA:84,2751709 +BRDA:26,0,0,374396270 +BRDA:26,0,1,2751709 +BRDA:29,0,0,64225003 +BRDA:29,0,1,310171267 +BRDA:31,0,0,88484341 +BRDA:31,0,1,221686926 +BRDA:81,0,0,0 +BRDA:81,0,1,2751709 +BRDA:81,1,2,- +BRDA:81,1,3,- +BRF:10 +BRH:7 +LF:41 +LH:32 +end_of_record +SF:/home/builder/project/lib/evmone/baseline_execution.cpp +FN:292,_ZN6evmone8baseline7executeERNS_2VMERK19evmc_host_interfaceP17evmc_host_context13evmc_revisionRK12evmc_messageRKNS0_12CodeAnalysisE +FN:340,_ZN6evmone8baseline7executeEP7evmc_vmPK19evmc_host_interfaceP17evmc_host_context13evmc_revisionPK12evmc_messagePKhm +FN:244,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_114dispatch_cgotoERKSt5arrayIsLm256EERNS_14ExecutionStateElPKh +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE0EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE0EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:141,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFNS_10TermResultENS_8StackTopElRNS_14ExecutionStateEENS1_8PositionERlS5_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE1EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE1EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:98,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFvNS_8StackTopEENS1_8PositionERlRNS_14ExecutionStateE +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE2EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE2EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE3EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE3EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE4EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE4EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE5EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE5EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE6EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE6EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE7EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE7EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE8EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE8EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE9EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE9EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE10EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE10EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:106,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFNS_6ResultENS_8StackTopElRNS_14ExecutionStateEENS1_8PositionERlS5_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE11EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE11EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE16EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE16EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE17EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE17EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE18EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE18EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE19EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE19EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE20EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE20EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE21EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE21EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE22EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE22EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE23EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE23EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE24EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE24EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE25EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE25EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE26EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE26EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE27EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE27EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE28EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE28EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE29EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE29EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE30EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE30EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE32EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE32EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE48EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE48EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:119,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFvNS_8StackTopERNS_14ExecutionStateEENS1_8PositionERlS4_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE49EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE49EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE50EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE50EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE51EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE51EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE52EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE52EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE53EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE53EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE54EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE54EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE55EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE55EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE56EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE56EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE57EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE57EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE58EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE58EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE59EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE59EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE60EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE60EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE61EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE61EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE62EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE62EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE63EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE63EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE64EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE64EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE65EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE65EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE66EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE66EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE67EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE67EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE68EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE68EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE69EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE69EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE70EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE70EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE71EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE71EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE72EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE72EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE73EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE73EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE74EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE74EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE80EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE80EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE81EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE81EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE82EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE82EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE83EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE83EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE84EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE84EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE85EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE85EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE86EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE86EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:127,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFPKhNS_8StackTopERNS_14ExecutionStateES3_ENS1_8PositionERlS6_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE87EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE87EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE88EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE88EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE89EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE89EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE90EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE90EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE91EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE91EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE92EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE92EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE93EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE93EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE94EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE94EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE95EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE95EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE96EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE96EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE97EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE97EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE98EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE98EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE99EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE99EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE100EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE100EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE101EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE101EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE102EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE102EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE103EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE103EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE104EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE104EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE105EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE105EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE106EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE106EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE107EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE107EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE108EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE108EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE109EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE109EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE110EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE110EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE111EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE111EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE112EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE112EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE113EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE113EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE114EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE114EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE115EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE115EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE116EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE116EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE117EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE117EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE118EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE118EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE119EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE119EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE120EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE120EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE121EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE121EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE122EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE122EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE123EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE123EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE124EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE124EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE125EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE125EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE126EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE126EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE127EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE127EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE128EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE128EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE129EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE129EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE130EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE130EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE131EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE131EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE132EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE132EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE133EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE133EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE134EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE134EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE135EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE135EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE136EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE136EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE137EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE137EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE138EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE138EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE139EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE139EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE140EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE140EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE141EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE141EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE142EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE142EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE143EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE143EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE144EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE144EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE145EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE145EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE146EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE146EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE147EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE147EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE148EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE148EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE149EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE149EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE150EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE150EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE151EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE151EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE152EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE152EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE153EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE153EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE154EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE154EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE155EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE155EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE156EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE156EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE157EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE157EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE158EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE158EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE159EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE159EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE160EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE160EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE161EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE161EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE162EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE162EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE163EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE163EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE164EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE164EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE208EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE208EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE209EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE209EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE210EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE210EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE211EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE211EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE224EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE224EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE225EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE225EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE226EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE226EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE227EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE227EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE228EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE228EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE229EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE229EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE230EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE230EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:134,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFPKhNS_8StackTopES3_ENS1_8PositionERlRNS_14ExecutionStateE +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE231EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE231EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE232EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE232EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE236EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE236EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFNS_6ResultENS_8StackTopElRNS_14ExecutionStateERPKhENS1_8PositionERlS5_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE237EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE237EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE238EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE238EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:165,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFNS_10TermResultENS_8StackTopElRNS_14ExecutionStateEPKhENS1_8PositionERlS5_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE240EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE240EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE241EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE241EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE242EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE242EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE243EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE243EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE244EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE244EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE245EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE245EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE247EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE247EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE248EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE248EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE249EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE249EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE250EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE250EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE251EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE251EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE253EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE253EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE254EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE254EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:176,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE255EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:47,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE255EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:192,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_18dispatchILb1EEElRKSt5arrayIsLm256EERNS_14ExecutionStateElPKhPNS_6TracerE +FN:192,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_18dispatchILb0EEElRKSt5arrayIsLm256EERNS_14ExecutionStateElPKhPNS_6TracerE +FNDA:2751709,_ZN6evmone8baseline7executeERNS_2VMERK19evmc_host_interfaceP17evmc_host_context13evmc_revisionRK12evmc_messageRKNS0_12CodeAnalysisE +FNDA:2751709,_ZN6evmone8baseline7executeEP7evmc_vmPK19evmc_host_interfaceP17evmc_host_context13evmc_revisionPK12evmc_messagePKhm +FNDA:2751709,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_114dispatch_cgotoERKSt5arrayIsLm256EERNS_14ExecutionStateElPKh +FNDA:1406674,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE0EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1406674,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE0EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1967689,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFNS_10TermResultENS_8StackTopElRNS_14ExecutionStateEENS1_8PositionERlS5_ +FNDA:15691155,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE1EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:15691155,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE1EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:72444625,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFvNS_8StackTopEENS1_8PositionERlRNS_14ExecutionStateE +FNDA:236950,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE2EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:236950,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE2EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3127763,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE3EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3127763,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE3EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:46616,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE4EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:46616,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE4EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:4038,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE5EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:4038,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE5EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:155025,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE6EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:155025,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE6EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3532,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE7EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3532,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE7EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2018,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE8EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2018,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE8EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2292,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE9EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2292,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE9EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:37190,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE10EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:37190,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE10EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:56974659,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFNS_6ResultENS_8StackTopElRNS_14ExecutionStateEENS1_8PositionERlS5_ +FNDA:2548,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE11EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2548,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE11EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2941174,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE16EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2941174,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE16EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:394215,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE17EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:394215,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE17EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:6530,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE18EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:6530,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE18EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:6170,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE19EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:6170,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE19EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:825139,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE20EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:825139,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE20EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:5107102,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE21EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:5107102,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE21EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:128373,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE22EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:128373,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE22EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:51800,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE23EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:51800,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE23EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1634,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE24EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1634,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE24EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:70330,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE25EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:70330,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE25EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:78260,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE26EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:78260,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE26EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3468647,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE27EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3468647,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE27EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:18691,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE28EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:18691,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE28EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:8339,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE29EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:8339,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE29EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3288,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE30EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3288,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE30EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:15555,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE32EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:15555,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE32EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:56902,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE48EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:56902,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE48EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:4717451,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFvNS_8StackTopERNS_14ExecutionStateEENS1_8PositionERlS4_ +FNDA:7861,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE49EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:7861,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE49EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:23616,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE50EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:23616,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE50EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:269597,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE51EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:269597,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE51EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:24906,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE52EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:24906,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE52EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1822707,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE53EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1822707,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE53EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:107557,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE54EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:107557,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE54EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:121294,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE55EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:121294,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE55EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:21250,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE56EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:21250,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE56EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:23268,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE57EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:23268,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE57EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:13412,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE58EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:13412,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE58EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:470980,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE59EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:470980,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE59EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:12882,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE60EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:12882,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE60EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:58653,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE61EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:58653,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE61EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:8977,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE62EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:8977,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE62EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3503,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE63EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3503,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE63EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:69796,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE64EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:69796,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE64EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:14924,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE65EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:14924,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE65EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:147101,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE66EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:147101,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE66EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:133379,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE67EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:133379,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE67EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:13782,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE68EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:13782,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE68EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:15246,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE69EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:15246,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE69EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:652,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE70EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:652,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE70EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1764,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE71EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1764,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE71EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:926,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE72EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:926,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE72EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3522,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE73EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3522,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE73EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:13428,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE74EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:13428,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE74EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:4526437,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE80EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:4526437,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE80EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:11969026,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE81EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:11969026,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE81EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:8580978,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE82EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:8580978,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE82EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:155548,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE83EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:155548,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE83EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1014967,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE84EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1014967,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE84EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:4690435,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE85EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:4690435,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE85EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:5332136,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE86EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:5332136,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE86EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:109114373,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFPKhNS_8StackTopERNS_14ExecutionStateES3_ENS1_8PositionERlS6_ +FNDA:6931154,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE87EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:6931154,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE87EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:5498410,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE88EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:5498410,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE88EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:16596,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE89EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:16596,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE89EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:16581265,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE90EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:16581265,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE90EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:23873842,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE91EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:23873842,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE91EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1890843,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE92EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1890843,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE92EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:9080014,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE93EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:9080014,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE93EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2245,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE94EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2245,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE94EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1157264,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE95EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1157264,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE95EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:76204629,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE96EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:76204629,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE96EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:10043405,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE97EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:10043405,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE97EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1327055,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE98EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1327055,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE98EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:119400,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE99EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:119400,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE99EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:58207,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE100EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:58207,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE100EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:111196,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE101EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:111196,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE101EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:46652,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE102EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:46652,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE102EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:47340,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE103EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:47340,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE103EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:40406,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE104EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:40406,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE104EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:34722,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE105EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:34722,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE105EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:28844,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE106EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:28844,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE106EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:40496,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE107EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:40496,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE107EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:38807,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE108EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:38807,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE108EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:34124,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE109EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:34124,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE109EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:29056,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE110EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:29056,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE110EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:48524,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE111EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:48524,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE111EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:21254,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE112EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:21254,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE112EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:66230,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE113EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:66230,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE113EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:30732,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE114EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:30732,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE114EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2238546,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE115EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2238546,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE115EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:45012,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE116EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:45012,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE116EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:37374,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE117EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:37374,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE117EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:37961,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE118EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:37961,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE118EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:31832,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE119EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:31832,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE119EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:30162,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE120EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:30162,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE120EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:41061,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE121EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:41061,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE121EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:42094,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE122EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:42094,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE122EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:28734,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE123EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:28734,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE123EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:34402,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE124EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:34402,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE124EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:24972,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE125EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:24972,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE125EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:93288,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE126EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:93288,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE126EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:301134,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE127EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:301134,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE127EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:5878371,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE128EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:5878371,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE128EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1256499,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE129EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1256499,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE129EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:617183,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE130EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:617183,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE130EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:291970,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE131EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:291970,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE131EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:126874,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE132EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:126874,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE132EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:64904,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE133EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:64904,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE133EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:47832,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE134EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:47832,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE134EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:443802,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE135EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:443802,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE135EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:27016,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE136EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:27016,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE136EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:53318,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE137EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:53318,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE137EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:24970,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE138EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:24970,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE138EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:16598,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE139EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:16598,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE139EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:30584,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE140EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:30584,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE140EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:15046,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE141EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:15046,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE141EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:25232,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE142EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:25232,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE142EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:17384,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE143EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:17384,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE143EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:722971,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE144EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:722971,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE144EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:402714,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE145EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:402714,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE145EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:271324,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE146EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:271324,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE146EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:87302,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE147EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:87302,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE147EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:36994,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE148EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:36994,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE148EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:8232,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE149EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:8232,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE149EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3820,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE150EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3820,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE150EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:7730,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE151EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:7730,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE151EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:5860,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE152EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:5860,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE152EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2246,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE153EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2246,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE153EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2676,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE154EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2676,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE154EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:6732,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE155EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:6732,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE155EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:4186,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE156EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:4186,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE156EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3602,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE157EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3602,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE157EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2352,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE158EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2352,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE158EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2358,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE159EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2358,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE159EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:9386,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE160EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:9386,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE160EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:8225,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE161EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:8225,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE161EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:4609,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE162EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:4609,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE162EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:6785,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE163EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:6785,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE163EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:767,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE164EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:767,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE164EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE208EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE208EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE209EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE209EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE210EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE210EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE211EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE211EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE224EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE224EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE225EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE225EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE226EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE226EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:482,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE227EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:482,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE227EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE228EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE228EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE229EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE229EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE230EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE230EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:0,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFPKhNS_8StackTopES3_ENS1_8PositionERlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE231EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE231EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE232EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE232EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE236EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE236EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:0,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFNS_6ResultENS_8StackTopElRNS_14ExecutionStateERPKhENS1_8PositionERlS5_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE237EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE237EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE238EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE238EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:0,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFNS_10TermResultENS_8StackTopElRNS_14ExecutionStateEPKhENS1_8PositionERlS5_ +FNDA:24083,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE240EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:24083,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE240EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:875924,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE241EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:875924,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE241EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:83114,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE242EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:83114,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE242EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:526000,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE243EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:526000,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE243EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:101455,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE244EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:101455,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE244EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:27081,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE245EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:27081,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE245EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE247EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE247EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE248EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE248EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:488,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE249EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:488,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE249EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3064533,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE250EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3064533,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE250EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE251EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:476,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE251EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:25416,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE253EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:25416,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE253EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1962,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE254EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1962,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE254EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:420946,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE255EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:420946,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE255EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:0,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_18dispatchILb1EEElRKSt5arrayIsLm256EERNS_14ExecutionStateElPKhPNS_6TracerE +FNDA:0,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_18dispatchILb0EEElRKSt5arrayIsLm256EERNS_14ExecutionStateElPKhPNS_6TracerE +FNF:14 +FNH:10 +DA:20,245660250 +DA:47,245660250 +DA:48,245660250 +DA:49,245660250 +DA:50,245660250 +DA:52,245660250 +DA:54,21835453 +DA:55,21835453 +DA:59,21835453 +DA:60,15509 +DA:61,21835453 +DA:66,124467292 +DA:67,124467292 +DA:68,124467292 +DA:69,124467292 +DA:70,1230 +DA:71,124467292 +DA:73,104845201 +DA:75,104845201 +DA:76,104845201 +DA:77,2420 +DA:78,104845201 +DA:80,245660250 +DA:81,422294 +DA:83,245237956 +DA:84,245660250 +DA:98,72444625 +DA:99,72444625 +DA:100,72444625 +DA:101,72444625 +DA:106,56974659 +DA:107,56974659 +DA:108,56974659 +DA:109,56974659 +DA:110,298421 +DA:111,298421 +DA:112,298421 +DA:113,298421 +DA:114,56676238 +DA:115,56974659 +DA:119,4717451 +DA:120,4717451 +DA:121,4717451 +DA:122,4717451 +DA:127,109114373 +DA:128,109114373 +DA:129,109114373 +DA:134,0 +DA:135,0 +DA:136,0 +DA:141,1967689 +DA:142,1967689 +DA:143,1967689 +DA:144,1967689 +DA:145,1967689 +DA:146,1967689 +DA:151,0 +DA:152,0 +DA:153,0 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:158,0 +DA:159,0 +DA:160,0 +DA:165,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:176,245660250 +DA:177,245660250 +DA:178,245660250 +DA:179,441453 +DA:180,441453 +DA:181,441453 +DA:182,441453 +DA:183,245218797 +DA:184,245218797 +DA:185,245218797 +DA:186,245660250 +DA:192,0 +DA:193,0 +DA:196,0 +DA:198,0 +DA:199,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:230,0 +DA:231,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:244,2751709 +DA:245,2751709 +DA:247,2751709 +DA:248,467790530 +DA:249,2751709 +DA:250,236646974 +DA:251,2751709 +DA:252,2751709 +DA:253,2751709 +DA:254,2751709 +DA:255,2751709 +DA:256,2751709 +DA:258,2751709 +DA:261,2751709 +DA:263,2751709 +DA:265,2751709 +DA:266,245660250 +DA:267,245660250 +DA:268,245660250 +DA:269,245660250 +DA:270,2710673 +DA:271,2710673 +DA:272,245660250 +DA:273,245660250 +DA:276,242949577 +DA:277,242949577 +DA:278,245660250 +DA:280,488609827 +DA:281,488609827 +DA:283,488609827 +DA:284,41036 +DA:285,41036 +DA:286,488609827 +DA:292,2751709 +DA:293,2751709 +DA:294,2751709 +DA:295,2751709 +DA:297,2751709 +DA:298,2751709 +DA:300,2751709 +DA:302,2751709 +DA:304,2751709 +DA:305,2751709 +DA:306,0 +DA:307,0 +DA:308,0 +DA:309,0 +DA:310,2751709 +DA:311,2751709 +DA:312,2751709 +DA:313,2751709 +DA:314,2751709 +DA:315,0 +DA:316,0 +DA:317,0 +DA:318,2751709 +DA:320,2751709 +DA:321,2751709 +DA:323,2751709 +DA:324,2751709 +DA:325,2751709 +DA:326,0 +DA:327,0 +DA:328,2751709 +DA:329,2751709 +DA:330,2751709 +DA:332,2751709 +DA:333,0 +DA:335,2751709 +DA:336,2751709 +DA:340,2751709 +DA:341,2751709 +DA:342,2751709 +DA:343,2751709 +DA:348,2751709 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:356,2751709 +DA:357,2751709 +DA:358,2751709 +BRDA:59,0,0,19 +BRDA:59,0,1,101436 +BRDA:59,1,2,476 +BRDA:59,1,3,0 +BRDA:59,2,4,476 +BRDA:59,2,5,0 +BRDA:59,3,6,662 +BRDA:59,3,7,12766 +BRDA:59,4,8,658 +BRDA:59,4,9,2864 +BRDA:59,5,10,0 +BRDA:59,5,11,875924 +BRDA:59,6,12,0 +BRDA:59,6,13,83114 +BRDA:59,7,14,406 +BRDA:59,7,15,520 +BRDA:59,8,16,85 +BRDA:59,8,17,3468562 +BRDA:59,9,18,83 +BRDA:59,9,19,18608 +BRDA:59,10,20,584 +BRDA:59,10,21,1156680 +BRDA:59,11,22,238 +BRDA:59,11,23,1526 +BRDA:59,12,24,83 +BRDA:59,12,25,26998 +BRDA:59,13,26,83 +BRDA:59,13,27,8256 +BRDA:59,14,28,476 +BRDA:59,14,29,0 +BRDA:59,15,30,238 +BRDA:59,15,31,414 +BRDA:59,16,32,454 +BRDA:59,16,33,2834 +BRDA:59,17,34,476 +BRDA:59,17,35,0 +BRDA:59,18,36,488 +BRDA:59,18,37,0 +BRDA:59,19,38,482 +BRDA:59,19,39,0 +BRDA:59,20,40,476 +BRDA:59,20,41,0 +BRDA:59,21,42,476 +BRDA:59,21,43,0 +BRDA:59,22,44,658 +BRDA:59,22,45,1890185 +BRDA:59,23,46,476 +BRDA:59,23,47,0 +BRDA:59,24,48,476 +BRDA:59,24,49,0 +BRDA:59,25,50,476 +BRDA:59,25,51,0 +BRDA:59,26,52,476 +BRDA:59,26,53,0 +BRDA:59,27,54,658 +BRDA:59,27,55,9079356 +BRDA:59,28,56,476 +BRDA:59,28,57,0 +BRDA:59,29,58,0 +BRDA:59,29,59,470980 +BRDA:59,30,60,476 +BRDA:59,30,61,0 +BRDA:59,31,62,0 +BRDA:59,31,63,1014967 +BRDA:59,32,64,476 +BRDA:59,32,65,0 +BRDA:59,33,66,476 +BRDA:59,33,67,0 +BRDA:59,34,68,476 +BRDA:59,34,69,0 +BRDA:59,35,70,658 +BRDA:59,35,71,1587 +BRDA:59,36,72,476 +BRDA:59,36,73,0 +BRDA:59,37,74,476 +BRDA:59,37,75,0 +BRDA:59,38,76,0 +BRDA:59,38,77,12882 +BRDA:59,39,78,80 +BRDA:59,39,79,8897 +BRDA:59,40,80,45 +BRDA:59,40,81,25371 +BRDA:59,41,82,80 +BRDA:59,41,83,58573 +BRDA:59,42,84,0 +BRDA:59,42,85,420946 +BRDA:59,43,86,476 +BRDA:59,43,87,0 +BRDA:59,44,88,0 +BRDA:59,44,89,7861 +BRDA:59,45,90,45 +BRDA:59,45,91,3064488 +BRDA:59,46,92,154 +BRDA:59,46,93,3349 +BRDA:69,0,0,30 +BRDA:69,0,1,29026 +BRDA:69,1,2,30 +BRDA:69,1,3,44982 +BRDA:69,2,4,30 +BRDA:69,2,5,58177 +BRDA:69,3,6,30 +BRDA:69,3,7,34372 +BRDA:69,4,8,6 +BRDA:69,4,9,25226 +BRDA:69,5,10,6 +BRDA:69,5,11,16590 +BRDA:69,6,12,30 +BRDA:69,6,13,24942 +BRDA:69,7,14,6 +BRDA:69,7,15,1256493 +BRDA:69,8,16,30 +BRDA:69,8,17,47310 +BRDA:69,9,18,0 +BRDA:69,9,19,476 +BRDA:69,10,20,30 +BRDA:69,10,21,34094 +BRDA:69,11,22,6 +BRDA:69,11,23,5878365 +BRDA:69,12,24,6 +BRDA:69,12,25,13776 +BRDA:69,13,26,30 +BRDA:69,13,27,93258 +BRDA:69,14,28,6 +BRDA:69,14,29,107551 +BRDA:69,15,30,6 +BRDA:69,15,31,15040 +BRDA:69,16,32,30 +BRDA:69,16,33,301104 +BRDA:69,17,34,30 +BRDA:69,17,35,30132 +BRDA:69,18,36,0 +BRDA:69,18,37,476 +BRDA:69,19,38,22 +BRDA:69,19,39,5498388 +BRDA:69,20,40,30 +BRDA:69,20,41,37931 +BRDA:69,21,42,30 +BRDA:69,21,43,46622 +BRDA:69,22,44,30 +BRDA:69,22,45,66200 +BRDA:69,23,46,30 +BRDA:69,23,47,37344 +BRDA:69,24,48,30 +BRDA:69,24,49,31802 +BRDA:69,25,50,30 +BRDA:69,25,51,111166 +BRDA:69,26,52,6 +BRDA:69,26,53,13406 +BRDA:69,27,54,30 +BRDA:69,27,55,28704 +BRDA:69,28,56,30 +BRDA:69,28,57,21224 +BRDA:69,29,58,6 +BRDA:69,29,59,21244 +BRDA:69,30,60,30 +BRDA:69,30,61,41031 +BRDA:69,31,62,0 +BRDA:69,31,63,58653 +BRDA:69,32,64,0 +BRDA:69,32,65,476 +BRDA:69,33,66,30 +BRDA:69,33,67,48494 +BRDA:69,34,68,30 +BRDA:69,34,69,42064 +BRDA:69,35,70,6 +BRDA:69,35,71,17378 +BRDA:69,36,72,30 +BRDA:69,36,73,1327025 +BRDA:69,37,74,6 +BRDA:69,37,75,23610 +BRDA:69,38,76,30 +BRDA:69,38,77,28814 +BRDA:69,39,78,0 +BRDA:69,39,79,1764 +BRDA:69,40,80,6 +BRDA:69,40,81,64898 +BRDA:69,41,82,6 +BRDA:69,41,83,24964 +BRDA:69,42,84,30 +BRDA:69,42,85,10043375 +BRDA:69,43,86,6 +BRDA:69,43,87,147095 +BRDA:69,44,88,6 +BRDA:69,44,89,47826 +BRDA:69,45,90,30 +BRDA:69,45,91,119370 +BRDA:69,46,92,6 +BRDA:69,46,93,14918 +BRDA:69,47,94,0 +BRDA:69,47,95,652 +BRDA:69,48,96,6 +BRDA:69,48,97,53312 +BRDA:69,49,98,6 +BRDA:69,49,99,443796 +BRDA:69,50,100,6 +BRDA:69,50,101,133373 +BRDA:69,51,102,30 +BRDA:69,51,103,34692 +BRDA:69,52,104,6 +BRDA:69,52,105,15240 +BRDA:69,53,106,6 +BRDA:69,53,107,27010 +BRDA:69,54,108,6 +BRDA:69,54,109,56896 +BRDA:69,55,110,30 +BRDA:69,55,111,30702 +BRDA:69,56,112,30 +BRDA:69,56,113,40466 +BRDA:69,57,114,6 +BRDA:69,57,115,30578 +BRDA:69,58,116,30 +BRDA:69,58,117,38777 +BRDA:69,59,118,30 +BRDA:69,59,119,2238516 +BRDA:69,60,120,6 +BRDA:69,60,121,13422 +BRDA:69,61,122,6 +BRDA:69,61,123,617177 +BRDA:69,62,124,6 +BRDA:69,62,125,24900 +BRDA:69,63,126,32 +BRDA:69,63,127,1157232 +BRDA:69,64,128,6 +BRDA:69,64,129,16581259 +BRDA:69,65,130,6 +BRDA:69,65,131,291964 +BRDA:69,66,132,30 +BRDA:69,66,133,40376 +BRDA:69,67,134,6 +BRDA:69,67,135,16592 +BRDA:69,68,136,60 +BRDA:69,68,137,76204569 +BRDA:69,69,138,0 +BRDA:69,69,139,926 +BRDA:69,70,140,6 +BRDA:69,70,141,126868 +BRDA:69,71,142,6 +BRDA:69,71,143,269591 +BRDA:76,0,0,18 +BRDA:76,0,1,3514 +BRDA:76,1,2,24 +BRDA:76,1,3,7706 +BRDA:76,2,4,12 +BRDA:76,2,5,2233 +BRDA:76,3,6,24 +BRDA:76,3,7,3578 +BRDA:76,4,8,24 +BRDA:76,4,9,1890819 +BRDA:76,5,10,18 +BRDA:76,5,11,155007 +BRDA:76,6,12,24 +BRDA:76,6,13,4014 +BRDA:76,7,14,48 +BRDA:76,7,15,9079966 +BRDA:76,8,16,30 +BRDA:76,8,17,3790 +BRDA:76,9,18,18 +BRDA:76,9,19,46598 +BRDA:76,10,20,18 +BRDA:76,10,21,3127745 +BRDA:76,11,22,24 +BRDA:76,11,23,8208 +BRDA:76,12,24,24 +BRDA:76,12,25,236926 +BRDA:76,13,26,334 +BRDA:76,13,27,15690821 +BRDA:76,14,28,24 +BRDA:76,14,29,36970 +BRDA:76,15,30,24 +BRDA:76,15,31,7837 +BRDA:76,16,32,18 +BRDA:76,16,33,1616 +BRDA:76,17,34,6 +BRDA:76,17,35,3516 +BRDA:76,18,36,24 +BRDA:76,18,37,70306 +BRDA:76,19,38,18 +BRDA:76,19,39,78242 +BRDA:76,20,40,12 +BRDA:76,20,41,3468635 +BRDA:76,21,42,12 +BRDA:76,21,43,18679 +BRDA:76,22,44,12 +BRDA:76,22,45,8327 +BRDA:76,23,46,4 +BRDA:76,23,47,3284 +BRDA:76,24,48,30 +BRDA:76,24,49,15525 +BRDA:76,25,50,18 +BRDA:76,25,51,51782 +BRDA:76,26,52,18 +BRDA:76,26,53,69778 +BRDA:76,27,54,12 +BRDA:76,27,55,3491 +BRDA:76,28,56,18 +BRDA:76,28,57,1822689 +BRDA:76,29,58,6 +BRDA:76,29,59,8971 +BRDA:76,30,60,48 +BRDA:76,30,61,121246 +BRDA:76,31,62,24 +BRDA:76,31,63,23244 +BRDA:76,32,64,18 +BRDA:76,32,65,12864 +BRDA:76,33,66,18 +BRDA:76,33,67,470962 +BRDA:76,34,68,18 +BRDA:76,34,69,6512 +BRDA:76,35,70,18 +BRDA:76,35,71,2274 +BRDA:76,36,72,24 +BRDA:76,36,73,37166 +BRDA:76,37,74,12 +BRDA:76,37,75,6931142 +BRDA:76,38,76,24 +BRDA:76,38,77,2524 +BRDA:76,39,78,24 +BRDA:76,39,79,5332112 +BRDA:76,40,80,34 +BRDA:76,40,81,2941140 +BRDA:76,41,82,18 +BRDA:76,41,83,4690417 +BRDA:76,42,84,18 +BRDA:76,42,85,394197 +BRDA:76,43,86,18 +BRDA:76,43,87,1014949 +BRDA:76,44,88,18 +BRDA:76,44,89,2000 +BRDA:76,45,90,18 +BRDA:76,45,91,6152 +BRDA:76,46,92,18 +BRDA:76,46,93,155530 +BRDA:76,47,94,24 +BRDA:76,47,95,825115 +BRDA:76,48,96,18 +BRDA:76,48,97,8580960 +BRDA:76,49,98,18 +BRDA:76,49,99,5107084 +BRDA:76,50,100,18 +BRDA:76,50,101,11969008 +BRDA:76,51,102,18 +BRDA:76,51,103,128355 +BRDA:76,52,104,48 +BRDA:76,52,105,4526389 +BRDA:76,53,106,24 +BRDA:76,53,107,291946 +BRDA:76,54,108,0 +BRDA:76,54,109,476 +BRDA:76,55,110,24 +BRDA:76,55,111,47808 +BRDA:76,56,112,12 +BRDA:76,56,113,27069 +BRDA:76,57,114,30 +BRDA:76,57,115,101425 +BRDA:76,58,116,18 +BRDA:76,58,117,64886 +BRDA:76,59,118,18 +BRDA:76,59,119,525982 +BRDA:76,60,120,42 +BRDA:76,60,121,126832 +BRDA:76,61,122,42 +BRDA:76,61,123,83072 +BRDA:76,62,124,24 +BRDA:76,62,125,875900 +BRDA:76,63,126,24 +BRDA:76,63,127,443778 +BRDA:76,64,128,24 +BRDA:76,64,129,24059 +BRDA:76,65,130,18 +BRDA:76,65,131,617165 +BRDA:76,66,132,0 +BRDA:76,66,133,476 +BRDA:76,67,134,0 +BRDA:76,67,135,476 +BRDA:76,68,136,0 +BRDA:76,68,137,476 +BRDA:76,69,138,18 +BRDA:76,69,139,5878353 +BRDA:76,70,140,0 +BRDA:76,70,141,476 +BRDA:76,71,142,0 +BRDA:76,71,143,476 +BRDA:76,72,144,0 +BRDA:76,72,145,476 +BRDA:76,73,146,36 +BRDA:76,73,147,16562 +BRDA:76,74,148,24 +BRDA:76,74,149,87278 +BRDA:76,75,150,24 +BRDA:76,75,151,271300 +BRDA:76,76,152,18 +BRDA:76,76,153,402696 +BRDA:76,77,154,18 +BRDA:76,77,155,722953 +BRDA:76,78,156,36 +BRDA:76,78,157,17348 +BRDA:76,79,158,36 +BRDA:76,79,159,25196 +BRDA:76,80,160,30 +BRDA:76,80,161,15016 +BRDA:76,81,162,18 +BRDA:76,81,163,30566 +BRDA:76,82,164,12 +BRDA:76,82,165,420934 +BRDA:76,83,166,24 +BRDA:76,83,167,1256475 +BRDA:76,84,168,24 +BRDA:76,84,169,24946 +BRDA:76,85,170,50 +BRDA:76,85,171,25366 +BRDA:76,86,172,0 +BRDA:76,86,173,476 +BRDA:76,87,174,24 +BRDA:76,87,175,53294 +BRDA:76,88,176,12 +BRDA:76,88,177,3064521 +BRDA:76,89,178,36 +BRDA:76,89,179,26980 +BRDA:76,90,180,0 +BRDA:76,90,181,488 +BRDA:76,91,182,0 +BRDA:76,91,183,476 +BRDA:76,92,184,24 +BRDA:76,92,185,5836 +BRDA:76,93,186,18 +BRDA:76,93,187,2340 +BRDA:76,94,188,0 +BRDA:76,94,189,476 +BRDA:76,95,190,18 +BRDA:76,95,191,9368 +BRDA:76,96,192,18 +BRDA:76,96,193,2334 +BRDA:76,97,194,18 +BRDA:76,97,195,8207 +BRDA:76,98,196,30 +BRDA:76,98,197,4579 +BRDA:76,99,198,18 +BRDA:76,99,199,4168 +BRDA:76,100,200,18 +BRDA:76,100,201,6767 +BRDA:76,101,202,24 +BRDA:76,101,203,6708 +BRDA:76,102,204,24 +BRDA:76,102,205,2652 +BRDA:76,103,206,36 +BRDA:76,103,207,731 +BRDA:76,104,208,24 +BRDA:76,104,209,2222 +BRDA:80,0,0,0 +BRDA:80,0,1,402714 +BRDA:80,1,2,24 +BRDA:80,1,3,12858 +BRDA:80,2,4,0 +BRDA:80,2,5,722971 +BRDA:80,3,6,0 +BRDA:80,3,7,28844 +BRDA:80,4,8,0 +BRDA:80,4,9,133379 +BRDA:80,5,10,0 +BRDA:80,5,11,46652 +BRDA:80,6,12,0 +BRDA:80,6,13,27016 +BRDA:80,7,14,18 +BRDA:80,7,15,1157246 +BRDA:80,8,16,0 +BRDA:80,8,17,13782 +BRDA:80,9,18,0 +BRDA:80,9,19,107557 +BRDA:80,10,20,3666 +BRDA:80,10,21,76200963 +BRDA:80,11,22,0 +BRDA:80,11,23,443802 +BRDA:80,12,24,0 +BRDA:80,12,25,15246 +BRDA:80,13,26,0 +BRDA:80,13,27,40496 +BRDA:80,14,28,0 +BRDA:80,14,29,58207 +BRDA:80,15,30,402 +BRDA:80,15,31,470578 +BRDA:80,16,32,0 +BRDA:80,16,33,271324 +BRDA:80,17,34,48 +BRDA:80,17,35,2197 +BRDA:80,18,36,0 +BRDA:80,18,37,47832 +BRDA:80,19,38,0 +BRDA:80,19,39,34124 +BRDA:80,20,40,0 +BRDA:80,20,41,3503 +BRDA:80,21,42,0 +BRDA:80,21,43,119400 +BRDA:80,22,44,0 +BRDA:80,22,45,25232 +BRDA:80,23,46,4 +BRDA:80,23,47,47336 +BRDA:80,24,48,0 +BRDA:80,24,49,15046 +BRDA:80,25,50,0 +BRDA:80,25,51,17384 +BRDA:80,26,52,0 +BRDA:80,26,53,8977 +BRDA:80,27,54,0 +BRDA:80,27,55,30584 +BRDA:80,28,56,6 +BRDA:80,28,57,1327049 +BRDA:80,29,58,0 +BRDA:80,29,59,16598 +BRDA:80,30,60,0 +BRDA:80,30,61,58653 +BRDA:80,31,62,0 +BRDA:80,31,63,40406 +BRDA:80,32,64,0 +BRDA:80,32,65,69796 +BRDA:80,33,66,0 +BRDA:80,33,67,24970 +BRDA:80,34,68,120 +BRDA:80,34,69,10043285 +BRDA:80,35,70,0 +BRDA:80,35,71,14924 +BRDA:80,36,72,0 +BRDA:80,36,73,34722 +BRDA:80,37,74,4 +BRDA:80,37,75,53314 +BRDA:80,38,76,0 +BRDA:80,38,77,147101 +BRDA:80,39,78,0 +BRDA:80,39,79,4690435 +BRDA:80,40,80,0 +BRDA:80,40,81,301134 +BRDA:80,41,82,0 +BRDA:80,41,83,93288 +BRDA:80,42,84,50 +BRDA:80,42,85,8580928 +BRDA:80,43,86,0 +BRDA:80,43,87,24972 +BRDA:80,44,88,4 +BRDA:80,44,89,34398 +BRDA:80,45,90,0 +BRDA:80,45,91,155548 +BRDA:80,46,92,0 +BRDA:80,46,93,28734 +BRDA:80,47,94,0 +BRDA:80,47,95,42094 +BRDA:80,48,96,0 +BRDA:80,48,97,41061 +BRDA:80,49,98,4 +BRDA:80,49,99,1014963 +BRDA:80,50,100,0 +BRDA:80,50,101,30162 +BRDA:80,51,102,6 +BRDA:80,51,103,11969020 +BRDA:80,52,104,0 +BRDA:80,52,105,30732 +BRDA:80,53,106,0 +BRDA:80,53,107,31832 +BRDA:80,54,108,60 +BRDA:80,54,109,5332076 +BRDA:80,55,110,0 +BRDA:80,55,111,37961 +BRDA:80,56,112,0 +BRDA:80,56,113,16596 +BRDA:80,57,114,8 +BRDA:80,57,115,6931146 +BRDA:80,58,116,0 +BRDA:80,58,117,37374 +BRDA:80,59,118,0 +BRDA:80,59,119,45012 +BRDA:80,60,120,40 +BRDA:80,60,121,5498370 +BRDA:80,61,122,22 +BRDA:80,61,123,2238524 +BRDA:80,62,124,0 +BRDA:80,62,125,617183 +BRDA:80,63,126,0 +BRDA:80,63,127,652 +BRDA:80,64,128,0 +BRDA:80,64,129,64904 +BRDA:80,65,130,30 +BRDA:80,65,131,9079984 +BRDA:80,66,132,0 +BRDA:80,66,133,1764 +BRDA:80,67,134,0 +BRDA:80,67,135,126874 +BRDA:80,68,136,0 +BRDA:80,68,137,29056 +BRDA:80,69,138,0 +BRDA:80,69,139,291970 +BRDA:80,70,140,0 +BRDA:80,70,141,48524 +BRDA:80,71,142,0 +BRDA:80,71,143,926 +BRDA:80,72,144,0 +BRDA:80,72,145,1890843 +BRDA:80,73,146,0 +BRDA:80,73,147,38807 +BRDA:80,74,148,0 +BRDA:80,74,149,3522 +BRDA:80,75,150,0 +BRDA:80,75,151,21254 +BRDA:80,76,152,0 +BRDA:80,76,153,1256499 +BRDA:80,77,154,0 +BRDA:80,77,155,66230 +BRDA:80,78,156,6 +BRDA:80,78,157,13422 +BRDA:80,79,158,0 +BRDA:80,79,159,111196 +BRDA:80,80,160,0 +BRDA:80,80,161,5878371 +BRDA:80,81,162,80 +BRDA:80,81,163,4526357 +BRDA:80,82,164,14 +BRDA:80,82,165,23873828 +BRDA:80,83,166,10 +BRDA:80,83,167,16581255 +BRDA:80,84,168,0 +BRDA:80,84,169,87302 +BRDA:80,85,170,2100 +BRDA:80,85,171,21983 +BRDA:80,86,172,12 +BRDA:80,86,173,236938 +BRDA:80,87,174,0 +BRDA:80,87,175,825139 +BRDA:80,88,176,70 +BRDA:80,88,177,875854 +BRDA:80,89,178,38 +BRDA:80,89,179,15691117 +BRDA:80,90,180,6 +BRDA:80,90,181,5107096 +BRDA:80,91,182,0 +BRDA:80,91,183,482 +BRDA:80,92,184,86 +BRDA:80,92,185,83028 +BRDA:80,93,186,0 +BRDA:80,93,187,128373 +BRDA:80,94,188,0 +BRDA:80,94,189,1406674 +BRDA:80,95,190,0 +BRDA:80,95,191,6170 +BRDA:80,96,192,0 +BRDA:80,96,193,51800 +BRDA:80,97,194,0 +BRDA:80,97,195,526000 +BRDA:80,98,196,0 +BRDA:80,98,197,476 +BRDA:80,99,198,0 +BRDA:80,99,199,1634 +BRDA:80,100,200,66 +BRDA:80,100,201,101389 +BRDA:80,101,202,0 +BRDA:80,101,203,70330 +BRDA:80,102,204,0 +BRDA:80,102,205,36994 +BRDA:80,103,206,0 +BRDA:80,103,207,476 +BRDA:80,104,208,0 +BRDA:80,104,209,78260 +BRDA:80,105,210,1966 +BRDA:80,105,211,25115 +BRDA:80,106,212,0 +BRDA:80,106,213,4038 +BRDA:80,107,214,0 +BRDA:80,107,215,2018 +BRDA:80,108,216,0 +BRDA:80,108,217,476 +BRDA:80,109,218,0 +BRDA:80,109,219,2292 +BRDA:80,110,220,0 +BRDA:80,110,221,476 +BRDA:80,111,222,0 +BRDA:80,111,223,3532 +BRDA:80,112,224,0 +BRDA:80,112,225,37190 +BRDA:80,113,226,0 +BRDA:80,113,227,476 +BRDA:80,114,228,0 +BRDA:80,114,229,155025 +BRDA:80,115,230,0 +BRDA:80,115,231,476 +BRDA:80,116,232,0 +BRDA:80,116,233,2548 +BRDA:80,117,234,0 +BRDA:80,117,235,8232 +BRDA:80,118,236,0 +BRDA:80,118,237,476 +BRDA:80,119,238,0 +BRDA:80,119,239,2941174 +BRDA:80,120,240,0 +BRDA:80,120,241,46616 +BRDA:80,121,242,0 +BRDA:80,121,243,476 +BRDA:80,122,244,0 +BRDA:80,122,245,394215 +BRDA:80,123,246,0 +BRDA:80,123,247,476 +BRDA:80,124,248,0 +BRDA:80,124,249,6530 +BRDA:80,125,250,0 +BRDA:80,125,251,3127763 +BRDA:80,126,252,0 +BRDA:80,126,253,476 +BRDA:80,127,254,0 +BRDA:80,127,255,767 +BRDA:80,128,256,0 +BRDA:80,128,257,25416 +BRDA:80,129,258,6 +BRDA:80,129,259,269591 +BRDA:80,130,260,0 +BRDA:80,130,261,6732 +BRDA:80,131,262,4 +BRDA:80,131,263,4182 +BRDA:80,132,264,0 +BRDA:80,132,265,24906 +BRDA:80,133,266,0 +BRDA:80,133,267,1962 +BRDA:80,134,268,6 +BRDA:80,134,269,1822701 +BRDA:80,135,270,0 +BRDA:80,135,271,476 +BRDA:80,136,272,413184 +BRDA:80,136,273,7762 +BRDA:80,137,274,0 +BRDA:80,137,275,3602 +BRDA:80,138,276,0 +BRDA:80,138,277,476 +BRDA:80,139,278,0 +BRDA:80,139,279,2352 +BRDA:80,140,280,0 +BRDA:80,140,281,121294 +BRDA:80,141,282,0 +BRDA:80,141,283,2358 +BRDA:80,142,284,0 +BRDA:80,142,285,21250 +BRDA:80,143,286,0 +BRDA:80,143,287,6785 +BRDA:80,144,288,4 +BRDA:80,144,289,9382 +BRDA:80,145,290,0 +BRDA:80,145,291,23268 +BRDA:80,146,292,0 +BRDA:80,146,293,4609 +BRDA:80,147,294,0 +BRDA:80,147,295,8225 +BRDA:80,148,296,0 +BRDA:80,148,297,13412 +BRDA:80,149,298,0 +BRDA:80,149,299,23616 +BRDA:80,150,300,0 +BRDA:80,150,301,3820 +BRDA:80,151,302,0 +BRDA:80,151,303,18691 +BRDA:80,152,304,0 +BRDA:80,152,305,476 +BRDA:80,153,306,0 +BRDA:80,153,307,476 +BRDA:80,154,308,0 +BRDA:80,154,309,8339 +BRDA:80,155,310,0 +BRDA:80,155,311,476 +BRDA:80,156,312,0 +BRDA:80,156,313,7730 +BRDA:80,157,314,16 +BRDA:80,157,315,3272 +BRDA:80,158,316,0 +BRDA:80,158,317,476 +BRDA:80,159,318,0 +BRDA:80,159,319,488 +BRDA:80,160,320,0 +BRDA:80,160,321,15555 +BRDA:80,161,322,0 +BRDA:80,161,323,5860 +BRDA:80,162,324,0 +BRDA:80,162,325,2246 +BRDA:80,163,326,0 +BRDA:80,163,327,56902 +BRDA:80,164,328,104 +BRDA:80,164,329,3064429 +BRDA:80,165,330,0 +BRDA:80,165,331,476 +BRDA:80,166,332,0 +BRDA:80,166,333,7861 +BRDA:80,167,334,0 +BRDA:80,167,335,476 +BRDA:80,168,336,0 +BRDA:80,168,337,2676 +BRDA:80,169,338,0 +BRDA:80,169,339,3468647 +BRDA:109,0,0,298421 +BRDA:109,0,1,56676238 +BRDA:154,0,0,- +BRDA:154,0,1,- +BRDA:178,0,0,34 +BRDA:178,0,1,53284 +BRDA:178,1,2,30 +BRDA:178,1,3,44982 +BRDA:178,2,4,476 +BRDA:178,2,5,0 +BRDA:178,3,6,0 +BRDA:178,3,7,1962 +BRDA:178,4,8,95 +BRDA:178,4,9,25321 +BRDA:178,5,10,30 +BRDA:178,5,11,37344 +BRDA:178,6,12,30 +BRDA:178,6,13,24940 +BRDA:178,7,14,476 +BRDA:178,7,15,0 +BRDA:178,8,16,476 +BRDA:178,8,17,0 +BRDA:178,9,18,42 +BRDA:178,9,19,16556 +BRDA:178,10,20,30 +BRDA:178,10,21,37931 +BRDA:178,11,22,476 +BRDA:178,11,23,0 +BRDA:178,12,24,161 +BRDA:178,12,25,3064372 +BRDA:178,13,26,488 +BRDA:178,13,27,0 +BRDA:178,14,28,30 +BRDA:178,14,29,31802 +BRDA:178,15,30,42 +BRDA:178,15,31,26974 +BRDA:178,16,32,476 +BRDA:178,16,33,0 +BRDA:178,17,34,476 +BRDA:178,17,35,0 +BRDA:178,18,36,30 +BRDA:178,18,37,30702 +BRDA:178,19,38,30 +BRDA:178,19,39,4579 +BRDA:178,20,40,24 +BRDA:178,20,41,87278 +BRDA:178,21,42,24 +BRDA:178,21,43,271300 +BRDA:178,22,44,30 +BRDA:178,22,45,66200 +BRDA:178,23,46,18 +BRDA:178,23,47,402696 +BRDA:178,24,48,18 +BRDA:178,24,49,6767 +BRDA:178,25,50,18 +BRDA:178,25,51,722953 +BRDA:178,26,52,42 +BRDA:178,26,53,17342 +BRDA:178,27,54,30 +BRDA:178,27,55,443772 +BRDA:178,28,56,36 +BRDA:178,28,57,731 +BRDA:178,29,58,42 +BRDA:178,29,59,25190 +BRDA:178,30,60,36 +BRDA:178,30,61,15010 +BRDA:178,31,62,52 +BRDA:178,31,63,2238494 +BRDA:178,32,64,24 +BRDA:178,32,65,30560 +BRDA:178,33,66,476 +BRDA:178,33,67,0 +BRDA:178,34,68,413196 +BRDA:178,34,69,7750 +BRDA:178,35,70,476 +BRDA:178,35,71,0 +BRDA:178,36,72,30 +BRDA:178,36,73,291940 +BRDA:178,37,74,34 +BRDA:178,37,75,34368 +BRDA:178,38,76,2124 +BRDA:178,38,77,21959 +BRDA:178,39,78,476 +BRDA:178,39,79,0 +BRDA:178,40,80,476 +BRDA:178,40,81,0 +BRDA:178,41,82,24 +BRDA:178,41,83,617159 +BRDA:178,42,84,30 +BRDA:178,42,85,24942 +BRDA:178,43,86,476 +BRDA:178,43,87,0 +BRDA:178,44,88,94 +BRDA:178,44,89,875830 +BRDA:178,45,90,22 +BRDA:178,45,91,4164 +BRDA:178,46,92,30 +BRDA:178,46,93,1256469 +BRDA:178,47,94,30 +BRDA:178,47,95,93258 +BRDA:178,48,96,476 +BRDA:178,48,97,0 +BRDA:178,49,98,476 +BRDA:178,49,99,0 +BRDA:178,50,100,24 +BRDA:178,50,101,5878347 +BRDA:178,51,102,30 +BRDA:178,51,103,301104 +BRDA:178,52,104,24 +BRDA:178,52,105,64880 +BRDA:178,53,106,30 +BRDA:178,53,107,30132 +BRDA:178,54,108,476 +BRDA:178,54,109,0 +BRDA:178,55,110,476 +BRDA:178,55,111,0 +BRDA:178,56,112,2061 +BRDA:178,56,113,25020 +BRDA:178,57,114,30 +BRDA:178,57,115,41031 +BRDA:178,58,116,30 +BRDA:178,58,117,47802 +BRDA:178,59,118,476 +BRDA:178,59,119,0 +BRDA:178,60,120,115 +BRDA:178,60,121,101340 +BRDA:178,61,122,476 +BRDA:178,61,123,0 +BRDA:178,62,124,30 +BRDA:178,62,125,42064 +BRDA:178,63,126,482 +BRDA:178,63,127,0 +BRDA:178,64,128,18 +BRDA:178,64,129,525982 +BRDA:178,65,130,128 +BRDA:178,65,131,82986 +BRDA:178,66,132,30 +BRDA:178,66,133,28704 +BRDA:178,67,134,48 +BRDA:178,67,135,126826 +BRDA:178,68,136,476 +BRDA:178,68,137,0 +BRDA:178,69,138,24 +BRDA:178,69,139,11969002 +BRDA:178,70,140,238 +BRDA:178,70,141,1526 +BRDA:178,71,142,95 +BRDA:178,71,143,18596 +BRDA:178,72,144,406 +BRDA:178,72,145,520 +BRDA:178,73,146,97 +BRDA:178,73,147,3468550 +BRDA:178,74,148,18 +BRDA:178,74,149,78242 +BRDA:178,75,150,664 +BRDA:178,75,151,2858 +BRDA:178,76,152,24 +BRDA:178,76,153,70306 +BRDA:178,77,154,674 +BRDA:178,77,155,12754 +BRDA:178,78,156,18 +BRDA:178,78,157,1616 +BRDA:178,79,158,18 +BRDA:178,79,159,51782 +BRDA:178,80,160,128 +BRDA:178,80,161,4526309 +BRDA:178,81,162,18 +BRDA:178,81,163,128355 +BRDA:178,82,164,95 +BRDA:178,82,165,8244 +BRDA:178,83,166,24 +BRDA:178,83,167,5107078 +BRDA:178,84,168,68 +BRDA:178,84,169,8580910 +BRDA:178,85,170,24 +BRDA:178,85,171,825115 +BRDA:178,86,172,18 +BRDA:178,86,173,155530 +BRDA:178,87,174,18 +BRDA:178,87,175,6152 +BRDA:178,88,176,22 +BRDA:178,88,177,1014945 +BRDA:178,89,178,18 +BRDA:178,89,179,6512 +BRDA:178,90,180,18 +BRDA:178,90,181,4690417 +BRDA:178,91,182,18 +BRDA:178,91,183,394197 +BRDA:178,92,184,84 +BRDA:178,92,185,5332052 +BRDA:178,93,186,34 +BRDA:178,93,187,2941140 +BRDA:178,94,188,20 +BRDA:178,94,189,6931134 +BRDA:178,95,190,6 +BRDA:178,95,191,14918 +BRDA:178,96,192,42 +BRDA:178,96,193,12840 +BRDA:178,97,194,6 +BRDA:178,97,195,13406 +BRDA:178,98,196,24 +BRDA:178,98,197,23244 +BRDA:178,99,198,80 +BRDA:178,99,199,58573 +BRDA:178,100,200,6 +BRDA:178,100,201,21244 +BRDA:178,101,202,86 +BRDA:178,101,203,8891 +BRDA:178,102,204,48 +BRDA:178,102,205,121246 +BRDA:178,103,206,6 +BRDA:178,103,207,107551 +BRDA:178,104,208,166 +BRDA:178,104,209,3337 +BRDA:178,105,210,24 +BRDA:178,105,211,1822683 +BRDA:178,106,212,18 +BRDA:178,106,213,69778 +BRDA:178,107,214,6 +BRDA:178,107,215,24900 +BRDA:178,108,216,18 +BRDA:178,108,217,8207 +BRDA:178,109,218,12 +BRDA:178,109,219,269585 +BRDA:178,110,220,6 +BRDA:178,110,221,147095 +BRDA:178,111,222,6 +BRDA:178,111,223,23610 +BRDA:178,112,224,6 +BRDA:178,112,225,133373 +BRDA:178,113,226,24 +BRDA:178,113,227,7837 +BRDA:178,114,228,6 +BRDA:178,114,229,13776 +BRDA:178,115,230,6 +BRDA:178,115,231,56896 +BRDA:178,116,232,6 +BRDA:178,116,233,15240 +BRDA:178,117,234,30 +BRDA:178,117,235,15525 +BRDA:178,118,236,238 +BRDA:178,118,237,414 +BRDA:178,119,238,474 +BRDA:178,119,239,2814 +BRDA:178,120,240,24 +BRDA:178,120,241,6708 +BRDA:178,121,242,24 +BRDA:178,121,243,8208 +BRDA:178,122,244,30 +BRDA:178,122,245,58177 +BRDA:178,123,246,30 +BRDA:178,123,247,3790 +BRDA:178,124,248,30 +BRDA:178,124,249,111166 +BRDA:178,125,250,24 +BRDA:178,125,251,7706 +BRDA:178,126,252,30 +BRDA:178,126,253,46622 +BRDA:178,127,254,24 +BRDA:178,127,255,5836 +BRDA:178,128,256,34 +BRDA:178,128,257,47306 +BRDA:178,129,258,24 +BRDA:178,129,259,2222 +BRDA:178,130,260,30 +BRDA:178,130,261,40376 +BRDA:178,131,262,24 +BRDA:178,131,263,2652 +BRDA:178,132,264,30 +BRDA:178,132,265,34692 +BRDA:178,133,266,62 +BRDA:178,133,267,5498348 +BRDA:178,134,268,30 +BRDA:178,134,269,28814 +BRDA:178,135,270,420 +BRDA:178,135,271,470560 +BRDA:178,136,272,30 +BRDA:178,136,273,40466 +BRDA:178,137,274,24 +BRDA:178,137,275,3578 +BRDA:178,138,276,30 +BRDA:178,138,277,38777 +BRDA:178,139,278,18 +BRDA:178,139,279,2334 +BRDA:178,140,280,30 +BRDA:178,140,281,34094 +BRDA:178,141,282,18 +BRDA:178,141,283,2340 +BRDA:178,142,284,30 +BRDA:178,142,285,29026 +BRDA:178,143,286,22 +BRDA:178,143,287,9364 +BRDA:178,144,288,30 +BRDA:178,144,289,48494 +BRDA:178,145,290,30 +BRDA:178,145,291,21224 +BRDA:178,146,292,24 +BRDA:178,146,293,36970 +BRDA:178,147,294,24 +BRDA:178,147,295,2524 +BRDA:178,148,296,24 +BRDA:178,148,297,37166 +BRDA:178,149,298,6 +BRDA:178,149,299,16590 +BRDA:178,150,300,18 +BRDA:178,150,301,2274 +BRDA:178,151,302,16 +BRDA:178,151,303,16581249 +BRDA:178,152,304,18 +BRDA:178,152,305,2000 +BRDA:178,153,306,14 +BRDA:178,153,307,23873828 +BRDA:178,154,308,682 +BRDA:178,154,309,1890161 +BRDA:178,155,310,18 +BRDA:178,155,311,3514 +BRDA:178,156,312,18 +BRDA:178,156,313,155007 +BRDA:178,157,314,736 +BRDA:178,157,315,9079278 +BRDA:178,158,316,718 +BRDA:178,158,317,1527 +BRDA:178,159,318,150 +BRDA:178,159,319,10043255 +BRDA:178,160,320,0 +BRDA:178,160,321,1406674 +BRDA:178,161,322,372 +BRDA:178,161,323,15690783 +BRDA:178,162,324,36 +BRDA:178,162,325,1327019 +BRDA:178,163,326,3726 +BRDA:178,163,327,76200903 +BRDA:178,164,328,30 +BRDA:178,164,329,119370 +BRDA:178,165,330,24 +BRDA:178,165,331,4014 +BRDA:178,166,332,36 +BRDA:178,166,333,236914 +BRDA:178,167,334,634 +BRDA:178,167,335,1156630 +BRDA:178,168,336,18 +BRDA:178,168,337,3127745 +BRDA:178,169,338,18 +BRDA:178,169,339,46598 +BRDA:198,0,0,- +BRDA:198,0,1,- +BRDA:198,1,2,- +BRDA:198,1,3,- +BRDA:204,0,0,- +BRDA:204,0,1,- +BRDA:215,0,0,- +BRDA:215,0,1,- +BRDA:215,1,2,- +BRDA:215,1,3,- +BRDA:215,2,4,- +BRDA:215,2,5,- +BRDA:215,3,6,- +BRDA:215,3,7,- +BRDA:215,4,8,- +BRDA:215,4,9,- +BRDA:215,5,10,- +BRDA:215,5,11,- +BRDA:215,6,12,- +BRDA:215,6,13,- +BRDA:215,7,14,- +BRDA:215,7,15,- +BRDA:215,8,16,- +BRDA:215,8,17,- +BRDA:215,9,18,- +BRDA:215,9,19,- +BRDA:215,10,20,- +BRDA:215,10,21,- +BRDA:215,11,22,- +BRDA:215,11,23,- +BRDA:215,12,24,- +BRDA:215,12,25,- +BRDA:215,13,26,- +BRDA:215,13,27,- +BRDA:215,14,28,- +BRDA:215,14,29,- +BRDA:215,15,30,- +BRDA:215,15,31,- +BRDA:215,16,32,- +BRDA:215,16,33,- +BRDA:215,17,34,- +BRDA:215,17,35,- +BRDA:215,18,36,- +BRDA:215,18,37,- +BRDA:215,19,38,- +BRDA:215,19,39,- +BRDA:215,20,40,- +BRDA:215,20,41,- +BRDA:215,21,42,- +BRDA:215,21,43,- +BRDA:215,22,44,- +BRDA:215,22,45,- +BRDA:215,23,46,- +BRDA:215,23,47,- +BRDA:215,24,48,- +BRDA:215,24,49,- +BRDA:215,25,50,- +BRDA:215,25,51,- +BRDA:215,26,52,- +BRDA:215,26,53,- +BRDA:215,27,54,- +BRDA:215,27,55,- +BRDA:215,28,56,- +BRDA:215,28,57,- +BRDA:215,29,58,- +BRDA:215,29,59,- +BRDA:215,30,60,- +BRDA:215,30,61,- +BRDA:215,31,62,- +BRDA:215,31,63,- +BRDA:215,32,64,- +BRDA:215,32,65,- +BRDA:215,33,66,- +BRDA:215,33,67,- +BRDA:215,34,68,- +BRDA:215,34,69,- +BRDA:215,35,70,- +BRDA:215,35,71,- +BRDA:215,36,72,- +BRDA:215,36,73,- +BRDA:215,37,74,- +BRDA:215,37,75,- +BRDA:215,38,76,- +BRDA:215,38,77,- +BRDA:215,39,78,- +BRDA:215,39,79,- +BRDA:215,40,80,- +BRDA:215,40,81,- +BRDA:215,41,82,- +BRDA:215,41,83,- +BRDA:215,42,84,- +BRDA:215,42,85,- +BRDA:215,43,86,- +BRDA:215,43,87,- +BRDA:215,44,88,- +BRDA:215,44,89,- +BRDA:215,45,90,- +BRDA:215,45,91,- +BRDA:215,46,92,- +BRDA:215,46,93,- +BRDA:215,47,94,- +BRDA:215,47,95,- +BRDA:215,48,96,- +BRDA:215,48,97,- +BRDA:215,49,98,- +BRDA:215,49,99,- +BRDA:215,50,100,- +BRDA:215,50,101,- +BRDA:215,51,102,- +BRDA:215,51,103,- +BRDA:215,52,104,- +BRDA:215,52,105,- +BRDA:215,53,106,- +BRDA:215,53,107,- +BRDA:215,54,108,- +BRDA:215,54,109,- +BRDA:215,55,110,- +BRDA:215,55,111,- +BRDA:215,56,112,- +BRDA:215,56,113,- +BRDA:215,57,114,- +BRDA:215,57,115,- +BRDA:215,58,116,- +BRDA:215,58,117,- +BRDA:215,59,118,- +BRDA:215,59,119,- +BRDA:215,60,120,- +BRDA:215,60,121,- +BRDA:215,61,122,- +BRDA:215,61,123,- +BRDA:215,62,124,- +BRDA:215,62,125,- +BRDA:215,63,126,- +BRDA:215,63,127,- +BRDA:215,64,128,- +BRDA:215,64,129,- +BRDA:215,65,130,- +BRDA:215,65,131,- +BRDA:215,66,132,- +BRDA:215,66,133,- +BRDA:215,67,134,- +BRDA:215,67,135,- +BRDA:215,68,136,- +BRDA:215,68,137,- +BRDA:215,69,138,- +BRDA:215,69,139,- +BRDA:215,70,140,- +BRDA:215,70,141,- +BRDA:215,71,142,- +BRDA:215,71,143,- +BRDA:215,72,144,- +BRDA:215,72,145,- +BRDA:215,73,146,- +BRDA:215,73,147,- +BRDA:215,74,148,- +BRDA:215,74,149,- +BRDA:215,75,150,- +BRDA:215,75,151,- +BRDA:215,76,152,- +BRDA:215,76,153,- +BRDA:215,77,154,- +BRDA:215,77,155,- +BRDA:215,78,156,- +BRDA:215,78,157,- +BRDA:215,79,158,- +BRDA:215,79,159,- +BRDA:215,80,160,- +BRDA:215,80,161,- +BRDA:215,81,162,- +BRDA:215,81,163,- +BRDA:215,82,164,- +BRDA:215,82,165,- +BRDA:215,83,166,- +BRDA:215,83,167,- +BRDA:215,84,168,- +BRDA:215,84,169,- +BRDA:215,85,170,- +BRDA:215,85,171,- +BRDA:215,86,172,- +BRDA:215,86,173,- +BRDA:215,87,174,- +BRDA:215,87,175,- +BRDA:215,88,176,- +BRDA:215,88,177,- +BRDA:215,89,178,- +BRDA:215,89,179,- +BRDA:215,90,180,- +BRDA:215,90,181,- +BRDA:215,91,182,- +BRDA:215,91,183,- +BRDA:215,92,184,- +BRDA:215,92,185,- +BRDA:215,93,186,- +BRDA:215,93,187,- +BRDA:215,94,188,- +BRDA:215,94,189,- +BRDA:215,95,190,- +BRDA:215,95,191,- +BRDA:215,96,192,- +BRDA:215,96,193,- +BRDA:215,97,194,- +BRDA:215,97,195,- +BRDA:215,98,196,- +BRDA:215,98,197,- +BRDA:215,99,198,- +BRDA:215,99,199,- +BRDA:215,100,200,- +BRDA:215,100,201,- +BRDA:215,101,202,- +BRDA:215,101,203,- +BRDA:215,102,204,- +BRDA:215,102,205,- +BRDA:215,103,206,- +BRDA:215,103,207,- +BRDA:215,104,208,- +BRDA:215,104,209,- +BRDA:215,105,210,- +BRDA:215,105,211,- +BRDA:215,106,212,- +BRDA:215,106,213,- +BRDA:215,107,214,- +BRDA:215,107,215,- +BRDA:215,108,216,- +BRDA:215,108,217,- +BRDA:215,109,218,- +BRDA:215,109,219,- +BRDA:215,110,220,- +BRDA:215,110,221,- +BRDA:215,111,222,- +BRDA:215,111,223,- +BRDA:215,112,224,- +BRDA:215,112,225,- +BRDA:215,113,226,- +BRDA:215,113,227,- +BRDA:215,114,228,- +BRDA:215,114,229,- +BRDA:215,115,230,- +BRDA:215,115,231,- +BRDA:215,116,232,- +BRDA:215,116,233,- +BRDA:215,117,234,- +BRDA:215,117,235,- +BRDA:215,118,236,- +BRDA:215,118,237,- +BRDA:215,119,238,- +BRDA:215,119,239,- +BRDA:215,120,240,- +BRDA:215,120,241,- +BRDA:215,121,242,- +BRDA:215,121,243,- +BRDA:215,122,244,- +BRDA:215,122,245,- +BRDA:215,123,246,- +BRDA:215,123,247,- +BRDA:215,124,248,- +BRDA:215,124,249,- +BRDA:215,125,250,- +BRDA:215,125,251,- +BRDA:215,126,252,- +BRDA:215,126,253,- +BRDA:215,127,254,- +BRDA:215,127,255,- +BRDA:215,128,256,- +BRDA:215,128,257,- +BRDA:215,129,258,- +BRDA:215,129,259,- +BRDA:215,130,260,- +BRDA:215,130,261,- +BRDA:215,131,262,- +BRDA:215,131,263,- +BRDA:215,132,264,- +BRDA:215,132,265,- +BRDA:215,133,266,- +BRDA:215,133,267,- +BRDA:215,134,268,- +BRDA:215,134,269,- +BRDA:215,135,270,- +BRDA:215,135,271,- +BRDA:215,136,272,- +BRDA:215,136,273,- +BRDA:215,137,274,- +BRDA:215,137,275,- +BRDA:215,138,276,- +BRDA:215,138,277,- +BRDA:215,139,278,- +BRDA:215,139,279,- +BRDA:215,140,280,- +BRDA:215,140,281,- +BRDA:215,141,282,- +BRDA:215,141,283,- +BRDA:215,142,284,- +BRDA:215,142,285,- +BRDA:215,143,286,- +BRDA:215,143,287,- +BRDA:215,144,288,- +BRDA:215,144,289,- +BRDA:215,145,290,- +BRDA:215,145,291,- +BRDA:215,146,292,- +BRDA:215,146,293,- +BRDA:215,147,294,- +BRDA:215,147,295,- +BRDA:215,148,296,- +BRDA:215,148,297,- +BRDA:215,149,298,- +BRDA:215,149,299,- +BRDA:215,150,300,- +BRDA:215,150,301,- +BRDA:215,151,302,- +BRDA:215,151,303,- +BRDA:215,152,304,- +BRDA:215,152,305,- +BRDA:215,153,306,- +BRDA:215,153,307,- +BRDA:215,154,308,- +BRDA:215,154,309,- +BRDA:215,155,310,- +BRDA:215,155,311,- +BRDA:215,156,312,- +BRDA:215,156,313,- +BRDA:215,157,314,- +BRDA:215,157,315,- +BRDA:215,158,316,- +BRDA:215,158,317,- +BRDA:215,159,318,- +BRDA:215,159,319,- +BRDA:215,160,320,- +BRDA:215,160,321,- +BRDA:215,161,322,- +BRDA:215,161,323,- +BRDA:215,162,324,- +BRDA:215,162,325,- +BRDA:215,163,326,- +BRDA:215,163,327,- +BRDA:215,164,328,- +BRDA:215,164,329,- +BRDA:215,165,330,- +BRDA:215,165,331,- +BRDA:215,166,332,- +BRDA:215,166,333,- +BRDA:215,167,334,- +BRDA:215,167,335,- +BRDA:215,168,336,- +BRDA:215,168,337,- +BRDA:215,169,338,- +BRDA:215,169,339,- +BRDA:215,170,340,- +BRDA:215,170,341,- +BRDA:215,171,342,- +BRDA:215,171,343,- +BRDA:215,172,344,- +BRDA:215,172,345,- +BRDA:215,173,346,- +BRDA:215,173,347,- +BRDA:215,174,348,- +BRDA:215,174,349,- +BRDA:215,175,350,- +BRDA:215,175,351,- +BRDA:215,176,352,- +BRDA:215,176,353,- +BRDA:215,177,354,- +BRDA:215,177,355,- +BRDA:215,178,356,- +BRDA:215,178,357,- +BRDA:215,179,358,- +BRDA:215,179,359,- +BRDA:215,180,360,- +BRDA:215,180,361,- +BRDA:215,181,362,- +BRDA:215,181,363,- +BRDA:215,182,364,- +BRDA:215,182,365,- +BRDA:215,183,366,- +BRDA:215,183,367,- +BRDA:215,184,368,- +BRDA:215,184,369,- +BRDA:215,185,370,- +BRDA:215,185,371,- +BRDA:215,186,372,- +BRDA:215,186,373,- +BRDA:215,187,374,- +BRDA:215,187,375,- +BRDA:215,188,376,- +BRDA:215,188,377,- +BRDA:215,189,378,- +BRDA:215,189,379,- +BRDA:215,190,380,- +BRDA:215,190,381,- +BRDA:215,191,382,- +BRDA:215,191,383,- +BRDA:215,192,384,- +BRDA:215,192,385,- +BRDA:215,193,386,- +BRDA:215,193,387,- +BRDA:215,194,388,- +BRDA:215,194,389,- +BRDA:215,195,390,- +BRDA:215,195,391,- +BRDA:215,196,392,- +BRDA:215,196,393,- +BRDA:215,197,394,- +BRDA:215,197,395,- +BRDA:215,198,396,- +BRDA:215,198,397,- +BRDA:215,199,398,- +BRDA:215,199,399,- +BRDA:215,200,400,- +BRDA:215,200,401,- +BRDA:215,201,402,- +BRDA:215,201,403,- +BRDA:215,202,404,- +BRDA:215,202,405,- +BRDA:215,203,406,- +BRDA:215,203,407,- +BRDA:215,204,408,- +BRDA:215,204,409,- +BRDA:215,205,410,- +BRDA:215,205,411,- +BRDA:215,206,412,- +BRDA:215,206,413,- +BRDA:215,207,414,- +BRDA:215,207,415,- +BRDA:215,208,416,- +BRDA:215,208,417,- +BRDA:215,209,418,- +BRDA:215,209,419,- +BRDA:215,210,420,- +BRDA:215,210,421,- +BRDA:215,211,422,- +BRDA:215,211,423,- +BRDA:215,212,424,- +BRDA:215,212,425,- +BRDA:215,213,426,- +BRDA:215,213,427,- +BRDA:215,214,428,- +BRDA:215,214,429,- +BRDA:215,215,430,- +BRDA:215,215,431,- +BRDA:215,216,432,- +BRDA:215,216,433,- +BRDA:215,217,434,- +BRDA:215,217,435,- +BRDA:215,218,436,- +BRDA:215,218,437,- +BRDA:215,219,438,- +BRDA:215,219,439,- +BRDA:215,220,440,- +BRDA:215,220,441,- +BRDA:215,221,442,- +BRDA:215,221,443,- +BRDA:215,222,444,- +BRDA:215,222,445,- +BRDA:215,223,446,- +BRDA:215,223,447,- +BRDA:215,224,448,- +BRDA:215,224,449,- +BRDA:215,225,450,- +BRDA:215,225,451,- +BRDA:215,226,452,- +BRDA:215,226,453,- +BRDA:215,227,454,- +BRDA:215,227,455,- +BRDA:215,228,456,- +BRDA:215,228,457,- +BRDA:215,229,458,- +BRDA:215,229,459,- +BRDA:215,230,460,- +BRDA:215,230,461,- +BRDA:215,231,462,- +BRDA:215,231,463,- +BRDA:215,232,464,- +BRDA:215,232,465,- +BRDA:215,233,466,- +BRDA:215,233,467,- +BRDA:215,234,468,- +BRDA:215,234,469,- +BRDA:215,235,470,- +BRDA:215,235,471,- +BRDA:215,236,472,- +BRDA:215,236,473,- +BRDA:215,237,474,- +BRDA:215,237,475,- +BRDA:215,238,476,- +BRDA:215,238,477,- +BRDA:215,239,478,- +BRDA:215,239,479,- +BRDA:215,240,480,- +BRDA:215,240,481,- +BRDA:215,241,482,- +BRDA:215,241,483,- +BRDA:215,242,484,- +BRDA:215,242,485,- +BRDA:215,243,486,- +BRDA:215,243,487,- +BRDA:215,244,488,- +BRDA:215,244,489,- +BRDA:215,245,490,- +BRDA:215,245,491,- +BRDA:215,246,492,- +BRDA:215,246,493,- +BRDA:215,247,494,- +BRDA:215,247,495,- +BRDA:215,248,496,- +BRDA:215,248,497,- +BRDA:215,249,498,- +BRDA:215,249,499,- +BRDA:215,250,500,- +BRDA:215,250,501,- +BRDA:215,251,502,- +BRDA:215,251,503,- +BRDA:215,252,504,- +BRDA:215,252,505,- +BRDA:215,253,506,- +BRDA:215,253,507,- +BRDA:215,254,508,- +BRDA:215,254,509,- +BRDA:215,255,510,- +BRDA:215,255,511,- +BRDA:215,256,512,- +BRDA:215,256,513,- +BRDA:215,257,514,- +BRDA:215,257,515,- +BRDA:215,258,516,- +BRDA:215,258,517,- +BRDA:215,259,518,- +BRDA:215,259,519,- +BRDA:215,260,520,- +BRDA:215,260,521,- +BRDA:215,261,522,- +BRDA:215,261,523,- +BRDA:215,262,524,- +BRDA:215,262,525,- +BRDA:215,263,526,- +BRDA:215,263,527,- +BRDA:215,264,528,- +BRDA:215,264,529,- +BRDA:215,265,530,- +BRDA:215,265,531,- +BRDA:215,266,532,- +BRDA:215,266,533,- +BRDA:215,267,534,- +BRDA:215,267,535,- +BRDA:215,268,536,- +BRDA:215,268,537,- +BRDA:215,269,538,- +BRDA:215,269,539,- +BRDA:215,270,540,- +BRDA:215,270,541,- +BRDA:215,271,542,- +BRDA:215,271,543,- +BRDA:215,272,544,- +BRDA:215,272,545,- +BRDA:215,273,546,- +BRDA:215,273,547,- +BRDA:215,274,548,- +BRDA:215,274,549,- +BRDA:215,275,550,- +BRDA:215,275,551,- +BRDA:215,276,552,- +BRDA:215,276,553,- +BRDA:215,277,554,- +BRDA:215,277,555,- +BRDA:215,278,556,- +BRDA:215,278,557,- +BRDA:215,279,558,- +BRDA:215,279,559,- +BRDA:215,280,560,- +BRDA:215,280,561,- +BRDA:215,281,562,- +BRDA:215,281,563,- +BRDA:215,282,564,- +BRDA:215,282,565,- +BRDA:215,283,566,- +BRDA:215,283,567,- +BRDA:215,284,568,- +BRDA:215,284,569,- +BRDA:215,285,570,- +BRDA:215,285,571,- +BRDA:215,286,572,- +BRDA:215,286,573,- +BRDA:215,287,574,- +BRDA:215,287,575,- +BRDA:215,288,576,- +BRDA:215,288,577,- +BRDA:215,289,578,- +BRDA:215,289,579,- +BRDA:215,290,580,- +BRDA:215,290,581,- +BRDA:215,291,582,- +BRDA:215,291,583,- +BRDA:215,292,584,- +BRDA:215,292,585,- +BRDA:215,293,586,- +BRDA:215,293,587,- +BRDA:215,294,588,- +BRDA:215,294,589,- +BRDA:215,295,590,- +BRDA:215,295,591,- +BRDA:215,296,592,- +BRDA:215,296,593,- +BRDA:215,297,594,- +BRDA:215,297,595,- +BRDA:215,298,596,- +BRDA:215,298,597,- +BRDA:215,299,598,- +BRDA:215,299,599,- +BRDA:215,300,600,- +BRDA:215,300,601,- +BRDA:215,301,602,- +BRDA:215,301,603,- +BRDA:215,302,604,- +BRDA:215,302,605,- +BRDA:215,303,606,- +BRDA:215,303,607,- +BRDA:215,304,608,- +BRDA:215,304,609,- +BRDA:215,305,610,- +BRDA:215,305,611,- +BRDA:215,306,612,- +BRDA:215,306,613,- +BRDA:215,307,614,- +BRDA:215,307,615,- +BRDA:215,308,616,- +BRDA:215,308,617,- +BRDA:215,309,618,- +BRDA:215,309,619,- +BRDA:215,310,620,- +BRDA:215,310,621,- +BRDA:215,311,622,- +BRDA:215,311,623,- +BRDA:215,312,624,- +BRDA:215,312,625,- +BRDA:215,313,626,- +BRDA:215,313,627,- +BRDA:215,314,628,- +BRDA:215,314,629,- +BRDA:215,315,630,- +BRDA:215,315,631,- +BRDA:215,316,632,- +BRDA:215,316,633,- +BRDA:215,317,634,- +BRDA:215,317,635,- +BRDA:215,318,636,- +BRDA:215,318,637,- +BRDA:215,319,638,- +BRDA:215,319,639,- +BRDA:215,320,640,- +BRDA:215,320,641,- +BRDA:215,321,642,- +BRDA:215,321,643,- +BRDA:215,322,644,- +BRDA:215,322,645,- +BRDA:215,323,646,- +BRDA:215,323,647,- +BRDA:215,324,648,- +BRDA:215,324,649,- +BRDA:215,325,650,- +BRDA:215,325,651,- +BRDA:215,326,652,- +BRDA:215,326,653,- +BRDA:215,327,654,- +BRDA:215,327,655,- +BRDA:215,328,656,- +BRDA:215,328,657,- +BRDA:215,329,658,- +BRDA:215,329,659,- +BRDA:215,330,660,- +BRDA:215,330,661,- +BRDA:215,331,662,- +BRDA:215,331,663,- +BRDA:215,332,664,- +BRDA:215,332,665,- +BRDA:215,333,666,- +BRDA:215,333,667,- +BRDA:215,334,668,- +BRDA:215,334,669,- +BRDA:215,335,670,- +BRDA:215,335,671,- +BRDA:215,336,672,- +BRDA:215,336,673,- +BRDA:215,337,674,- +BRDA:215,337,675,- +BRDA:215,338,676,- +BRDA:215,338,677,- +BRDA:215,339,678,- +BRDA:215,339,679,- +BRDA:218,0,0,- +BRDA:218,0,1,- +BRDA:218,1,2,- +BRDA:218,1,3,- +BRDA:218,2,4,- +BRDA:218,2,5,- +BRDA:218,3,6,- +BRDA:218,3,7,- +BRDA:218,4,8,- +BRDA:218,4,9,- +BRDA:218,5,10,- +BRDA:218,5,11,- +BRDA:218,6,12,- +BRDA:218,6,13,- +BRDA:218,7,14,- +BRDA:218,7,15,- +BRDA:218,8,16,- +BRDA:218,8,17,- +BRDA:218,9,18,- +BRDA:218,9,19,- +BRDA:218,10,20,- +BRDA:218,10,21,- +BRDA:218,11,22,- +BRDA:218,11,23,- +BRDA:218,12,24,- +BRDA:218,12,25,- +BRDA:218,13,26,- +BRDA:218,13,27,- +BRDA:218,14,28,- +BRDA:218,14,29,- +BRDA:218,15,30,- +BRDA:218,15,31,- +BRDA:218,16,32,- +BRDA:218,16,33,- +BRDA:218,17,34,- +BRDA:218,17,35,- +BRDA:218,18,36,- +BRDA:218,18,37,- +BRDA:218,19,38,- +BRDA:218,19,39,- +BRDA:218,20,40,- +BRDA:218,20,41,- +BRDA:218,21,42,- +BRDA:218,21,43,- +BRDA:218,22,44,- +BRDA:218,22,45,- +BRDA:218,23,46,- +BRDA:218,23,47,- +BRDA:218,24,48,- +BRDA:218,24,49,- +BRDA:218,25,50,- +BRDA:218,25,51,- +BRDA:218,26,52,- +BRDA:218,26,53,- +BRDA:218,27,54,- +BRDA:218,27,55,- +BRDA:218,28,56,- +BRDA:218,28,57,- +BRDA:218,29,58,- +BRDA:218,29,59,- +BRDA:218,30,60,- +BRDA:218,30,61,- +BRDA:218,31,62,- +BRDA:218,31,63,- +BRDA:218,32,64,- +BRDA:218,32,65,- +BRDA:218,33,66,- +BRDA:218,33,67,- +BRDA:218,34,68,- +BRDA:218,34,69,- +BRDA:218,35,70,- +BRDA:218,35,71,- +BRDA:218,36,72,- +BRDA:218,36,73,- +BRDA:218,37,74,- +BRDA:218,37,75,- +BRDA:218,38,76,- +BRDA:218,38,77,- +BRDA:218,39,78,- +BRDA:218,39,79,- +BRDA:218,40,80,- +BRDA:218,40,81,- +BRDA:218,41,82,- +BRDA:218,41,83,- +BRDA:218,42,84,- +BRDA:218,42,85,- +BRDA:218,43,86,- +BRDA:218,43,87,- +BRDA:218,44,88,- +BRDA:218,44,89,- +BRDA:218,45,90,- +BRDA:218,45,91,- +BRDA:218,46,92,- +BRDA:218,46,93,- +BRDA:218,47,94,- +BRDA:218,47,95,- +BRDA:218,48,96,- +BRDA:218,48,97,- +BRDA:218,49,98,- +BRDA:218,49,99,- +BRDA:218,50,100,- +BRDA:218,50,101,- +BRDA:218,51,102,- +BRDA:218,51,103,- +BRDA:218,52,104,- +BRDA:218,52,105,- +BRDA:218,53,106,- +BRDA:218,53,107,- +BRDA:218,54,108,- +BRDA:218,54,109,- +BRDA:218,55,110,- +BRDA:218,55,111,- +BRDA:218,56,112,- +BRDA:218,56,113,- +BRDA:218,57,114,- +BRDA:218,57,115,- +BRDA:218,58,116,- +BRDA:218,58,117,- +BRDA:218,59,118,- +BRDA:218,59,119,- +BRDA:218,60,120,- +BRDA:218,60,121,- +BRDA:218,61,122,- +BRDA:218,61,123,- +BRDA:218,62,124,- +BRDA:218,62,125,- +BRDA:218,63,126,- +BRDA:218,63,127,- +BRDA:218,64,128,- +BRDA:218,64,129,- +BRDA:218,65,130,- +BRDA:218,65,131,- +BRDA:218,66,132,- +BRDA:218,66,133,- +BRDA:218,67,134,- +BRDA:218,67,135,- +BRDA:218,68,136,- +BRDA:218,68,137,- +BRDA:218,69,138,- +BRDA:218,69,139,- +BRDA:218,70,140,- +BRDA:218,70,141,- +BRDA:218,71,142,- +BRDA:218,71,143,- +BRDA:218,72,144,- +BRDA:218,72,145,- +BRDA:218,73,146,- +BRDA:218,73,147,- +BRDA:218,74,148,- +BRDA:218,74,149,- +BRDA:218,75,150,- +BRDA:218,75,151,- +BRDA:218,76,152,- +BRDA:218,76,153,- +BRDA:218,77,154,- +BRDA:218,77,155,- +BRDA:218,78,156,- +BRDA:218,78,157,- +BRDA:218,79,158,- +BRDA:218,79,159,- +BRDA:218,80,160,- +BRDA:218,80,161,- +BRDA:218,81,162,- +BRDA:218,81,163,- +BRDA:218,82,164,- +BRDA:218,82,165,- +BRDA:218,83,166,- +BRDA:218,83,167,- +BRDA:218,84,168,- +BRDA:218,84,169,- +BRDA:218,85,170,- +BRDA:218,85,171,- +BRDA:218,86,172,- +BRDA:218,86,173,- +BRDA:218,87,174,- +BRDA:218,87,175,- +BRDA:218,88,176,- +BRDA:218,88,177,- +BRDA:218,89,178,- +BRDA:218,89,179,- +BRDA:218,90,180,- +BRDA:218,90,181,- +BRDA:218,91,182,- +BRDA:218,91,183,- +BRDA:218,92,184,- +BRDA:218,92,185,- +BRDA:218,93,186,- +BRDA:218,93,187,- +BRDA:218,94,188,- +BRDA:218,94,189,- +BRDA:218,95,190,- +BRDA:218,95,191,- +BRDA:218,96,192,- +BRDA:218,96,193,- +BRDA:218,97,194,- +BRDA:218,97,195,- +BRDA:218,98,196,- +BRDA:218,98,197,- +BRDA:218,99,198,- +BRDA:218,99,199,- +BRDA:218,100,200,- +BRDA:218,100,201,- +BRDA:218,101,202,- +BRDA:218,101,203,- +BRDA:218,102,204,- +BRDA:218,102,205,- +BRDA:218,103,206,- +BRDA:218,103,207,- +BRDA:218,104,208,- +BRDA:218,104,209,- +BRDA:218,105,210,- +BRDA:218,105,211,- +BRDA:218,106,212,- +BRDA:218,106,213,- +BRDA:218,107,214,- +BRDA:218,107,215,- +BRDA:218,108,216,- +BRDA:218,108,217,- +BRDA:218,109,218,- +BRDA:218,109,219,- +BRDA:218,110,220,- +BRDA:218,110,221,- +BRDA:218,111,222,- +BRDA:218,111,223,- +BRDA:218,112,224,- +BRDA:218,112,225,- +BRDA:218,113,226,- +BRDA:218,113,227,- +BRDA:218,114,228,- +BRDA:218,114,229,- +BRDA:218,115,230,- +BRDA:218,115,231,- +BRDA:218,116,232,- +BRDA:218,116,233,- +BRDA:218,117,234,- +BRDA:218,117,235,- +BRDA:218,118,236,- +BRDA:218,118,237,- +BRDA:218,119,238,- +BRDA:218,119,239,- +BRDA:218,120,240,- +BRDA:218,120,241,- +BRDA:218,121,242,- +BRDA:218,121,243,- +BRDA:218,122,244,- +BRDA:218,122,245,- +BRDA:218,123,246,- +BRDA:218,123,247,- +BRDA:218,124,248,- +BRDA:218,124,249,- +BRDA:218,125,250,- +BRDA:218,125,251,- +BRDA:218,126,252,- +BRDA:218,126,253,- +BRDA:218,127,254,- +BRDA:218,127,255,- +BRDA:218,128,256,- +BRDA:218,128,257,- +BRDA:218,129,258,- +BRDA:218,129,259,- +BRDA:218,130,260,- +BRDA:218,130,261,- +BRDA:218,131,262,- +BRDA:218,131,263,- +BRDA:218,132,264,- +BRDA:218,132,265,- +BRDA:218,133,266,- +BRDA:218,133,267,- +BRDA:218,134,268,- +BRDA:218,134,269,- +BRDA:218,135,270,- +BRDA:218,135,271,- +BRDA:218,136,272,- +BRDA:218,136,273,- +BRDA:218,137,274,- +BRDA:218,137,275,- +BRDA:218,138,276,- +BRDA:218,138,277,- +BRDA:218,139,278,- +BRDA:218,139,279,- +BRDA:218,140,280,- +BRDA:218,140,281,- +BRDA:218,141,282,- +BRDA:218,141,283,- +BRDA:218,142,284,- +BRDA:218,142,285,- +BRDA:218,143,286,- +BRDA:218,143,287,- +BRDA:218,144,288,- +BRDA:218,144,289,- +BRDA:218,145,290,- +BRDA:218,145,291,- +BRDA:218,146,292,- +BRDA:218,146,293,- +BRDA:218,147,294,- +BRDA:218,147,295,- +BRDA:218,148,296,- +BRDA:218,148,297,- +BRDA:218,149,298,- +BRDA:218,149,299,- +BRDA:218,150,300,- +BRDA:218,150,301,- +BRDA:218,151,302,- +BRDA:218,151,303,- +BRDA:218,152,304,- +BRDA:218,152,305,- +BRDA:218,153,306,- +BRDA:218,153,307,- +BRDA:218,154,308,- +BRDA:218,154,309,- +BRDA:218,155,310,- +BRDA:218,155,311,- +BRDA:218,156,312,- +BRDA:218,156,313,- +BRDA:218,157,314,- +BRDA:218,157,315,- +BRDA:218,158,316,- +BRDA:218,158,317,- +BRDA:218,159,318,- +BRDA:218,159,319,- +BRDA:218,160,320,- +BRDA:218,160,321,- +BRDA:218,161,322,- +BRDA:218,161,323,- +BRDA:218,162,324,- +BRDA:218,162,325,- +BRDA:218,163,326,- +BRDA:218,163,327,- +BRDA:218,164,328,- +BRDA:218,164,329,- +BRDA:218,165,330,- +BRDA:218,165,331,- +BRDA:218,166,332,- +BRDA:218,166,333,- +BRDA:218,167,334,- +BRDA:218,167,335,- +BRDA:218,168,336,- +BRDA:218,168,337,- +BRDA:218,169,338,- +BRDA:218,169,339,- +BRDA:218,170,340,- +BRDA:218,170,341,- +BRDA:218,171,342,- +BRDA:218,171,343,- +BRDA:218,172,344,- +BRDA:218,172,345,- +BRDA:218,173,346,- +BRDA:218,173,347,- +BRDA:218,174,348,- +BRDA:218,174,349,- +BRDA:218,175,350,- +BRDA:218,175,351,- +BRDA:218,176,352,- +BRDA:218,176,353,- +BRDA:218,177,354,- +BRDA:218,177,355,- +BRDA:218,178,356,- +BRDA:218,178,357,- +BRDA:218,179,358,- +BRDA:218,179,359,- +BRDA:218,180,360,- +BRDA:218,180,361,- +BRDA:218,181,362,- +BRDA:218,181,363,- +BRDA:218,182,364,- +BRDA:218,182,365,- +BRDA:218,183,366,- +BRDA:218,183,367,- +BRDA:218,184,368,- +BRDA:218,184,369,- +BRDA:218,185,370,- +BRDA:218,185,371,- +BRDA:218,186,372,- +BRDA:218,186,373,- +BRDA:218,187,374,- +BRDA:218,187,375,- +BRDA:218,188,376,- +BRDA:218,188,377,- +BRDA:218,189,378,- +BRDA:218,189,379,- +BRDA:218,190,380,- +BRDA:218,190,381,- +BRDA:218,191,382,- +BRDA:218,191,383,- +BRDA:218,192,384,- +BRDA:218,192,385,- +BRDA:218,193,386,- +BRDA:218,193,387,- +BRDA:218,194,388,- +BRDA:218,194,389,- +BRDA:218,195,390,- +BRDA:218,195,391,- +BRDA:218,196,392,- +BRDA:218,196,393,- +BRDA:218,197,394,- +BRDA:218,197,395,- +BRDA:218,198,396,- +BRDA:218,198,397,- +BRDA:218,199,398,- +BRDA:218,199,399,- +BRDA:218,200,400,- +BRDA:218,200,401,- +BRDA:218,201,402,- +BRDA:218,201,403,- +BRDA:218,202,404,- +BRDA:218,202,405,- +BRDA:218,203,406,- +BRDA:218,203,407,- +BRDA:218,204,408,- +BRDA:218,204,409,- +BRDA:218,205,410,- +BRDA:218,205,411,- +BRDA:218,206,412,- +BRDA:218,206,413,- +BRDA:218,207,414,- +BRDA:218,207,415,- +BRDA:218,208,416,- +BRDA:218,208,417,- +BRDA:218,209,418,- +BRDA:218,209,419,- +BRDA:218,210,420,- +BRDA:218,210,421,- +BRDA:218,211,422,- +BRDA:218,211,423,- +BRDA:218,212,424,- +BRDA:218,212,425,- +BRDA:218,213,426,- +BRDA:218,213,427,- +BRDA:218,214,428,- +BRDA:218,214,429,- +BRDA:218,215,430,- +BRDA:218,215,431,- +BRDA:218,216,432,- +BRDA:218,216,433,- +BRDA:218,217,434,- +BRDA:218,217,435,- +BRDA:218,218,436,- +BRDA:218,218,437,- +BRDA:218,219,438,- +BRDA:218,219,439,- +BRDA:218,220,440,- +BRDA:218,220,441,- +BRDA:218,221,442,- +BRDA:218,221,443,- +BRDA:218,222,444,- +BRDA:218,222,445,- +BRDA:218,223,446,- +BRDA:218,223,447,- +BRDA:218,224,448,- +BRDA:218,224,449,- +BRDA:218,225,450,- +BRDA:218,225,451,- +BRDA:218,226,452,- +BRDA:218,226,453,- +BRDA:218,227,454,- +BRDA:218,227,455,- +BRDA:218,228,456,- +BRDA:218,228,457,- +BRDA:218,229,458,- +BRDA:218,229,459,- +BRDA:218,230,460,- +BRDA:218,230,461,- +BRDA:218,231,462,- +BRDA:218,231,463,- +BRDA:218,232,464,- +BRDA:218,232,465,- +BRDA:218,233,466,- +BRDA:218,233,467,- +BRDA:218,234,468,- +BRDA:218,234,469,- +BRDA:218,235,470,- +BRDA:218,235,471,- +BRDA:218,236,472,- +BRDA:218,236,473,- +BRDA:218,237,474,- +BRDA:218,237,475,- +BRDA:218,238,476,- +BRDA:218,238,477,- +BRDA:218,239,478,- +BRDA:218,239,479,- +BRDA:218,240,480,- +BRDA:218,240,481,- +BRDA:218,241,482,- +BRDA:218,241,483,- +BRDA:218,242,484,- +BRDA:218,242,485,- +BRDA:218,243,486,- +BRDA:218,243,487,- +BRDA:218,244,488,- +BRDA:218,244,489,- +BRDA:218,245,490,- +BRDA:218,245,491,- +BRDA:218,246,492,- +BRDA:218,246,493,- +BRDA:218,247,494,- +BRDA:218,247,495,- +BRDA:218,248,496,- +BRDA:218,248,497,- +BRDA:218,249,498,- +BRDA:218,249,499,- +BRDA:218,250,500,- +BRDA:218,250,501,- +BRDA:218,251,502,- +BRDA:218,251,503,- +BRDA:218,252,504,- +BRDA:218,252,505,- +BRDA:218,253,506,- +BRDA:218,253,507,- +BRDA:218,254,508,- +BRDA:218,254,509,- +BRDA:218,255,510,- +BRDA:218,255,511,- +BRDA:218,256,512,- +BRDA:218,256,513,- +BRDA:218,257,514,- +BRDA:218,257,515,- +BRDA:218,258,516,- +BRDA:218,258,517,- +BRDA:218,259,518,- +BRDA:218,259,519,- +BRDA:218,260,520,- +BRDA:218,260,521,- +BRDA:218,261,522,- +BRDA:218,261,523,- +BRDA:218,262,524,- +BRDA:218,262,525,- +BRDA:218,263,526,- +BRDA:218,263,527,- +BRDA:218,264,528,- +BRDA:218,264,529,- +BRDA:218,265,530,- +BRDA:218,265,531,- +BRDA:218,266,532,- +BRDA:218,266,533,- +BRDA:218,267,534,- +BRDA:218,267,535,- +BRDA:218,268,536,- +BRDA:218,268,537,- +BRDA:218,269,538,- +BRDA:218,269,539,- +BRDA:218,270,540,- +BRDA:218,270,541,- +BRDA:218,271,542,- +BRDA:218,271,543,- +BRDA:218,272,544,- +BRDA:218,272,545,- +BRDA:218,273,546,- +BRDA:218,273,547,- +BRDA:218,274,548,- +BRDA:218,274,549,- +BRDA:218,275,550,- +BRDA:218,275,551,- +BRDA:218,276,552,- +BRDA:218,276,553,- +BRDA:218,277,554,- +BRDA:218,277,555,- +BRDA:218,278,556,- +BRDA:218,278,557,- +BRDA:218,279,558,- +BRDA:218,279,559,- +BRDA:218,280,560,- +BRDA:218,280,561,- +BRDA:218,281,562,- +BRDA:218,281,563,- +BRDA:218,282,564,- +BRDA:218,282,565,- +BRDA:218,283,566,- +BRDA:218,283,567,- +BRDA:218,284,568,- +BRDA:218,284,569,- +BRDA:218,285,570,- +BRDA:218,285,571,- +BRDA:218,286,572,- +BRDA:218,286,573,- +BRDA:218,287,574,- +BRDA:218,287,575,- +BRDA:218,288,576,- +BRDA:218,288,577,- +BRDA:218,289,578,- +BRDA:218,289,579,- +BRDA:218,290,580,- +BRDA:218,290,581,- +BRDA:218,291,582,- +BRDA:218,291,583,- +BRDA:218,292,584,- +BRDA:218,292,585,- +BRDA:218,293,586,- +BRDA:218,293,587,- +BRDA:218,294,588,- +BRDA:218,294,589,- +BRDA:218,295,590,- +BRDA:218,295,591,- +BRDA:218,296,592,- +BRDA:218,296,593,- +BRDA:218,297,594,- +BRDA:218,297,595,- +BRDA:218,298,596,- +BRDA:218,298,597,- +BRDA:218,299,598,- +BRDA:218,299,599,- +BRDA:218,300,600,- +BRDA:218,300,601,- +BRDA:218,301,602,- +BRDA:218,301,603,- +BRDA:218,302,604,- +BRDA:218,302,605,- +BRDA:218,303,606,- +BRDA:218,303,607,- +BRDA:218,304,608,- +BRDA:218,304,609,- +BRDA:218,305,610,- +BRDA:218,305,611,- +BRDA:218,306,612,- +BRDA:218,306,613,- +BRDA:218,307,614,- +BRDA:218,307,615,- +BRDA:218,308,616,- +BRDA:218,308,617,- +BRDA:218,309,618,- +BRDA:218,309,619,- +BRDA:218,310,620,- +BRDA:218,310,621,- +BRDA:218,311,622,- +BRDA:218,311,623,- +BRDA:218,312,624,- +BRDA:218,312,625,- +BRDA:218,313,626,- +BRDA:218,313,627,- +BRDA:218,314,628,- +BRDA:218,314,629,- +BRDA:218,315,630,- +BRDA:218,315,631,- +BRDA:218,316,632,- +BRDA:218,316,633,- +BRDA:218,317,634,- +BRDA:218,317,635,- +BRDA:218,318,636,- +BRDA:218,318,637,- +BRDA:218,319,638,- +BRDA:218,319,639,- +BRDA:218,320,640,- +BRDA:218,320,641,- +BRDA:218,321,642,- +BRDA:218,321,643,- +BRDA:218,322,644,- +BRDA:218,322,645,- +BRDA:218,323,646,- +BRDA:218,323,647,- +BRDA:218,324,648,- +BRDA:218,324,649,- +BRDA:218,325,650,- +BRDA:218,325,651,- +BRDA:218,326,652,- +BRDA:218,326,653,- +BRDA:218,327,654,- +BRDA:218,327,655,- +BRDA:218,328,656,- +BRDA:218,328,657,- +BRDA:218,329,658,- +BRDA:218,329,659,- +BRDA:218,330,660,- +BRDA:218,330,661,- +BRDA:218,331,662,- +BRDA:218,331,663,- +BRDA:218,332,664,- +BRDA:218,332,665,- +BRDA:218,333,666,- +BRDA:218,333,667,- +BRDA:218,334,668,- +BRDA:218,334,669,- +BRDA:218,335,670,- +BRDA:218,335,671,- +BRDA:218,336,672,- +BRDA:218,336,673,- +BRDA:218,337,674,- +BRDA:218,337,675,- +BRDA:218,338,676,- +BRDA:218,338,677,- +BRDA:218,339,678,- +BRDA:218,339,679,- +BRDA:230,0,0,- +BRDA:230,0,1,- +BRDA:230,1,2,- +BRDA:230,1,3,- +BRDA:230,2,4,- +BRDA:230,2,5,- +BRDA:230,3,6,- +BRDA:230,3,7,- +BRDA:230,4,8,- +BRDA:230,4,9,- +BRDA:230,5,10,- +BRDA:230,5,11,- +BRDA:230,6,12,- +BRDA:230,6,13,- +BRDA:230,7,14,- +BRDA:230,7,15,- +BRDA:230,8,16,- +BRDA:230,8,17,- +BRDA:230,9,18,- +BRDA:230,9,19,- +BRDA:230,10,20,- +BRDA:230,10,21,- +BRDA:230,11,22,- +BRDA:230,11,23,- +BRDA:230,12,24,- +BRDA:230,12,25,- +BRDA:230,13,26,- +BRDA:230,13,27,- +BRDA:230,14,28,- +BRDA:230,14,29,- +BRDA:230,15,30,- +BRDA:230,15,31,- +BRDA:230,16,32,- +BRDA:230,16,33,- +BRDA:230,17,34,- +BRDA:230,17,35,- +BRDA:230,18,36,- +BRDA:230,18,37,- +BRDA:230,19,38,- +BRDA:230,19,39,- +BRDA:230,20,40,- +BRDA:230,20,41,- +BRDA:230,21,42,- +BRDA:230,21,43,- +BRDA:230,22,44,- +BRDA:230,22,45,- +BRDA:230,23,46,- +BRDA:230,23,47,- +BRDA:230,24,48,- +BRDA:230,24,49,- +BRDA:230,25,50,- +BRDA:230,25,51,- +BRDA:230,26,52,- +BRDA:230,26,53,- +BRDA:230,27,54,- +BRDA:230,27,55,- +BRDA:230,28,56,- +BRDA:230,28,57,- +BRDA:230,29,58,- +BRDA:230,29,59,- +BRDA:230,30,60,- +BRDA:230,30,61,- +BRDA:230,31,62,- +BRDA:230,31,63,- +BRDA:230,32,64,- +BRDA:230,32,65,- +BRDA:230,33,66,- +BRDA:230,33,67,- +BRDA:230,34,68,- +BRDA:230,34,69,- +BRDA:230,35,70,- +BRDA:230,35,71,- +BRDA:230,36,72,- +BRDA:230,36,73,- +BRDA:230,37,74,- +BRDA:230,37,75,- +BRDA:230,38,76,- +BRDA:230,38,77,- +BRDA:230,39,78,- +BRDA:230,39,79,- +BRDA:230,40,80,- +BRDA:230,40,81,- +BRDA:230,41,82,- +BRDA:230,41,83,- +BRDA:230,42,84,- +BRDA:230,42,85,- +BRDA:230,43,86,- +BRDA:230,43,87,- +BRDA:230,44,88,- +BRDA:230,44,89,- +BRDA:230,45,90,- +BRDA:230,45,91,- +BRDA:230,46,92,- +BRDA:230,46,93,- +BRDA:230,47,94,- +BRDA:230,47,95,- +BRDA:230,48,96,- +BRDA:230,48,97,- +BRDA:230,49,98,- +BRDA:230,49,99,- +BRDA:230,50,100,- +BRDA:230,50,101,- +BRDA:230,51,102,- +BRDA:230,51,103,- +BRDA:230,52,104,- +BRDA:230,52,105,- +BRDA:230,53,106,- +BRDA:230,53,107,- +BRDA:230,54,108,- +BRDA:230,54,109,- +BRDA:230,55,110,- +BRDA:230,55,111,- +BRDA:230,56,112,- +BRDA:230,56,113,- +BRDA:230,57,114,- +BRDA:230,57,115,- +BRDA:230,58,116,- +BRDA:230,58,117,- +BRDA:230,59,118,- +BRDA:230,59,119,- +BRDA:230,60,120,- +BRDA:230,60,121,- +BRDA:230,61,122,- +BRDA:230,61,123,- +BRDA:230,62,124,- +BRDA:230,62,125,- +BRDA:230,63,126,- +BRDA:230,63,127,- +BRDA:230,64,128,- +BRDA:230,64,129,- +BRDA:230,65,130,- +BRDA:230,65,131,- +BRDA:230,66,132,- +BRDA:230,66,133,- +BRDA:230,67,134,- +BRDA:230,67,135,- +BRDA:230,68,136,- +BRDA:230,68,137,- +BRDA:230,69,138,- +BRDA:230,69,139,- +BRDA:230,70,140,- +BRDA:230,70,141,- +BRDA:230,71,142,- +BRDA:230,71,143,- +BRDA:230,72,144,- +BRDA:230,72,145,- +BRDA:230,73,146,- +BRDA:230,73,147,- +BRDA:230,74,148,- +BRDA:230,74,149,- +BRDA:230,75,150,- +BRDA:230,75,151,- +BRDA:230,76,152,- +BRDA:230,76,153,- +BRDA:230,77,154,- +BRDA:230,77,155,- +BRDA:230,78,156,- +BRDA:230,78,157,- +BRDA:230,79,158,- +BRDA:230,79,159,- +BRDA:230,80,160,- +BRDA:230,80,161,- +BRDA:230,81,162,- +BRDA:230,81,163,- +BRDA:230,82,164,- +BRDA:230,82,165,- +BRDA:230,83,166,- +BRDA:230,83,167,- +BRDA:230,84,168,- +BRDA:230,84,169,- +BRDA:230,85,170,- +BRDA:230,85,171,- +BRDA:230,86,172,- +BRDA:230,86,173,- +BRDA:230,87,174,- +BRDA:230,87,175,- +BRDA:230,88,176,- +BRDA:230,88,177,- +BRDA:230,89,178,- +BRDA:230,89,179,- +BRDA:230,90,180,- +BRDA:230,90,181,- +BRDA:230,91,182,- +BRDA:230,91,183,- +BRDA:230,92,184,- +BRDA:230,92,185,- +BRDA:230,93,186,- +BRDA:230,93,187,- +BRDA:230,94,188,- +BRDA:230,94,189,- +BRDA:230,95,190,- +BRDA:230,95,191,- +BRDA:230,96,192,- +BRDA:230,96,193,- +BRDA:230,97,194,- +BRDA:230,97,195,- +BRDA:230,98,196,- +BRDA:230,98,197,- +BRDA:230,99,198,- +BRDA:230,99,199,- +BRDA:230,100,200,- +BRDA:230,100,201,- +BRDA:230,101,202,- +BRDA:230,101,203,- +BRDA:230,102,204,- +BRDA:230,102,205,- +BRDA:230,103,206,- +BRDA:230,103,207,- +BRDA:230,104,208,- +BRDA:230,104,209,- +BRDA:230,105,210,- +BRDA:230,105,211,- +BRDA:230,106,212,- +BRDA:230,106,213,- +BRDA:230,107,214,- +BRDA:230,107,215,- +BRDA:230,108,216,- +BRDA:230,108,217,- +BRDA:230,109,218,- +BRDA:230,109,219,- +BRDA:230,110,220,- +BRDA:230,110,221,- +BRDA:230,111,222,- +BRDA:230,111,223,- +BRDA:230,112,224,- +BRDA:230,112,225,- +BRDA:230,113,226,- +BRDA:230,113,227,- +BRDA:230,114,228,- +BRDA:230,114,229,- +BRDA:230,115,230,- +BRDA:230,115,231,- +BRDA:230,116,232,- +BRDA:230,116,233,- +BRDA:230,117,234,- +BRDA:230,117,235,- +BRDA:230,118,236,- +BRDA:230,118,237,- +BRDA:230,119,238,- +BRDA:230,119,239,- +BRDA:230,120,240,- +BRDA:230,120,241,- +BRDA:230,121,242,- +BRDA:230,121,243,- +BRDA:230,122,244,- +BRDA:230,122,245,- +BRDA:230,123,246,- +BRDA:230,123,247,- +BRDA:230,124,248,- +BRDA:230,124,249,- +BRDA:230,125,250,- +BRDA:230,125,251,- +BRDA:230,126,252,- +BRDA:230,126,253,- +BRDA:230,127,254,- +BRDA:230,127,255,- +BRDA:230,128,256,- +BRDA:230,128,257,- +BRDA:230,129,258,- +BRDA:230,129,259,- +BRDA:230,130,260,- +BRDA:230,130,261,- +BRDA:230,131,262,- +BRDA:230,131,263,- +BRDA:230,132,264,- +BRDA:230,132,265,- +BRDA:230,133,266,- +BRDA:230,133,267,- +BRDA:230,134,268,- +BRDA:230,134,269,- +BRDA:230,135,270,- +BRDA:230,135,271,- +BRDA:230,136,272,- +BRDA:230,136,273,- +BRDA:230,137,274,- +BRDA:230,137,275,- +BRDA:230,138,276,- +BRDA:230,138,277,- +BRDA:230,139,278,- +BRDA:230,139,279,- +BRDA:230,140,280,- +BRDA:230,140,281,- +BRDA:230,141,282,- +BRDA:230,141,283,- +BRDA:230,142,284,- +BRDA:230,142,285,- +BRDA:230,143,286,- +BRDA:230,143,287,- +BRDA:230,144,288,- +BRDA:230,144,289,- +BRDA:230,145,290,- +BRDA:230,145,291,- +BRDA:230,146,292,- +BRDA:230,146,293,- +BRDA:230,147,294,- +BRDA:230,147,295,- +BRDA:230,148,296,- +BRDA:230,148,297,- +BRDA:230,149,298,- +BRDA:230,149,299,- +BRDA:230,150,300,- +BRDA:230,150,301,- +BRDA:230,151,302,- +BRDA:230,151,303,- +BRDA:230,152,304,- +BRDA:230,152,305,- +BRDA:230,153,306,- +BRDA:230,153,307,- +BRDA:230,154,308,- +BRDA:230,154,309,- +BRDA:230,155,310,- +BRDA:230,155,311,- +BRDA:230,156,312,- +BRDA:230,156,313,- +BRDA:230,157,314,- +BRDA:230,157,315,- +BRDA:230,158,316,- +BRDA:230,158,317,- +BRDA:230,159,318,- +BRDA:230,159,319,- +BRDA:230,160,320,- +BRDA:230,160,321,- +BRDA:230,161,322,- +BRDA:230,161,323,- +BRDA:230,162,324,- +BRDA:230,162,325,- +BRDA:230,163,326,- +BRDA:230,163,327,- +BRDA:230,164,328,- +BRDA:230,164,329,- +BRDA:230,165,330,- +BRDA:230,165,331,- +BRDA:230,166,332,- +BRDA:230,166,333,- +BRDA:230,167,334,- +BRDA:230,167,335,- +BRDA:230,168,336,- +BRDA:230,168,337,- +BRDA:230,169,338,- +BRDA:230,169,339,- +BRDA:230,170,340,- +BRDA:230,170,341,- +BRDA:230,171,342,- +BRDA:230,171,343,- +BRDA:230,172,344,- +BRDA:230,172,345,- +BRDA:230,173,346,- +BRDA:230,173,347,- +BRDA:230,174,348,- +BRDA:230,174,349,- +BRDA:230,175,350,- +BRDA:230,175,351,- +BRDA:230,176,352,- +BRDA:230,176,353,- +BRDA:230,177,354,- +BRDA:230,177,355,- +BRDA:230,178,356,- +BRDA:230,178,357,- +BRDA:230,179,358,- +BRDA:230,179,359,- +BRDA:230,180,360,- +BRDA:230,180,361,- +BRDA:230,181,362,- +BRDA:230,181,363,- +BRDA:230,182,364,- +BRDA:230,182,365,- +BRDA:230,183,366,- +BRDA:230,183,367,- +BRDA:230,184,368,- +BRDA:230,184,369,- +BRDA:230,185,370,- +BRDA:230,185,371,- +BRDA:230,186,372,- +BRDA:230,186,373,- +BRDA:230,187,374,- +BRDA:230,187,375,- +BRDA:230,188,376,- +BRDA:230,188,377,- +BRDA:230,189,378,- +BRDA:230,189,379,- +BRDA:230,190,380,- +BRDA:230,190,381,- +BRDA:230,191,382,- +BRDA:230,191,383,- +BRDA:230,192,384,- +BRDA:230,192,385,- +BRDA:230,193,386,- +BRDA:230,193,387,- +BRDA:230,194,388,- +BRDA:230,194,389,- +BRDA:230,195,390,- +BRDA:230,195,391,- +BRDA:230,196,392,- +BRDA:230,196,393,- +BRDA:230,197,394,- +BRDA:230,197,395,- +BRDA:230,198,396,- +BRDA:230,198,397,- +BRDA:230,199,398,- +BRDA:230,199,399,- +BRDA:230,200,400,- +BRDA:230,200,401,- +BRDA:230,201,402,- +BRDA:230,201,403,- +BRDA:230,202,404,- +BRDA:230,202,405,- +BRDA:230,203,406,- +BRDA:230,203,407,- +BRDA:230,204,408,- +BRDA:230,204,409,- +BRDA:230,205,410,- +BRDA:230,205,411,- +BRDA:230,206,412,- +BRDA:230,206,413,- +BRDA:230,207,414,- +BRDA:230,207,415,- +BRDA:230,208,416,- +BRDA:230,208,417,- +BRDA:230,209,418,- +BRDA:230,209,419,- +BRDA:230,210,420,- +BRDA:230,210,421,- +BRDA:230,211,422,- +BRDA:230,211,423,- +BRDA:230,212,424,- +BRDA:230,212,425,- +BRDA:230,213,426,- +BRDA:230,213,427,- +BRDA:230,214,428,- +BRDA:230,214,429,- +BRDA:230,215,430,- +BRDA:230,215,431,- +BRDA:230,216,432,- +BRDA:230,216,433,- +BRDA:230,217,434,- +BRDA:230,217,435,- +BRDA:230,218,436,- +BRDA:230,218,437,- +BRDA:230,219,438,- +BRDA:230,219,439,- +BRDA:230,220,440,- +BRDA:230,220,441,- +BRDA:230,221,442,- +BRDA:230,221,443,- +BRDA:230,222,444,- +BRDA:230,222,445,- +BRDA:230,223,446,- +BRDA:230,223,447,- +BRDA:230,224,448,- +BRDA:230,224,449,- +BRDA:230,225,450,- +BRDA:230,225,451,- +BRDA:230,226,452,- +BRDA:230,226,453,- +BRDA:230,227,454,- +BRDA:230,227,455,- +BRDA:230,228,456,- +BRDA:230,228,457,- +BRDA:230,229,458,- +BRDA:230,229,459,- +BRDA:230,230,460,- +BRDA:230,230,461,- +BRDA:230,231,462,- +BRDA:230,231,463,- +BRDA:230,232,464,- +BRDA:230,232,465,- +BRDA:230,233,466,- +BRDA:230,233,467,- +BRDA:230,234,468,- +BRDA:230,234,469,- +BRDA:230,235,470,- +BRDA:230,235,471,- +BRDA:230,236,472,- +BRDA:230,236,473,- +BRDA:230,237,474,- +BRDA:230,237,475,- +BRDA:230,238,476,- +BRDA:230,238,477,- +BRDA:230,239,478,- +BRDA:230,239,479,- +BRDA:230,240,480,- +BRDA:230,240,481,- +BRDA:230,241,482,- +BRDA:230,241,483,- +BRDA:230,242,484,- +BRDA:230,242,485,- +BRDA:230,243,486,- +BRDA:230,243,487,- +BRDA:230,244,488,- +BRDA:230,244,489,- +BRDA:230,245,490,- +BRDA:230,245,491,- +BRDA:230,246,492,- +BRDA:230,246,493,- +BRDA:230,247,494,- +BRDA:230,247,495,- +BRDA:230,248,496,- +BRDA:230,248,497,- +BRDA:230,249,498,- +BRDA:230,249,499,- +BRDA:230,250,500,- +BRDA:230,250,501,- +BRDA:230,251,502,- +BRDA:230,251,503,- +BRDA:230,252,504,- +BRDA:230,252,505,- +BRDA:230,253,506,- +BRDA:230,253,507,- +BRDA:230,254,508,- +BRDA:230,254,509,- +BRDA:230,255,510,- +BRDA:230,255,511,- +BRDA:230,256,512,- +BRDA:230,256,513,- +BRDA:230,257,514,- +BRDA:230,257,515,- +BRDA:230,258,516,- +BRDA:230,258,517,- +BRDA:230,259,518,- +BRDA:230,259,519,- +BRDA:230,260,520,- +BRDA:230,260,521,- +BRDA:230,261,522,- +BRDA:230,261,523,- +BRDA:230,262,524,- +BRDA:230,262,525,- +BRDA:230,263,526,- +BRDA:230,263,527,- +BRDA:230,264,528,- +BRDA:230,264,529,- +BRDA:230,265,530,- +BRDA:230,265,531,- +BRDA:230,266,532,- +BRDA:230,266,533,- +BRDA:230,267,534,- +BRDA:230,267,535,- +BRDA:230,268,536,- +BRDA:230,268,537,- +BRDA:230,269,538,- +BRDA:230,269,539,- +BRDA:230,270,540,- +BRDA:230,270,541,- +BRDA:230,271,542,- +BRDA:230,271,543,- +BRDA:230,272,544,- +BRDA:230,272,545,- +BRDA:230,273,546,- +BRDA:230,273,547,- +BRDA:230,274,548,- +BRDA:230,274,549,- +BRDA:230,275,550,- +BRDA:230,275,551,- +BRDA:230,276,552,- +BRDA:230,276,553,- +BRDA:230,277,554,- +BRDA:230,277,555,- +BRDA:230,278,556,- +BRDA:230,278,557,- +BRDA:230,279,558,- +BRDA:230,279,559,- +BRDA:230,280,560,- +BRDA:230,280,561,- +BRDA:230,281,562,- +BRDA:230,281,563,- +BRDA:230,282,564,- +BRDA:230,282,565,- +BRDA:230,283,566,- +BRDA:230,283,567,- +BRDA:230,284,568,- +BRDA:230,284,569,- +BRDA:230,285,570,- +BRDA:230,285,571,- +BRDA:230,286,572,- +BRDA:230,286,573,- +BRDA:230,287,574,- +BRDA:230,287,575,- +BRDA:230,288,576,- +BRDA:230,288,577,- +BRDA:230,289,578,- +BRDA:230,289,579,- +BRDA:230,290,580,- +BRDA:230,290,581,- +BRDA:230,291,582,- +BRDA:230,291,583,- +BRDA:230,292,584,- +BRDA:230,292,585,- +BRDA:230,293,586,- +BRDA:230,293,587,- +BRDA:230,294,588,- +BRDA:230,294,589,- +BRDA:230,295,590,- +BRDA:230,295,591,- +BRDA:230,296,592,- +BRDA:230,296,593,- +BRDA:230,297,594,- +BRDA:230,297,595,- +BRDA:230,298,596,- +BRDA:230,298,597,- +BRDA:230,299,598,- +BRDA:230,299,599,- +BRDA:230,300,600,- +BRDA:230,300,601,- +BRDA:230,301,602,- +BRDA:230,301,603,- +BRDA:230,302,604,- +BRDA:230,302,605,- +BRDA:230,303,606,- +BRDA:230,303,607,- +BRDA:230,304,608,- +BRDA:230,304,609,- +BRDA:230,305,610,- +BRDA:230,305,611,- +BRDA:230,306,612,- +BRDA:230,306,613,- +BRDA:230,307,614,- +BRDA:230,307,615,- +BRDA:230,308,616,- +BRDA:230,308,617,- +BRDA:230,309,618,- +BRDA:230,309,619,- +BRDA:230,310,620,- +BRDA:230,310,621,- +BRDA:230,311,622,- +BRDA:230,311,623,- +BRDA:230,312,624,- +BRDA:230,312,625,- +BRDA:230,313,626,- +BRDA:230,313,627,- +BRDA:230,314,628,- +BRDA:230,314,629,- +BRDA:230,315,630,- +BRDA:230,315,631,- +BRDA:230,316,632,- +BRDA:230,316,633,- +BRDA:230,317,634,- +BRDA:230,317,635,- +BRDA:230,318,636,- +BRDA:230,318,637,- +BRDA:230,319,638,- +BRDA:230,319,639,- +BRDA:230,320,640,- +BRDA:230,320,641,- +BRDA:230,321,642,- +BRDA:230,321,643,- +BRDA:230,322,644,- +BRDA:230,322,645,- +BRDA:230,323,646,- +BRDA:230,323,647,- +BRDA:230,324,648,- +BRDA:230,324,649,- +BRDA:230,325,650,- +BRDA:230,325,651,- +BRDA:230,326,652,- +BRDA:230,326,653,- +BRDA:230,327,654,- +BRDA:230,327,655,- +BRDA:230,328,656,- +BRDA:230,328,657,- +BRDA:230,329,658,- +BRDA:230,329,659,- +BRDA:230,330,660,- +BRDA:230,330,661,- +BRDA:230,331,662,- +BRDA:230,331,663,- +BRDA:230,332,664,- +BRDA:230,332,665,- +BRDA:230,333,666,- +BRDA:230,333,667,- +BRDA:230,334,668,- +BRDA:230,334,669,- +BRDA:230,335,670,- +BRDA:230,335,671,- +BRDA:230,336,672,- +BRDA:230,336,673,- +BRDA:230,337,674,- +BRDA:230,337,675,- +BRDA:230,338,676,- +BRDA:230,338,677,- +BRDA:230,339,678,- +BRDA:230,339,679,- +BRDA:230,340,680,- +BRDA:230,340,681,- +BRDA:230,341,682,- +BRDA:230,341,683,- +BRDA:230,342,684,- +BRDA:230,342,685,- +BRDA:230,343,686,- +BRDA:230,343,687,- +BRDA:230,344,688,- +BRDA:230,344,689,- +BRDA:230,345,690,- +BRDA:230,345,691,- +BRDA:230,346,692,- +BRDA:230,346,693,- +BRDA:230,347,694,- +BRDA:230,347,695,- +BRDA:230,348,696,- +BRDA:230,348,697,- +BRDA:230,349,698,- +BRDA:230,349,699,- +BRDA:230,350,700,- +BRDA:230,350,701,- +BRDA:230,351,702,- +BRDA:230,351,703,- +BRDA:230,352,704,- +BRDA:230,352,705,- +BRDA:230,353,706,- +BRDA:230,353,707,- +BRDA:230,354,708,- +BRDA:230,354,709,- +BRDA:230,355,710,- +BRDA:230,355,711,- +BRDA:230,356,712,- +BRDA:230,356,713,- +BRDA:230,357,714,- +BRDA:230,357,715,- +BRDA:230,358,716,- +BRDA:230,358,717,- +BRDA:230,359,718,- +BRDA:230,359,719,- +BRDA:230,360,720,- +BRDA:230,360,721,- +BRDA:230,361,722,- +BRDA:230,361,723,- +BRDA:230,362,724,- +BRDA:230,362,725,- +BRDA:230,363,726,- +BRDA:230,363,727,- +BRDA:230,364,728,- +BRDA:230,364,729,- +BRDA:230,365,730,- +BRDA:230,365,731,- +BRDA:230,366,732,- +BRDA:230,366,733,- +BRDA:230,367,734,- +BRDA:230,367,735,- +BRDA:230,368,736,- +BRDA:230,368,737,- +BRDA:230,369,738,- +BRDA:230,369,739,- +BRDA:230,370,740,- +BRDA:230,370,741,- +BRDA:230,371,742,- +BRDA:230,371,743,- +BRDA:230,372,744,- +BRDA:230,372,745,- +BRDA:230,373,746,- +BRDA:230,373,747,- +BRDA:230,374,748,- +BRDA:230,374,749,- +BRDA:230,375,750,- +BRDA:230,375,751,- +BRDA:230,376,752,- +BRDA:230,376,753,- +BRDA:230,377,754,- +BRDA:230,377,755,- +BRDA:230,378,756,- +BRDA:230,378,757,- +BRDA:230,379,758,- +BRDA:230,379,759,- +BRDA:230,380,760,- +BRDA:230,380,761,- +BRDA:230,381,762,- +BRDA:230,381,763,- +BRDA:230,382,764,- +BRDA:230,382,765,- +BRDA:230,383,766,- +BRDA:230,383,767,- +BRDA:230,384,768,- +BRDA:230,384,769,- +BRDA:230,385,770,- +BRDA:230,385,771,- +BRDA:230,386,772,- +BRDA:230,386,773,- +BRDA:230,387,774,- +BRDA:230,387,775,- +BRDA:230,388,776,- +BRDA:230,388,777,- +BRDA:230,389,778,- +BRDA:230,389,779,- +BRDA:230,390,780,- +BRDA:230,390,781,- +BRDA:230,391,782,- +BRDA:230,391,783,- +BRDA:230,392,784,- +BRDA:230,392,785,- +BRDA:230,393,786,- +BRDA:230,393,787,- +BRDA:230,394,788,- +BRDA:230,394,789,- +BRDA:230,395,790,- +BRDA:230,395,791,- +BRDA:230,396,792,- +BRDA:230,396,793,- +BRDA:230,397,794,- +BRDA:230,397,795,- +BRDA:230,398,796,- +BRDA:230,398,797,- +BRDA:230,399,798,- +BRDA:230,399,799,- +BRDA:230,400,800,- +BRDA:230,400,801,- +BRDA:230,401,802,- +BRDA:230,401,803,- +BRDA:230,402,804,- +BRDA:230,402,805,- +BRDA:230,403,806,- +BRDA:230,403,807,- +BRDA:230,404,808,- +BRDA:230,404,809,- +BRDA:230,405,810,- +BRDA:230,405,811,- +BRDA:230,406,812,- +BRDA:230,406,813,- +BRDA:230,407,814,- +BRDA:230,407,815,- +BRDA:230,408,816,- +BRDA:230,408,817,- +BRDA:230,409,818,- +BRDA:230,409,819,- +BRDA:230,410,820,- +BRDA:230,410,821,- +BRDA:230,411,822,- +BRDA:230,411,823,- +BRDA:230,412,824,- +BRDA:230,412,825,- +BRDA:230,413,826,- +BRDA:230,413,827,- +BRDA:230,414,828,- +BRDA:230,414,829,- +BRDA:230,415,830,- +BRDA:230,415,831,- +BRDA:230,416,832,- +BRDA:230,416,833,- +BRDA:230,417,834,- +BRDA:230,417,835,- +BRDA:230,418,836,- +BRDA:230,418,837,- +BRDA:230,419,838,- +BRDA:230,419,839,- +BRDA:230,420,840,- +BRDA:230,420,841,- +BRDA:230,421,842,- +BRDA:230,421,843,- +BRDA:230,422,844,- +BRDA:230,422,845,- +BRDA:230,423,846,- +BRDA:230,423,847,- +BRDA:230,424,848,- +BRDA:230,424,849,- +BRDA:230,425,850,- +BRDA:230,425,851,- +BRDA:230,426,852,- +BRDA:230,426,853,- +BRDA:230,427,854,- +BRDA:230,427,855,- +BRDA:230,428,856,- +BRDA:230,428,857,- +BRDA:230,429,858,- +BRDA:230,429,859,- +BRDA:230,430,860,- +BRDA:230,430,861,- +BRDA:230,431,862,- +BRDA:230,431,863,- +BRDA:230,432,864,- +BRDA:230,432,865,- +BRDA:230,433,866,- +BRDA:230,433,867,- +BRDA:230,434,868,- +BRDA:230,434,869,- +BRDA:230,435,870,- +BRDA:230,435,871,- +BRDA:230,436,872,- +BRDA:230,436,873,- +BRDA:230,437,874,- +BRDA:230,437,875,- +BRDA:230,438,876,- +BRDA:230,438,877,- +BRDA:230,439,878,- +BRDA:230,439,879,- +BRDA:230,440,880,- +BRDA:230,440,881,- +BRDA:230,441,882,- +BRDA:230,441,883,- +BRDA:230,442,884,- +BRDA:230,442,885,- +BRDA:230,443,886,- +BRDA:230,443,887,- +BRDA:230,444,888,- +BRDA:230,444,889,- +BRDA:230,445,890,- +BRDA:230,445,891,- +BRDA:230,446,892,- +BRDA:230,446,893,- +BRDA:230,447,894,- +BRDA:230,447,895,- +BRDA:230,448,896,- +BRDA:230,448,897,- +BRDA:230,449,898,- +BRDA:230,449,899,- +BRDA:230,450,900,- +BRDA:230,450,901,- +BRDA:230,451,902,- +BRDA:230,451,903,- +BRDA:230,452,904,- +BRDA:230,452,905,- +BRDA:230,453,906,- +BRDA:230,453,907,- +BRDA:230,454,908,- +BRDA:230,454,909,- +BRDA:230,455,910,- +BRDA:230,455,911,- +BRDA:230,456,912,- +BRDA:230,456,913,- +BRDA:230,457,914,- +BRDA:230,457,915,- +BRDA:230,458,916,- +BRDA:230,458,917,- +BRDA:230,459,918,- +BRDA:230,459,919,- +BRDA:230,460,920,- +BRDA:230,460,921,- +BRDA:230,461,922,- +BRDA:230,461,923,- +BRDA:230,462,924,- +BRDA:230,462,925,- +BRDA:230,463,926,- +BRDA:230,463,927,- +BRDA:230,464,928,- +BRDA:230,464,929,- +BRDA:230,465,930,- +BRDA:230,465,931,- +BRDA:230,466,932,- +BRDA:230,466,933,- +BRDA:230,467,934,- +BRDA:230,467,935,- +BRDA:230,468,936,- +BRDA:230,468,937,- +BRDA:230,469,938,- +BRDA:230,469,939,- +BRDA:230,470,940,- +BRDA:230,470,941,- +BRDA:230,471,942,- +BRDA:230,471,943,- +BRDA:230,472,944,- +BRDA:230,472,945,- +BRDA:230,473,946,- +BRDA:230,473,947,- +BRDA:230,474,948,- +BRDA:230,474,949,- +BRDA:230,475,950,- +BRDA:230,475,951,- +BRDA:230,476,952,- +BRDA:230,476,953,- +BRDA:230,477,954,- +BRDA:230,477,955,- +BRDA:230,478,956,- +BRDA:230,478,957,- +BRDA:230,479,958,- +BRDA:230,479,959,- +BRDA:230,480,960,- +BRDA:230,480,961,- +BRDA:230,481,962,- +BRDA:230,481,963,- +BRDA:230,482,964,- +BRDA:230,482,965,- +BRDA:230,483,966,- +BRDA:230,483,967,- +BRDA:230,484,968,- +BRDA:230,484,969,- +BRDA:230,485,970,- +BRDA:230,485,971,- +BRDA:230,486,972,- +BRDA:230,486,973,- +BRDA:230,487,974,- +BRDA:230,487,975,- +BRDA:230,488,976,- +BRDA:230,488,977,- +BRDA:230,489,978,- +BRDA:230,489,979,- +BRDA:230,490,980,- +BRDA:230,490,981,- +BRDA:230,491,982,- +BRDA:230,491,983,- +BRDA:230,492,984,- +BRDA:230,492,985,- +BRDA:230,493,986,- +BRDA:230,493,987,- +BRDA:230,494,988,- +BRDA:230,494,989,- +BRDA:230,495,990,- +BRDA:230,495,991,- +BRDA:230,496,992,- +BRDA:230,496,993,- +BRDA:230,497,994,- +BRDA:230,497,995,- +BRDA:230,498,996,- +BRDA:230,498,997,- +BRDA:230,499,998,- +BRDA:230,499,999,- +BRDA:230,500,1000,- +BRDA:230,500,1001,- +BRDA:230,501,1002,- +BRDA:230,501,1003,- +BRDA:230,502,1004,- +BRDA:230,502,1005,- +BRDA:230,503,1006,- +BRDA:230,503,1007,- +BRDA:230,504,1008,- +BRDA:230,504,1009,- +BRDA:230,505,1010,- +BRDA:230,505,1011,- +BRDA:230,506,1012,- +BRDA:230,506,1013,- +BRDA:230,507,1014,- +BRDA:230,507,1015,- +BRDA:230,508,1016,- +BRDA:230,508,1017,- +BRDA:230,509,1018,- +BRDA:230,509,1019,- +BRDA:230,510,1020,- +BRDA:230,510,1021,- +BRDA:230,511,1022,- +BRDA:230,511,1023,- +BRDA:230,512,1024,- +BRDA:230,512,1025,- +BRDA:230,513,1026,- +BRDA:230,513,1027,- +BRDA:230,514,1028,- +BRDA:230,514,1029,- +BRDA:230,515,1030,- +BRDA:230,515,1031,- +BRDA:230,516,1032,- +BRDA:230,516,1033,- +BRDA:230,517,1034,- +BRDA:230,517,1035,- +BRDA:230,518,1036,- +BRDA:230,518,1037,- +BRDA:230,519,1038,- +BRDA:230,519,1039,- +BRDA:230,520,1040,- +BRDA:230,520,1041,- +BRDA:230,521,1042,- +BRDA:230,521,1043,- +BRDA:230,522,1044,- +BRDA:230,522,1045,- +BRDA:230,523,1046,- +BRDA:230,523,1047,- +BRDA:230,524,1048,- +BRDA:230,524,1049,- +BRDA:230,525,1050,- +BRDA:230,525,1051,- +BRDA:230,526,1052,- +BRDA:230,526,1053,- +BRDA:230,527,1054,- +BRDA:230,527,1055,- +BRDA:230,528,1056,- +BRDA:230,528,1057,- +BRDA:230,529,1058,- +BRDA:230,529,1059,- +BRDA:230,530,1060,- +BRDA:230,530,1061,- +BRDA:230,531,1062,- +BRDA:230,531,1063,- +BRDA:230,532,1064,- +BRDA:230,532,1065,- +BRDA:230,533,1066,- +BRDA:230,533,1067,- +BRDA:230,534,1068,- +BRDA:230,534,1069,- +BRDA:230,535,1070,- +BRDA:230,535,1071,- +BRDA:230,536,1072,- +BRDA:230,536,1073,- +BRDA:230,537,1074,- +BRDA:230,537,1075,- +BRDA:230,538,1076,- +BRDA:230,538,1077,- +BRDA:230,539,1078,- +BRDA:230,539,1079,- +BRDA:230,540,1080,- +BRDA:230,540,1081,- +BRDA:230,541,1082,- +BRDA:230,541,1083,- +BRDA:230,542,1084,- +BRDA:230,542,1085,- +BRDA:230,543,1086,- +BRDA:230,543,1087,- +BRDA:230,544,1088,- +BRDA:230,544,1089,- +BRDA:230,545,1090,- +BRDA:230,545,1091,- +BRDA:230,546,1092,- +BRDA:230,546,1093,- +BRDA:230,547,1094,- +BRDA:230,547,1095,- +BRDA:230,548,1096,- +BRDA:230,548,1097,- +BRDA:230,549,1098,- +BRDA:230,549,1099,- +BRDA:230,550,1100,- +BRDA:230,550,1101,- +BRDA:230,551,1102,- +BRDA:230,551,1103,- +BRDA:230,552,1104,- +BRDA:230,552,1105,- +BRDA:230,553,1106,- +BRDA:230,553,1107,- +BRDA:230,554,1108,- +BRDA:230,554,1109,- +BRDA:230,555,1110,- +BRDA:230,555,1111,- +BRDA:230,556,1112,- +BRDA:230,556,1113,- +BRDA:230,557,1114,- +BRDA:230,557,1115,- +BRDA:230,558,1116,- +BRDA:230,558,1117,- +BRDA:230,559,1118,- +BRDA:230,559,1119,- +BRDA:230,560,1120,- +BRDA:230,560,1121,- +BRDA:230,561,1122,- +BRDA:230,561,1123,- +BRDA:230,562,1124,- +BRDA:230,562,1125,- +BRDA:230,563,1126,- +BRDA:230,563,1127,- +BRDA:230,564,1128,- +BRDA:230,564,1129,- +BRDA:230,565,1130,- +BRDA:230,565,1131,- +BRDA:230,566,1132,- +BRDA:230,566,1133,- +BRDA:230,567,1134,- +BRDA:230,567,1135,- +BRDA:230,568,1136,- +BRDA:230,568,1137,- +BRDA:230,569,1138,- +BRDA:230,569,1139,- +BRDA:230,570,1140,- +BRDA:230,570,1141,- +BRDA:230,571,1142,- +BRDA:230,571,1143,- +BRDA:230,572,1144,- +BRDA:230,572,1145,- +BRDA:230,573,1146,- +BRDA:230,573,1147,- +BRDA:230,574,1148,- +BRDA:230,574,1149,- +BRDA:230,575,1150,- +BRDA:230,575,1151,- +BRDA:230,576,1152,- +BRDA:230,576,1153,- +BRDA:230,577,1154,- +BRDA:230,577,1155,- +BRDA:230,578,1156,- +BRDA:230,578,1157,- +BRDA:230,579,1158,- +BRDA:230,579,1159,- +BRDA:230,580,1160,- +BRDA:230,580,1161,- +BRDA:230,581,1162,- +BRDA:230,581,1163,- +BRDA:230,582,1164,- +BRDA:230,582,1165,- +BRDA:230,583,1166,- +BRDA:230,583,1167,- +BRDA:230,584,1168,- +BRDA:230,584,1169,- +BRDA:230,585,1170,- +BRDA:230,585,1171,- +BRDA:230,586,1172,- +BRDA:230,586,1173,- +BRDA:230,587,1174,- +BRDA:230,587,1175,- +BRDA:230,588,1176,- +BRDA:230,588,1177,- +BRDA:230,589,1178,- +BRDA:230,589,1179,- +BRDA:230,590,1180,- +BRDA:230,590,1181,- +BRDA:230,591,1182,- +BRDA:230,591,1183,- +BRDA:230,592,1184,- +BRDA:230,592,1185,- +BRDA:230,593,1186,- +BRDA:230,593,1187,- +BRDA:230,594,1188,- +BRDA:230,594,1189,- +BRDA:230,595,1190,- +BRDA:230,595,1191,- +BRDA:230,596,1192,- +BRDA:230,596,1193,- +BRDA:230,597,1194,- +BRDA:230,597,1195,- +BRDA:230,598,1196,- +BRDA:230,598,1197,- +BRDA:230,599,1198,- +BRDA:230,599,1199,- +BRDA:230,600,1200,- +BRDA:230,600,1201,- +BRDA:230,601,1202,- +BRDA:230,601,1203,- +BRDA:230,602,1204,- +BRDA:230,602,1205,- +BRDA:230,603,1206,- +BRDA:230,603,1207,- +BRDA:230,604,1208,- +BRDA:230,604,1209,- +BRDA:230,605,1210,- +BRDA:230,605,1211,- +BRDA:230,606,1212,- +BRDA:230,606,1213,- +BRDA:230,607,1214,- +BRDA:230,607,1215,- +BRDA:230,608,1216,- +BRDA:230,608,1217,- +BRDA:230,609,1218,- +BRDA:230,609,1219,- +BRDA:230,610,1220,- +BRDA:230,610,1221,- +BRDA:230,611,1222,- +BRDA:230,611,1223,- +BRDA:230,612,1224,- +BRDA:230,612,1225,- +BRDA:230,613,1226,- +BRDA:230,613,1227,- +BRDA:230,614,1228,- +BRDA:230,614,1229,- +BRDA:230,615,1230,- +BRDA:230,615,1231,- +BRDA:230,616,1232,- +BRDA:230,616,1233,- +BRDA:230,617,1234,- +BRDA:230,617,1235,- +BRDA:230,618,1236,- +BRDA:230,618,1237,- +BRDA:230,619,1238,- +BRDA:230,619,1239,- +BRDA:230,620,1240,- +BRDA:230,620,1241,- +BRDA:230,621,1242,- +BRDA:230,621,1243,- +BRDA:230,622,1244,- +BRDA:230,622,1245,- +BRDA:230,623,1246,- +BRDA:230,623,1247,- +BRDA:230,624,1248,- +BRDA:230,624,1249,- +BRDA:230,625,1250,- +BRDA:230,625,1251,- +BRDA:230,626,1252,- +BRDA:230,626,1253,- +BRDA:230,627,1254,- +BRDA:230,627,1255,- +BRDA:230,628,1256,- +BRDA:230,628,1257,- +BRDA:230,629,1258,- +BRDA:230,629,1259,- +BRDA:230,630,1260,- +BRDA:230,630,1261,- +BRDA:230,631,1262,- +BRDA:230,631,1263,- +BRDA:230,632,1264,- +BRDA:230,632,1265,- +BRDA:230,633,1266,- +BRDA:230,633,1267,- +BRDA:230,634,1268,- +BRDA:230,634,1269,- +BRDA:230,635,1270,- +BRDA:230,635,1271,- +BRDA:230,636,1272,- +BRDA:230,636,1273,- +BRDA:230,637,1274,- +BRDA:230,637,1275,- +BRDA:230,638,1276,- +BRDA:230,638,1277,- +BRDA:230,639,1278,- +BRDA:230,639,1279,- +BRDA:230,640,1280,- +BRDA:230,640,1281,- +BRDA:230,641,1282,- +BRDA:230,641,1283,- +BRDA:230,642,1284,- +BRDA:230,642,1285,- +BRDA:230,643,1286,- +BRDA:230,643,1287,- +BRDA:230,644,1288,- +BRDA:230,644,1289,- +BRDA:230,645,1290,- +BRDA:230,645,1291,- +BRDA:230,646,1292,- +BRDA:230,646,1293,- +BRDA:230,647,1294,- +BRDA:230,647,1295,- +BRDA:230,648,1296,- +BRDA:230,648,1297,- +BRDA:230,649,1298,- +BRDA:230,649,1299,- +BRDA:230,650,1300,- +BRDA:230,650,1301,- +BRDA:230,651,1302,- +BRDA:230,651,1303,- +BRDA:230,652,1304,- +BRDA:230,652,1305,- +BRDA:230,653,1306,- +BRDA:230,653,1307,- +BRDA:230,654,1308,- +BRDA:230,654,1309,- +BRDA:230,655,1310,- +BRDA:230,655,1311,- +BRDA:230,656,1312,- +BRDA:230,656,1313,- +BRDA:230,657,1314,- +BRDA:230,657,1315,- +BRDA:230,658,1316,- +BRDA:230,658,1317,- +BRDA:230,659,1318,- +BRDA:230,659,1319,- +BRDA:230,660,1320,- +BRDA:230,660,1321,- +BRDA:230,661,1322,- +BRDA:230,661,1323,- +BRDA:230,662,1324,- +BRDA:230,662,1325,- +BRDA:230,663,1326,- +BRDA:230,663,1327,- +BRDA:230,664,1328,- +BRDA:230,664,1329,- +BRDA:230,665,1330,- +BRDA:230,665,1331,- +BRDA:230,666,1332,- +BRDA:230,666,1333,- +BRDA:230,667,1334,- +BRDA:230,667,1335,- +BRDA:230,668,1336,- +BRDA:230,668,1337,- +BRDA:230,669,1338,- +BRDA:230,669,1339,- +BRDA:230,670,1340,- +BRDA:230,670,1341,- +BRDA:230,671,1342,- +BRDA:230,671,1343,- +BRDA:230,672,1344,- +BRDA:230,672,1345,- +BRDA:230,673,1346,- +BRDA:230,673,1347,- +BRDA:230,674,1348,- +BRDA:230,674,1349,- +BRDA:230,675,1350,- +BRDA:230,675,1351,- +BRDA:230,676,1352,- +BRDA:230,676,1353,- +BRDA:230,677,1354,- +BRDA:230,677,1355,- +BRDA:230,678,1356,- +BRDA:230,678,1357,- +BRDA:230,679,1358,- +BRDA:230,679,1359,- +BRDA:233,0,0,- +BRDA:233,0,1,- +BRDA:233,1,2,- +BRDA:233,1,3,- +BRDA:268,0,0,48 +BRDA:268,0,1,126826 +BRDA:268,1,2,24 +BRDA:268,1,3,64880 +BRDA:268,2,4,30 +BRDA:268,2,5,47802 +BRDA:268,3,6,30 +BRDA:268,3,7,443772 +BRDA:268,4,8,42 +BRDA:268,4,9,26974 +BRDA:268,5,10,34 +BRDA:268,5,11,53284 +BRDA:268,6,12,30 +BRDA:268,6,13,24940 +BRDA:268,7,14,42 +BRDA:268,7,15,16556 +BRDA:268,8,16,24 +BRDA:268,8,17,30560 +BRDA:268,9,18,36 +BRDA:268,9,19,15010 +BRDA:268,10,20,42 +BRDA:268,10,21,25190 +BRDA:268,11,22,42 +BRDA:268,11,23,17342 +BRDA:268,12,24,18 +BRDA:268,12,25,722953 +BRDA:268,13,26,18 +BRDA:268,13,27,402696 +BRDA:268,14,28,24 +BRDA:268,14,29,271300 +BRDA:268,15,30,24 +BRDA:268,15,31,87278 +BRDA:268,16,32,24 +BRDA:268,16,33,36970 +BRDA:268,17,34,420946 +BRDA:268,17,35,0 +BRDA:268,18,36,24 +BRDA:268,18,37,8208 +BRDA:268,19,38,30 +BRDA:268,19,39,3790 +BRDA:268,20,40,24 +BRDA:268,20,41,7706 +BRDA:268,21,42,30 +BRDA:268,21,43,41031 +BRDA:268,22,44,30 +BRDA:268,22,45,48494 +BRDA:268,23,46,30 +BRDA:268,23,47,21224 +BRDA:268,24,48,30 +BRDA:268,24,49,66200 +BRDA:268,25,50,30 +BRDA:268,25,51,30702 +BRDA:268,26,52,52 +BRDA:268,26,53,2238494 +BRDA:268,27,54,30 +BRDA:268,27,55,44982 +BRDA:268,28,56,30 +BRDA:268,28,57,37344 +BRDA:268,29,58,30 +BRDA:268,29,59,37931 +BRDA:268,30,60,30 +BRDA:268,30,61,31802 +BRDA:268,31,62,30 +BRDA:268,31,63,30132 +BRDA:268,32,64,30 +BRDA:268,32,65,291940 +BRDA:268,33,66,30 +BRDA:268,33,67,42064 +BRDA:268,34,68,30 +BRDA:268,34,69,28704 +BRDA:268,35,70,34 +BRDA:268,35,71,34368 +BRDA:268,36,72,30 +BRDA:268,36,73,24942 +BRDA:268,37,74,30 +BRDA:268,37,75,93258 +BRDA:268,38,76,30 +BRDA:268,38,77,301104 +BRDA:268,39,78,24 +BRDA:268,39,79,5878347 +BRDA:268,40,80,30 +BRDA:268,40,81,1256469 +BRDA:268,41,82,24 +BRDA:268,41,83,617159 +BRDA:268,42,84,526000 +BRDA:268,42,85,0 +BRDA:268,43,86,476 +BRDA:268,43,87,0 +BRDA:268,44,88,476 +BRDA:268,44,89,0 +BRDA:268,45,90,476 +BRDA:268,45,91,0 +BRDA:268,46,92,476 +BRDA:268,46,93,0 +BRDA:268,47,94,476 +BRDA:268,47,95,0 +BRDA:268,48,96,476 +BRDA:268,48,97,0 +BRDA:268,49,98,476 +BRDA:268,49,99,0 +BRDA:268,50,100,2364 +BRDA:268,50,101,21719 +BRDA:268,51,102,884 +BRDA:268,51,103,875040 +BRDA:268,52,104,750 +BRDA:268,52,105,82364 +BRDA:268,53,106,476 +BRDA:268,53,107,0 +BRDA:268,54,108,491 +BRDA:268,54,109,100964 +BRDA:268,55,110,2245 +BRDA:268,55,111,24836 +BRDA:268,56,112,476 +BRDA:268,56,113,0 +BRDA:268,57,114,476 +BRDA:268,57,115,0 +BRDA:268,58,116,488 +BRDA:268,58,117,0 +BRDA:268,59,118,541 +BRDA:268,59,119,3063992 +BRDA:268,60,120,476 +BRDA:268,60,121,0 +BRDA:268,61,122,25416 +BRDA:268,61,123,0 +BRDA:268,62,124,1962 +BRDA:268,62,125,0 +BRDA:268,63,126,136 +BRDA:268,63,127,6649 +BRDA:268,64,128,24 +BRDA:268,64,129,2222 +BRDA:268,65,130,24 +BRDA:268,65,131,2652 +BRDA:268,66,132,24 +BRDA:268,66,133,6708 +BRDA:268,67,134,22 +BRDA:268,67,135,4164 +BRDA:268,68,136,24 +BRDA:268,68,137,3578 +BRDA:268,69,138,18 +BRDA:268,69,139,2334 +BRDA:268,70,140,18 +BRDA:268,70,141,2340 +BRDA:268,71,142,279 +BRDA:268,71,143,9107 +BRDA:268,72,144,170 +BRDA:268,72,145,8055 +BRDA:268,73,146,150 +BRDA:268,73,147,4459 +BRDA:268,74,148,24 +BRDA:268,74,149,5836 +BRDA:268,75,150,154 +BRDA:268,75,151,613 +BRDA:268,76,152,476 +BRDA:268,76,153,0 +BRDA:268,77,154,476 +BRDA:268,77,155,0 +BRDA:268,78,156,476 +BRDA:268,78,157,0 +BRDA:268,79,158,476 +BRDA:268,79,159,0 +BRDA:268,80,160,476 +BRDA:268,80,161,0 +BRDA:268,81,162,476 +BRDA:268,81,163,0 +BRDA:268,82,164,476 +BRDA:268,82,165,0 +BRDA:268,83,166,482 +BRDA:268,83,167,0 +BRDA:268,84,168,12 +BRDA:268,84,169,269585 +BRDA:268,85,170,24 +BRDA:268,85,171,70306 +BRDA:268,86,172,18 +BRDA:268,86,173,78242 +BRDA:268,87,174,97 +BRDA:268,87,175,3468550 +BRDA:268,88,176,95 +BRDA:268,88,177,18596 +BRDA:268,89,178,95 +BRDA:268,89,179,8244 +BRDA:268,90,180,474 +BRDA:268,90,181,2814 +BRDA:268,91,182,2826 +BRDA:268,91,183,12729 +BRDA:268,92,184,6 +BRDA:268,92,185,56896 +BRDA:268,93,186,36 +BRDA:268,93,187,7825 +BRDA:268,94,188,6 +BRDA:268,94,189,23610 +BRDA:268,95,190,18 +BRDA:268,95,191,1616 +BRDA:268,96,192,6 +BRDA:268,96,193,24900 +BRDA:268,97,194,24 +BRDA:268,97,195,1822683 +BRDA:268,98,196,6 +BRDA:268,98,197,107551 +BRDA:268,99,198,162 +BRDA:268,99,199,121132 +BRDA:268,100,200,6 +BRDA:268,100,201,21244 +BRDA:268,101,202,138 +BRDA:268,101,203,23130 +BRDA:268,102,204,6 +BRDA:268,102,205,13406 +BRDA:268,103,206,576 +BRDA:268,103,207,470404 +BRDA:268,104,208,162 +BRDA:268,104,209,12720 +BRDA:268,105,210,80 +BRDA:268,105,211,58573 +BRDA:268,106,212,24 +BRDA:268,106,213,37166 +BRDA:268,107,214,1406674 +BRDA:268,107,215,0 +BRDA:268,108,216,372 +BRDA:268,108,217,15690783 +BRDA:268,109,218,36 +BRDA:268,109,219,236914 +BRDA:268,110,220,18 +BRDA:268,110,221,3127745 +BRDA:268,111,222,18 +BRDA:268,111,223,46598 +BRDA:268,112,224,24 +BRDA:268,112,225,4014 +BRDA:268,113,226,18 +BRDA:268,113,227,155007 +BRDA:268,114,228,18 +BRDA:268,114,229,3514 +BRDA:268,115,230,18 +BRDA:268,115,231,2000 +BRDA:268,116,232,18 +BRDA:268,116,233,2274 +BRDA:268,117,234,30 +BRDA:268,117,235,34094 +BRDA:268,118,236,24 +BRDA:268,118,237,2524 +BRDA:268,119,238,34 +BRDA:268,119,239,2941140 +BRDA:268,120,240,18 +BRDA:268,120,241,394197 +BRDA:268,121,242,18 +BRDA:268,121,243,6512 +BRDA:268,122,244,18 +BRDA:268,122,245,6152 +BRDA:268,123,246,24 +BRDA:268,123,247,825115 +BRDA:268,124,248,24 +BRDA:268,124,249,5107078 +BRDA:268,125,250,18 +BRDA:268,125,251,128355 +BRDA:268,126,252,18 +BRDA:268,126,253,51782 +BRDA:268,127,254,30 +BRDA:268,127,255,119370 +BRDA:268,128,256,6 +BRDA:268,128,257,16590 +BRDA:268,129,258,16 +BRDA:268,129,259,16581249 +BRDA:268,130,260,14 +BRDA:268,130,261,23873828 +BRDA:268,131,262,682 +BRDA:268,131,263,1890161 +BRDA:268,132,264,820 +BRDA:268,132,265,9079194 +BRDA:268,133,266,940 +BRDA:268,133,267,1305 +BRDA:268,134,268,634 +BRDA:268,134,269,1156630 +BRDA:268,135,270,3726 +BRDA:268,135,271,76200903 +BRDA:268,136,272,150 +BRDA:268,136,273,10043255 +BRDA:268,137,274,36 +BRDA:268,137,275,1327019 +BRDA:268,138,276,172 +BRDA:268,138,277,3331 +BRDA:268,139,278,30 +BRDA:268,139,279,58177 +BRDA:268,140,280,30 +BRDA:268,140,281,111166 +BRDA:268,141,282,30 +BRDA:268,141,283,46622 +BRDA:268,142,284,34 +BRDA:268,142,285,47306 +BRDA:268,143,286,30 +BRDA:268,143,287,40376 +BRDA:268,144,288,30 +BRDA:268,144,289,34692 +BRDA:268,145,290,30 +BRDA:268,145,291,28814 +BRDA:268,146,292,30 +BRDA:268,146,293,40466 +BRDA:268,147,294,30 +BRDA:268,147,295,38777 +BRDA:268,148,296,30 +BRDA:268,148,297,29026 +BRDA:268,149,298,2658 +BRDA:268,149,299,6928496 +BRDA:268,150,300,782 +BRDA:268,150,301,8195 +BRDA:268,151,302,18 +BRDA:268,151,303,69778 +BRDA:268,152,304,6 +BRDA:268,152,305,14918 +BRDA:268,153,306,6 +BRDA:268,153,307,147095 +BRDA:268,154,308,6 +BRDA:268,154,309,133373 +BRDA:268,155,310,6 +BRDA:268,155,311,13776 +BRDA:268,156,312,6 +BRDA:268,156,313,15240 +BRDA:268,157,314,238 +BRDA:268,157,315,414 +BRDA:268,158,316,238 +BRDA:268,158,317,1526 +BRDA:268,159,318,406 +BRDA:268,159,319,520 +BRDA:268,160,320,664 +BRDA:268,160,321,2858 +BRDA:268,161,322,674 +BRDA:268,161,323,12754 +BRDA:268,162,324,128 +BRDA:268,162,325,4526309 +BRDA:268,163,326,690 +BRDA:268,163,327,11968336 +BRDA:268,164,328,766 +BRDA:268,164,329,8580212 +BRDA:268,165,330,630 +BRDA:268,165,331,154918 +BRDA:268,166,332,45 +BRDA:268,166,333,1014922 +BRDA:268,167,334,288763 +BRDA:268,167,335,4401672 +BRDA:268,168,336,556 +BRDA:268,168,337,5331580 +BRDA:268,169,338,62 +BRDA:268,169,339,5498348 +BRDA:280,0,0,6 +BRDA:280,0,1,14918 +BRDA:280,1,2,42 +BRDA:280,1,3,25190 +BRDA:280,2,4,48 +BRDA:280,2,5,126826 +BRDA:280,3,6,24 +BRDA:280,3,7,64880 +BRDA:280,4,8,30 +BRDA:280,4,9,47802 +BRDA:280,5,10,30 +BRDA:280,5,11,443772 +BRDA:280,6,12,42 +BRDA:280,6,13,26974 +BRDA:280,7,14,34 +BRDA:280,7,15,53284 +BRDA:280,8,16,30 +BRDA:280,8,17,24940 +BRDA:280,9,18,42 +BRDA:280,9,19,16556 +BRDA:280,10,20,24 +BRDA:280,10,21,30560 +BRDA:280,11,22,36 +BRDA:280,11,23,15010 +BRDA:280,12,24,30 +BRDA:280,12,25,291940 +BRDA:280,13,26,42 +BRDA:280,13,27,17342 +BRDA:280,14,28,18 +BRDA:280,14,29,722953 +BRDA:280,15,30,18 +BRDA:280,15,31,402696 +BRDA:280,16,32,24 +BRDA:280,16,33,271300 +BRDA:280,17,34,24 +BRDA:280,17,35,87278 +BRDA:280,18,36,24 +BRDA:280,18,37,36970 +BRDA:280,19,38,24 +BRDA:280,19,39,8208 +BRDA:280,20,40,30 +BRDA:280,20,41,3790 +BRDA:280,21,42,24 +BRDA:280,21,43,7706 +BRDA:280,22,44,24 +BRDA:280,22,45,5836 +BRDA:280,23,46,30 +BRDA:280,23,47,41031 +BRDA:280,24,48,30 +BRDA:280,24,49,48494 +BRDA:280,25,50,30 +BRDA:280,25,51,21224 +BRDA:280,26,52,30 +BRDA:280,26,53,66200 +BRDA:280,27,54,30 +BRDA:280,27,55,30702 +BRDA:280,28,56,52 +BRDA:280,28,57,2238494 +BRDA:280,29,58,30 +BRDA:280,29,59,44982 +BRDA:280,30,60,30 +BRDA:280,30,61,37344 +BRDA:280,31,62,30 +BRDA:280,31,63,37931 +BRDA:280,32,64,30 +BRDA:280,32,65,31802 +BRDA:280,33,66,30 +BRDA:280,33,67,30132 +BRDA:280,34,68,24 +BRDA:280,34,69,2222 +BRDA:280,35,70,30 +BRDA:280,35,71,42064 +BRDA:280,36,72,30 +BRDA:280,36,73,28704 +BRDA:280,37,74,34 +BRDA:280,37,75,34368 +BRDA:280,38,76,30 +BRDA:280,38,77,24942 +BRDA:280,39,78,30 +BRDA:280,39,79,93258 +BRDA:280,40,80,30 +BRDA:280,40,81,301104 +BRDA:280,41,82,24 +BRDA:280,41,83,5878347 +BRDA:280,42,84,30 +BRDA:280,42,85,1256469 +BRDA:280,43,86,24 +BRDA:280,43,87,617159 +BRDA:280,44,88,491 +BRDA:280,44,89,100964 +BRDA:280,45,90,476 +BRDA:280,45,91,0 +BRDA:280,46,92,476 +BRDA:280,46,93,0 +BRDA:280,47,94,476 +BRDA:280,47,95,0 +BRDA:280,48,96,476 +BRDA:280,48,97,0 +BRDA:280,49,98,476 +BRDA:280,49,99,0 +BRDA:280,50,100,476 +BRDA:280,50,101,0 +BRDA:280,51,102,2364 +BRDA:280,51,103,21719 +BRDA:280,52,104,884 +BRDA:280,52,105,875040 +BRDA:280,53,106,750 +BRDA:280,53,107,82364 +BRDA:280,54,108,526000 +BRDA:280,54,109,0 +BRDA:280,55,110,476 +BRDA:280,55,111,0 +BRDA:280,56,112,2245 +BRDA:280,56,113,24836 +BRDA:280,57,114,476 +BRDA:280,57,115,0 +BRDA:280,58,116,476 +BRDA:280,58,117,0 +BRDA:280,59,118,488 +BRDA:280,59,119,0 +BRDA:280,60,120,541 +BRDA:280,60,121,3063992 +BRDA:280,61,122,476 +BRDA:280,61,123,0 +BRDA:280,62,124,25416 +BRDA:280,62,125,0 +BRDA:280,63,126,1962 +BRDA:280,63,127,0 +BRDA:280,64,128,420946 +BRDA:280,64,129,0 +BRDA:280,65,130,154 +BRDA:280,65,131,613 +BRDA:280,66,132,24 +BRDA:280,66,133,2652 +BRDA:280,67,134,24 +BRDA:280,67,135,6708 +BRDA:280,68,136,22 +BRDA:280,68,137,4164 +BRDA:280,69,138,24 +BRDA:280,69,139,3578 +BRDA:280,70,140,18 +BRDA:280,70,141,2334 +BRDA:280,71,142,18 +BRDA:280,71,143,2340 +BRDA:280,72,144,279 +BRDA:280,72,145,9107 +BRDA:280,73,146,170 +BRDA:280,73,147,8055 +BRDA:280,74,148,150 +BRDA:280,74,149,4459 +BRDA:280,75,150,136 +BRDA:280,75,151,6649 +BRDA:280,76,152,372 +BRDA:280,76,153,15690783 +BRDA:280,77,154,476 +BRDA:280,77,155,0 +BRDA:280,78,156,476 +BRDA:280,78,157,0 +BRDA:280,79,158,476 +BRDA:280,79,159,0 +BRDA:280,80,160,476 +BRDA:280,80,161,0 +BRDA:280,81,162,476 +BRDA:280,81,163,0 +BRDA:280,82,164,476 +BRDA:280,82,165,0 +BRDA:280,83,166,476 +BRDA:280,83,167,0 +BRDA:280,84,168,482 +BRDA:280,84,169,0 +BRDA:280,85,170,476 +BRDA:280,85,171,0 +BRDA:280,86,172,6 +BRDA:280,86,173,24900 +BRDA:280,87,174,18 +BRDA:280,87,175,78242 +BRDA:280,88,176,97 +BRDA:280,88,177,3468550 +BRDA:280,89,178,95 +BRDA:280,89,179,18596 +BRDA:280,90,180,95 +BRDA:280,90,181,8244 +BRDA:280,91,182,474 +BRDA:280,91,183,2814 +BRDA:280,92,184,2826 +BRDA:280,92,185,12729 +BRDA:280,93,186,6 +BRDA:280,93,187,56896 +BRDA:280,94,188,36 +BRDA:280,94,189,7825 +BRDA:280,95,190,6 +BRDA:280,95,191,23610 +BRDA:280,96,192,12 +BRDA:280,96,193,269585 +BRDA:280,97,194,24 +BRDA:280,97,195,70306 +BRDA:280,98,196,24 +BRDA:280,98,197,1822683 +BRDA:280,99,198,6 +BRDA:280,99,199,107551 +BRDA:280,100,200,162 +BRDA:280,100,201,121132 +BRDA:280,101,202,6 +BRDA:280,101,203,21244 +BRDA:280,102,204,138 +BRDA:280,102,205,23130 +BRDA:280,103,206,6 +BRDA:280,103,207,13406 +BRDA:280,104,208,576 +BRDA:280,104,209,470404 +BRDA:280,105,210,162 +BRDA:280,105,211,12720 +BRDA:280,106,212,80 +BRDA:280,106,213,58573 +BRDA:280,107,214,24 +BRDA:280,107,215,2524 +BRDA:280,108,216,1406674 +BRDA:280,108,217,0 +BRDA:280,109,218,36 +BRDA:280,109,219,236914 +BRDA:280,110,220,18 +BRDA:280,110,221,3127745 +BRDA:280,111,222,18 +BRDA:280,111,223,46598 +BRDA:280,112,224,24 +BRDA:280,112,225,4014 +BRDA:280,113,226,18 +BRDA:280,113,227,155007 +BRDA:280,114,228,18 +BRDA:280,114,229,3514 +BRDA:280,115,230,18 +BRDA:280,115,231,2000 +BRDA:280,116,232,18 +BRDA:280,116,233,2274 +BRDA:280,117,234,24 +BRDA:280,117,235,37166 +BRDA:280,118,236,30 +BRDA:280,118,237,34094 +BRDA:280,119,238,34 +BRDA:280,119,239,2941140 +BRDA:280,120,240,18 +BRDA:280,120,241,394197 +BRDA:280,121,242,18 +BRDA:280,121,243,6512 +BRDA:280,122,244,18 +BRDA:280,122,245,6152 +BRDA:280,123,246,24 +BRDA:280,123,247,825115 +BRDA:280,124,248,24 +BRDA:280,124,249,5107078 +BRDA:280,125,250,18 +BRDA:280,125,251,128355 +BRDA:280,126,252,18 +BRDA:280,126,253,51782 +BRDA:280,127,254,18 +BRDA:280,127,255,1616 +BRDA:280,128,256,30 +BRDA:280,128,257,58177 +BRDA:280,129,258,16 +BRDA:280,129,259,16581249 +BRDA:280,130,260,14 +BRDA:280,130,261,23873828 +BRDA:280,131,262,682 +BRDA:280,131,263,1890161 +BRDA:280,132,264,820 +BRDA:280,132,265,9079194 +BRDA:280,133,266,940 +BRDA:280,133,267,1305 +BRDA:280,134,268,634 +BRDA:280,134,269,1156630 +BRDA:280,135,270,3726 +BRDA:280,135,271,76200903 +BRDA:280,136,272,150 +BRDA:280,136,273,10043255 +BRDA:280,137,274,36 +BRDA:280,137,275,1327019 +BRDA:280,138,276,30 +BRDA:280,138,277,119370 +BRDA:280,139,278,172 +BRDA:280,139,279,3331 +BRDA:280,140,280,30 +BRDA:280,140,281,111166 +BRDA:280,141,282,30 +BRDA:280,141,283,46622 +BRDA:280,142,284,34 +BRDA:280,142,285,47306 +BRDA:280,143,286,30 +BRDA:280,143,287,40376 +BRDA:280,144,288,30 +BRDA:280,144,289,34692 +BRDA:280,145,290,30 +BRDA:280,145,291,28814 +BRDA:280,146,292,30 +BRDA:280,146,293,40466 +BRDA:280,147,294,30 +BRDA:280,147,295,38777 +BRDA:280,148,296,30 +BRDA:280,148,297,29026 +BRDA:280,149,298,62 +BRDA:280,149,299,5498348 +BRDA:280,150,300,782 +BRDA:280,150,301,8195 +BRDA:280,151,302,18 +BRDA:280,151,303,69778 +BRDA:280,152,304,6 +BRDA:280,152,305,147095 +BRDA:280,153,306,6 +BRDA:280,153,307,133373 +BRDA:280,154,308,6 +BRDA:280,154,309,13776 +BRDA:280,155,310,6 +BRDA:280,155,311,15240 +BRDA:280,156,312,238 +BRDA:280,156,313,414 +BRDA:280,157,314,238 +BRDA:280,157,315,1526 +BRDA:280,158,316,406 +BRDA:280,158,317,520 +BRDA:280,159,318,664 +BRDA:280,159,319,2858 +BRDA:280,160,320,128 +BRDA:280,160,321,4526309 +BRDA:280,161,322,690 +BRDA:280,161,323,11968336 +BRDA:280,162,324,766 +BRDA:280,162,325,8580212 +BRDA:280,163,326,630 +BRDA:280,163,327,154918 +BRDA:280,164,328,45 +BRDA:280,164,329,1014922 +BRDA:280,165,330,288763 +BRDA:280,165,331,4401672 +BRDA:280,166,332,556 +BRDA:280,166,333,5331580 +BRDA:280,167,334,2658 +BRDA:280,167,335,6928496 +BRDA:280,168,336,6 +BRDA:280,168,337,16590 +BRDA:280,169,338,674 +BRDA:280,169,339,12754 +BRDA:305,0,0,0 +BRDA:305,0,1,2751709 +BRDA:313,0,0,2751709 +BRDA:313,0,1,0 +BRDA:320,0,0,1939815 +BRDA:320,0,1,811894 +BRDA:320,1,2,25237 +BRDA:320,1,3,786657 +BRDA:321,0,0,1939815 +BRDA:321,0,1,811894 +BRDA:325,0,0,0 +BRDA:325,0,1,2751709 +BRDA:329,0,0,455833 +BRDA:329,0,1,2295876 +BRDA:332,0,0,0 +BRDA:332,0,1,2751709 +BRDA:348,0,0,0 +BRDA:348,0,1,2751709 +BRDA:348,1,2,- +BRDA:348,1,3,- +BRDA:348,2,4,- +BRDA:348,2,5,- +BRDA:348,3,6,- +BRDA:348,3,7,- +BRDA:351,0,0,- +BRDA:351,0,1,- +BRDA:352,0,0,- +BRDA:352,0,1,- +BRF:1065 +BRH:338 +LF:200 +LH:126 +end_of_record +SF:/home/builder/project/lib/evmone/baseline_instruction_table.cpp +FN:33,_ZN6evmone8baseline23get_baseline_cost_tableE13evmc_revisionh +FNDA:2751709,_ZN6evmone8baseline23get_baseline_cost_tableE13evmc_revisionh +FNF:1 +FNH:1 +DA:33,2751709 +DA:34,2751709 +DA:35,2751709 +DA:36,2751709 +BRDA:34,0,0,2751709 +BRDA:34,0,1,0 +BRF:2 +BRH:1 +LF:4 +LH:4 +end_of_record +SF:/home/builder/project/lib/evmone/delegation.cpp +FN:11,_ZN6evmone20get_delegate_addressERKN4evmc13HostInterfaceERKNS0_7addressE +FNDA:2434941,_ZN6evmone20get_delegate_addressERKN4evmc13HostInterfaceERKNS0_7addressE +FNF:1 +FNH:1 +DA:11,2434941 +DA:15,2434941 +DA:16,2434941 +DA:17,2434941 +DA:19,2434941 +DA:20,2429521 +DA:23,5420 +DA:26,5420 +DA:27,5420 +DA:28,2434941 +BRDA:19,0,0,2429521 +BRDA:19,0,1,5420 +BRF:2 +BRH:2 +LF:10 +LH:10 +end_of_record +SF:/home/builder/project/lib/evmone/delegation.hpp +FN:21,_ZN6evmone17is_code_delegatedESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:3031863,_ZN6evmone17is_code_delegatedESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNF:1 +FNH:1 +DA:21,3031863 +DA:22,3031863 +DA:23,3031863 +BRF:0 +BRH:0 +LF:3 +LH:3 +end_of_record +SF:/home/builder/project/lib/evmone/execution_state.hpp +FN:50,_ZN6evmone10StackSpace6bottomEv +FN:65,_ZNK6evmone6Memory11FreeDeleterclEPh +FN:77,_ZN6evmone6Memory20handle_out_of_memoryEv +FN:80,_ZN6evmone6Memory17allocate_capacityEv +FN:88,_ZN6evmone6MemoryC2Ev +FN:90,_ZN6evmone6MemoryixEm +FN:92,_ZNK6evmone6Memory4dataEv +FN:93,_ZNK6evmone6Memory4sizeEv +FN:99,_ZN6evmone6Memory4growEm +FN:123,_ZN6evmone6Memory5clearEv +FN:185,_ZN6evmone14ExecutionStateC2ERK12evmc_message13evmc_revisionRK19evmc_host_interfaceP17evmc_host_contextSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:192,_ZN6evmone14ExecutionState5resetERK12evmc_message13evmc_revisionRK19evmc_host_interfaceP17evmc_host_contextSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:209,_ZNK6evmone14ExecutionState14in_static_modeEv +FN:212,_ZN6evmone14ExecutionState14get_tx_contextEv +FN:222,_ZN6evmone14ExecutionState23get_tx_initcode_by_hashERK12evmc_bytes32 +FN:180,_ZN6evmone14ExecutionStateC2Ev +FNDA:2751709,_ZN6evmone10StackSpace6bottomEv +FNDA:2050,_ZNK6evmone6Memory11FreeDeleterclEPh +FNDA:0,_ZN6evmone6Memory20handle_out_of_memoryEv +FNDA:6762,_ZN6evmone6Memory17allocate_capacityEv +FNDA:2050,_ZN6evmone6MemoryC2Ev +FNDA:24615049,_ZN6evmone6MemoryixEm +FNDA:0,_ZNK6evmone6Memory4dataEv +FNDA:26943361,_ZNK6evmone6Memory4sizeEv +FNDA:1803642,_ZN6evmone6Memory4growEm +FNDA:2751709,_ZN6evmone6Memory5clearEv +FNDA:0,_ZN6evmone14ExecutionStateC2ERK12evmc_message13evmc_revisionRK19evmc_host_interfaceP17evmc_host_contextSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:2751709,_ZN6evmone14ExecutionState5resetERK12evmc_message13evmc_revisionRK19evmc_host_interfaceP17evmc_host_contextSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:13945263,_ZNK6evmone14ExecutionState14in_static_modeEv +FNDA:447742,_ZN6evmone14ExecutionState14get_tx_contextEv +FNDA:0,_ZN6evmone14ExecutionState23get_tx_initcode_by_hashERK12evmc_bytes32 +FNDA:2050,_ZN6evmone14ExecutionStateC2Ev +FNF:16 +FNH:12 +DA:50,2751709 +DA:65,2050 +DA:77,0 +DA:80,6762 +DA:81,6762 +DA:82,6762 +DA:83,0 +DA:84,6762 +DA:88,2050 +DA:90,24615049 +DA:92,0 +DA:93,26943361 +DA:99,1803642 +DA:101,1803642 +DA:104,1803642 +DA:106,1803642 +DA:107,4712 +DA:108,4712 +DA:110,4712 +DA:111,1666 +DA:113,1666 +DA:114,1666 +DA:116,4712 +DA:117,4712 +DA:118,1803642 +DA:119,1803642 +DA:120,1803642 +DA:123,2751709 +DA:180,2050 +DA:185,0 +DA:186,0 +DA:192,2751709 +DA:193,2751709 +DA:194,2751709 +DA:195,2751709 +DA:196,2751709 +DA:197,2751709 +DA:198,2751709 +DA:199,2751709 +DA:200,2751709 +DA:201,2751709 +DA:202,2751709 +DA:203,2751709 +DA:204,2751709 +DA:205,2751709 +DA:206,2751709 +DA:207,2751709 +DA:209,13945263 +DA:212,447742 +DA:213,447742 +DA:214,168811 +DA:215,447742 +DA:216,447742 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:230,0 +DA:231,0 +DA:232,0 +DA:233,0 +DA:235,0 +DA:236,0 +DA:237,0 +BRDA:82,0,0,0 +BRDA:82,0,1,6762 +BRDA:101,0,0,1803642 +BRDA:101,0,1,0 +BRDA:104,0,0,1803642 +BRDA:104,0,1,0 +BRDA:106,0,0,4712 +BRDA:106,0,1,1798930 +BRDA:110,0,0,1666 +BRDA:110,0,1,3046 +BRDA:213,0,0,168811 +BRDA:213,0,1,278931 +BRDA:223,0,0,- +BRDA:223,0,1,- +BRDA:227,0,0,- +BRDA:227,0,1,- +BRDA:236,0,0,- +BRDA:236,0,1,- +BRF:18 +BRH:9 +LF:68 +LH:48 +end_of_record +SF:/home/builder/project/lib/evmone/instructions.hpp +FN:25,_ZN6evmone8StackTopC2EPN4intx4uintILj256EEE +FN:29,_ZN6evmone8StackTop3endEv +FN:34,_ZN6evmone8StackTopixEi +FN:37,_ZN6evmone8StackTop3topEv +FN:41,_ZN6evmone8StackTop3popEv +FN:44,_ZN6evmone8StackTop4pushERKN4intx4uintILj256EEE +FN:67,_ZN6evmone9num_wordsEm +FN:73,_ZN6evmone9copy_costEm +FN:87,_ZN6evmone11grow_memoryElRNS_6MemoryEm +FN:106,_ZN6evmone12check_memoryERlRNS_6MemoryERKN4intx4uintILj256EEEm +FN:123,_ZN6evmone12check_memoryERlRNS_6MemoryERKN4intx4uintILj256EEES7_ +FN:147,_ZN6evmone5instr4core4noopENS_8StackTopE +FN:161,_ZN6evmone5instr4core3addENS_8StackTopE +FN:166,_ZN6evmone5instr4core3mulENS_8StackTopE +FN:171,_ZN6evmone5instr4core3subENS_8StackTopE +FN:176,_ZN6evmone5instr4core3divENS_8StackTopE +FN:182,_ZN6evmone5instr4core4sdivENS_8StackTopE +FN:188,_ZN6evmone5instr4core3modENS_8StackTopE +FN:194,_ZN6evmone5instr4core4smodENS_8StackTopE +FN:200,_ZN6evmone5instr4core6addmodENS_8StackTopE +FN:208,_ZN6evmone5instr4core6mulmodENS_8StackTopE +FN:216,_ZN6evmone5instr4core3expENS_8StackTopElRNS_14ExecutionStateE +FN:232,_ZN6evmone5instr4core10signextendENS_8StackTopE +FN:265,_ZN6evmone5instr4core2ltENS_8StackTopE +FN:271,_ZN6evmone5instr4core2gtENS_8StackTopE +FN:277,_ZN6evmone5instr4core3sltENS_8StackTopE +FN:283,_ZN6evmone5instr4core3sgtENS_8StackTopE +FN:289,_ZN6evmone5instr4core2eqENS_8StackTopE +FN:294,_ZN6evmone5instr4core6iszeroENS_8StackTopE +FN:299,_ZN6evmone5instr4core4and_ENS_8StackTopE +FN:304,_ZN6evmone5instr4core3or_ENS_8StackTopE +FN:309,_ZN6evmone5instr4core4xor_ENS_8StackTopE +FN:314,_ZN6evmone5instr4core4not_ENS_8StackTopE +FN:319,_ZN6evmone5instr4core4byteENS_8StackTopE +FN:334,_ZN6evmone5instr4core3shlENS_8StackTopE +FN:339,_ZN6evmone5instr4core3shrENS_8StackTopE +FN:344,_ZN6evmone5instr4core3sarENS_8StackTopE +FN:356,_ZN6evmone5instr4core3clzENS_8StackTopE +FN:361,_ZN6evmone5instr4core9keccak256ENS_8StackTopElRNS_14ExecutionStateE +FN:382,_ZN6evmone5instr4core7addressENS_8StackTopERNS_14ExecutionStateE +FN:387,_ZN6evmone5instr4core7balanceENS_8StackTopElRNS_14ExecutionStateE +FN:402,_ZN6evmone5instr4core6originENS_8StackTopERNS_14ExecutionStateE +FN:407,_ZN6evmone5instr4core6callerENS_8StackTopERNS_14ExecutionStateE +FN:412,_ZN6evmone5instr4core9callvalueENS_8StackTopERNS_14ExecutionStateE +FN:417,_ZN6evmone5instr4core12calldataloadENS_8StackTopERNS_14ExecutionStateE +FN:436,_ZN6evmone5instr4core12calldatasizeENS_8StackTopERNS_14ExecutionStateE +FN:441,_ZN6evmone5instr4core12calldatacopyENS_8StackTopElRNS_14ExecutionStateE +FN:468,_ZN6evmone5instr4core8codesizeENS_8StackTopERNS_14ExecutionStateE +FN:473,_ZN6evmone5instr4core8codecopyENS_8StackTopElRNS_14ExecutionStateE +FN:504,_ZN6evmone5instr4core8gaspriceENS_8StackTopERNS_14ExecutionStateE +FN:509,_ZN6evmone5instr4core7basefeeENS_8StackTopERNS_14ExecutionStateE +FN:514,_ZN6evmone5instr4core8blobhashENS_8StackTopERNS_14ExecutionStateE +FN:524,_ZN6evmone5instr4core11blobbasefeeENS_8StackTopERNS_14ExecutionStateE +FN:529,_ZN6evmone5instr4core11extcodesizeENS_8StackTopElRNS_14ExecutionStateE +FN:544,_ZN6evmone5instr4core11extcodecopyENS_8StackTopElRNS_14ExecutionStateE +FN:577,_ZN6evmone5instr4core14returndataloadENS_8StackTopERNS_14ExecutionStateE +FN:596,_ZN6evmone5instr4core14returndatasizeENS_8StackTopERNS_14ExecutionStateE +FN:601,_ZN6evmone5instr4core14returndatacopyENS_8StackTopElRNS_14ExecutionStateE +FN:647,_ZN6evmone5instr4core11extcodehashENS_8StackTopElRNS_14ExecutionStateE +FN:663,_ZN6evmone5instr4core9blockhashENS_8StackTopERNS_14ExecutionStateE +FN:675,_ZN6evmone5instr4core8coinbaseENS_8StackTopERNS_14ExecutionStateE +FN:680,_ZN6evmone5instr4core9timestampENS_8StackTopERNS_14ExecutionStateE +FN:686,_ZN6evmone5instr4core6numberENS_8StackTopERNS_14ExecutionStateE +FN:692,_ZN6evmone5instr4core10prevrandaoENS_8StackTopERNS_14ExecutionStateE +FN:697,_ZN6evmone5instr4core8gaslimitENS_8StackTopERNS_14ExecutionStateE +FN:702,_ZN6evmone5instr4core7chainidENS_8StackTopERNS_14ExecutionStateE +FN:707,_ZN6evmone5instr4core11selfbalanceENS_8StackTopERNS_14ExecutionStateE +FN:713,_ZN6evmone5instr4core5mloadENS_8StackTopElRNS_14ExecutionStateE +FN:724,_ZN6evmone5instr4core6mstoreENS_8StackTopElRNS_14ExecutionStateE +FN:736,_ZN6evmone5instr4core7mstore8ENS_8StackTopElRNS_14ExecutionStateE +FN:753,_ZN6evmone5instr4core9jump_implERNS_14ExecutionStateERKN4intx4uintILj256EEE +FN:766,_ZN6evmone5instr4core4jumpENS_8StackTopERNS_14ExecutionStateEPKh +FN:772,_ZN6evmone5instr4core5jumpiENS_8StackTopERNS_14ExecutionStateEPKh +FN:779,_ZN6evmone5instr4core5rjumpENS_8StackTopERNS_14ExecutionStateEPKh +FN:786,_ZN6evmone5instr4core6rjumpiENS_8StackTopERNS_14ExecutionStateEPKh +FN:792,_ZN6evmone5instr4core6rjumpvENS_8StackTopERNS_14ExecutionStateEPKh +FN:813,_ZN6evmone5instr4core2pcENS_8StackTopERNS_14ExecutionStateEPKh +FN:819,_ZN6evmone5instr4core5msizeENS_8StackTopERNS_14ExecutionStateE +FN:824,_ZN6evmone5instr4core3gasENS_8StackTopElRNS_14ExecutionStateE +FN:830,_ZN6evmone5instr4core5tloadENS_8StackTopERNS_14ExecutionStateE +FN:838,_ZN6evmone5instr4core6tstoreENS_8StackTopElRNS_14ExecutionStateE +FN:849,_ZN6evmone5instr4core5push0ENS_8StackTopE +FN:865,_ZN6evmone5instr4core22load_partial_push_dataILm1EEEmPKh +FN:871,_ZN6evmone5instr4core22load_partial_push_dataILm2EEEmPKh +FN:877,_ZN6evmone5instr4core22load_partial_push_dataILm3EEEmPKh +FN:884,_ZN6evmone5instr4core22load_partial_push_dataILm4EEEmPKh +FN:957,_ZN6evmone5instr4core4dupnENS_8StackTopEPKh +FN:963,_ZN6evmone5instr4core5swapnENS_8StackTopEPKh +FN:970,_ZN6evmone5instr4core8exchangeENS_8StackTopEPKh +FN:979,_ZN6evmone5instr4core5mcopyENS_8StackTopElRNS_14ExecutionStateE +FN:1001,_ZN6evmone5instr4core8dataloadENS_8StackTopERNS_14ExecutionStateE +FN:1021,_ZN6evmone5instr4core8datasizeENS_8StackTopERNS_14ExecutionStateE +FN:1026,_ZN6evmone5instr4core9dataloadnENS_8StackTopERNS_14ExecutionStateEPKh +FN:1034,_ZN6evmone5instr4core8datacopyENS_8StackTopElRNS_14ExecutionStateE +FN:1117,_ZN6evmone5instr4core5callfENS_8StackTopERNS_14ExecutionStateEPKh +FN:1141,_ZN6evmone5instr4core4retfENS_8StackTopERNS_14ExecutionStateEPKh +FN:1148,_ZN6evmone5instr4core5jumpfENS_8StackTopERNS_14ExecutionStateEPKh +FN:1182,_ZN6evmone5instr4core10returncodeENS_8StackTopElRNS_14ExecutionStateEPKh +FN:1204,_ZN6evmone5instr4core12selfdestructENS_8StackTopElRNS_14ExecutionStateE +FN:154,_ZN6evmone5instr4core9stop_implIL16evmc_status_code0EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FN:154,_ZN6evmone5instr4core9stop_implIL16evmc_status_code4EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FN:1165,_ZN6evmone5instr4core11return_implIL16evmc_status_code0EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FN:1165,_ZN6evmone5instr4core11return_implIL16evmc_status_code2EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FN:894,_ZN6evmone5instr4core4pushILm1EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm2EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm3EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm4EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm5EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:856,_ZN6evmone5instr4core22load_partial_push_dataILm5EEEmPKh +FN:894,_ZN6evmone5instr4core4pushILm6EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:856,_ZN6evmone5instr4core22load_partial_push_dataILm6EEEmPKh +FN:894,_ZN6evmone5instr4core4pushILm7EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:856,_ZN6evmone5instr4core22load_partial_push_dataILm7EEEmPKh +FN:894,_ZN6evmone5instr4core4pushILm8EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm9EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm10EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm11EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm12EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm13EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm14EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm15EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm16EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm17EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm18EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm19EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm20EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm21EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm22EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm23EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm24EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm25EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm26EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm27EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm28EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm29EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm30EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm31EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:894,_ZN6evmone5instr4core4pushILm32EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:927,_ZN6evmone5instr4core3dupILi1EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi2EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi3EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi4EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi5EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi6EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi7EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi8EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi9EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi10EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi11EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi12EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi13EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi14EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi15EEEvNS_8StackTopE +FN:927,_ZN6evmone5instr4core3dupILi16EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi1EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi2EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi3EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi4EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi5EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi6EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi7EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi8EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi9EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi10EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi11EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi12EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi13EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi14EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi15EEEvNS_8StackTopE +FN:936,_ZN6evmone5instr4core4swapILi16EEEvNS_8StackTopE +FN:1063,_ZN6evmone5instr4core3logILm0EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:1063,_ZN6evmone5instr4core3logILm1EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:1063,_ZN6evmone5instr4core3logILm2EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:1063,_ZN6evmone5instr4core3logILm3EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:1063,_ZN6evmone5instr4core3logILm4EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:245218797,_ZN6evmone8StackTopC2EPN4intx4uintILj256EEE +FNDA:0,_ZN6evmone8StackTop3endEv +FNDA:30597077,_ZN6evmone8StackTopixEi +FNDA:144441534,_ZN6evmone8StackTop3topEv +FNDA:113273209,_ZN6evmone8StackTop3popEv +FNDA:128629533,_ZN6evmone8StackTop4pushERKN4intx4uintILj256EEE +FNDA:2034058,_ZN6evmone9num_wordsEm +FNDA:166596,_ZN6evmone9copy_costEm +FNDA:1807518,_ZN6evmone11grow_memoryElRNS_6MemoryEm +FNDA:25120369,_ZN6evmone12check_memoryERlRNS_6MemoryERKN4intx4uintILj256EEEm +FNDA:9057554,_ZN6evmone12check_memoryERlRNS_6MemoryERKN4intx4uintILj256EEES7_ +FNDA:28400137,_ZN6evmone5instr4core4noopENS_8StackTopE +FNDA:15690783,_ZN6evmone5instr4core3addENS_8StackTopE +FNDA:236914,_ZN6evmone5instr4core3mulENS_8StackTopE +FNDA:3127745,_ZN6evmone5instr4core3subENS_8StackTopE +FNDA:46598,_ZN6evmone5instr4core3divENS_8StackTopE +FNDA:4014,_ZN6evmone5instr4core4sdivENS_8StackTopE +FNDA:155007,_ZN6evmone5instr4core3modENS_8StackTopE +FNDA:3514,_ZN6evmone5instr4core4smodENS_8StackTopE +FNDA:2000,_ZN6evmone5instr4core6addmodENS_8StackTopE +FNDA:2274,_ZN6evmone5instr4core6mulmodENS_8StackTopE +FNDA:37166,_ZN6evmone5instr4core3expENS_8StackTopElRNS_14ExecutionStateE +FNDA:2524,_ZN6evmone5instr4core10signextendENS_8StackTopE +FNDA:2941140,_ZN6evmone5instr4core2ltENS_8StackTopE +FNDA:394197,_ZN6evmone5instr4core2gtENS_8StackTopE +FNDA:6512,_ZN6evmone5instr4core3sltENS_8StackTopE +FNDA:6152,_ZN6evmone5instr4core3sgtENS_8StackTopE +FNDA:825115,_ZN6evmone5instr4core2eqENS_8StackTopE +FNDA:5107078,_ZN6evmone5instr4core6iszeroENS_8StackTopE +FNDA:128355,_ZN6evmone5instr4core4and_ENS_8StackTopE +FNDA:51782,_ZN6evmone5instr4core3or_ENS_8StackTopE +FNDA:1616,_ZN6evmone5instr4core4xor_ENS_8StackTopE +FNDA:70306,_ZN6evmone5instr4core4not_ENS_8StackTopE +FNDA:78242,_ZN6evmone5instr4core4byteENS_8StackTopE +FNDA:3468550,_ZN6evmone5instr4core3shlENS_8StackTopE +FNDA:18596,_ZN6evmone5instr4core3shrENS_8StackTopE +FNDA:8244,_ZN6evmone5instr4core3sarENS_8StackTopE +FNDA:2814,_ZN6evmone5instr4core3clzENS_8StackTopE +FNDA:15525,_ZN6evmone5instr4core9keccak256ENS_8StackTopElRNS_14ExecutionStateE +FNDA:56896,_ZN6evmone5instr4core7addressENS_8StackTopERNS_14ExecutionStateE +FNDA:7837,_ZN6evmone5instr4core7balanceENS_8StackTopElRNS_14ExecutionStateE +FNDA:23610,_ZN6evmone5instr4core6originENS_8StackTopERNS_14ExecutionStateE +FNDA:269585,_ZN6evmone5instr4core6callerENS_8StackTopERNS_14ExecutionStateE +FNDA:24900,_ZN6evmone5instr4core9callvalueENS_8StackTopERNS_14ExecutionStateE +FNDA:1822683,_ZN6evmone5instr4core12calldataloadENS_8StackTopERNS_14ExecutionStateE +FNDA:107551,_ZN6evmone5instr4core12calldatasizeENS_8StackTopERNS_14ExecutionStateE +FNDA:121246,_ZN6evmone5instr4core12calldatacopyENS_8StackTopElRNS_14ExecutionStateE +FNDA:21244,_ZN6evmone5instr4core8codesizeENS_8StackTopERNS_14ExecutionStateE +FNDA:23244,_ZN6evmone5instr4core8codecopyENS_8StackTopElRNS_14ExecutionStateE +FNDA:13406,_ZN6evmone5instr4core8gaspriceENS_8StackTopERNS_14ExecutionStateE +FNDA:520,_ZN6evmone5instr4core7basefeeENS_8StackTopERNS_14ExecutionStateE +FNDA:2858,_ZN6evmone5instr4core8blobhashENS_8StackTopERNS_14ExecutionStateE +FNDA:12754,_ZN6evmone5instr4core11blobbasefeeENS_8StackTopERNS_14ExecutionStateE +FNDA:470560,_ZN6evmone5instr4core11extcodesizeENS_8StackTopElRNS_14ExecutionStateE +FNDA:12840,_ZN6evmone5instr4core11extcodecopyENS_8StackTopElRNS_14ExecutionStateE +FNDA:0,_ZN6evmone5instr4core14returndataloadENS_8StackTopERNS_14ExecutionStateE +FNDA:58573,_ZN6evmone5instr4core14returndatasizeENS_8StackTopERNS_14ExecutionStateE +FNDA:8891,_ZN6evmone5instr4core14returndatacopyENS_8StackTopElRNS_14ExecutionStateE +FNDA:3337,_ZN6evmone5instr4core11extcodehashENS_8StackTopElRNS_14ExecutionStateE +FNDA:69778,_ZN6evmone5instr4core9blockhashENS_8StackTopERNS_14ExecutionStateE +FNDA:14918,_ZN6evmone5instr4core8coinbaseENS_8StackTopERNS_14ExecutionStateE +FNDA:147095,_ZN6evmone5instr4core9timestampENS_8StackTopERNS_14ExecutionStateE +FNDA:133373,_ZN6evmone5instr4core6numberENS_8StackTopERNS_14ExecutionStateE +FNDA:13776,_ZN6evmone5instr4core10prevrandaoENS_8StackTopERNS_14ExecutionStateE +FNDA:15240,_ZN6evmone5instr4core8gaslimitENS_8StackTopERNS_14ExecutionStateE +FNDA:414,_ZN6evmone5instr4core7chainidENS_8StackTopERNS_14ExecutionStateE +FNDA:1526,_ZN6evmone5instr4core11selfbalanceENS_8StackTopERNS_14ExecutionStateE +FNDA:11969002,_ZN6evmone5instr4core5mloadENS_8StackTopElRNS_14ExecutionStateE +FNDA:8580910,_ZN6evmone5instr4core6mstoreENS_8StackTopElRNS_14ExecutionStateE +FNDA:155530,_ZN6evmone5instr4core7mstore8ENS_8StackTopElRNS_14ExecutionStateE +FNDA:6960688,_ZN6evmone5instr4core9jump_implERNS_14ExecutionStateERKN4intx4uintILj256EEE +FNDA:5332052,_ZN6evmone5instr4core4jumpENS_8StackTopERNS_14ExecutionStateEPKh +FNDA:6931134,_ZN6evmone5instr4core5jumpiENS_8StackTopERNS_14ExecutionStateEPKh +FNDA:0,_ZN6evmone5instr4core5rjumpENS_8StackTopERNS_14ExecutionStateEPKh +FNDA:0,_ZN6evmone5instr4core6rjumpiENS_8StackTopERNS_14ExecutionStateEPKh +FNDA:0,_ZN6evmone5instr4core6rjumpvENS_8StackTopERNS_14ExecutionStateEPKh +FNDA:5498348,_ZN6evmone5instr4core2pcENS_8StackTopERNS_14ExecutionStateEPKh +FNDA:16590,_ZN6evmone5instr4core5msizeENS_8StackTopERNS_14ExecutionStateE +FNDA:16581249,_ZN6evmone5instr4core3gasENS_8StackTopElRNS_14ExecutionStateE +FNDA:1890161,_ZN6evmone5instr4core5tloadENS_8StackTopERNS_14ExecutionStateE +FNDA:9079278,_ZN6evmone5instr4core6tstoreENS_8StackTopElRNS_14ExecutionStateE +FNDA:1156630,_ZN6evmone5instr4core5push0ENS_8StackTopE +FNDA:76292635,_ZN6evmone5instr4core22load_partial_push_dataILm1EEEmPKh +FNDA:10185178,_ZN6evmone5instr4core22load_partial_push_dataILm2EEEmPKh +FNDA:1428599,_ZN6evmone5instr4core22load_partial_push_dataILm3EEEmPKh +FNDA:2427034,_ZN6evmone5instr4core22load_partial_push_dataILm4EEEmPKh +FNDA:0,_ZN6evmone5instr4core4dupnENS_8StackTopEPKh +FNDA:0,_ZN6evmone5instr4core5swapnENS_8StackTopEPKh +FNDA:0,_ZN6evmone5instr4core8exchangeENS_8StackTopEPKh +FNDA:1527,_ZN6evmone5instr4core5mcopyENS_8StackTopElRNS_14ExecutionStateE +FNDA:0,_ZN6evmone5instr4core8dataloadENS_8StackTopERNS_14ExecutionStateE +FNDA:0,_ZN6evmone5instr4core8datasizeENS_8StackTopERNS_14ExecutionStateE +FNDA:0,_ZN6evmone5instr4core9dataloadnENS_8StackTopERNS_14ExecutionStateEPKh +FNDA:0,_ZN6evmone5instr4core8datacopyENS_8StackTopElRNS_14ExecutionStateE +FNDA:0,_ZN6evmone5instr4core5callfENS_8StackTopERNS_14ExecutionStateEPKh +FNDA:0,_ZN6evmone5instr4core4retfENS_8StackTopERNS_14ExecutionStateEPKh +FNDA:0,_ZN6evmone5instr4core5jumpfENS_8StackTopERNS_14ExecutionStateEPKh +FNDA:0,_ZN6evmone5instr4core10returncodeENS_8StackTopElRNS_14ExecutionStateEPKh +FNDA:7750,_ZN6evmone5instr4core12selfdestructENS_8StackTopElRNS_14ExecutionStateE +FNDA:1406674,_ZN6evmone5instr4core9stop_implIL16evmc_status_code0EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:1962,_ZN6evmone5instr4core9stop_implIL16evmc_status_code4EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:525982,_ZN6evmone5instr4core11return_implIL16evmc_status_code0EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:25321,_ZN6evmone5instr4core11return_implIL16evmc_status_code2EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:76200903,_ZN6evmone5instr4core4pushILm1EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:10043255,_ZN6evmone5instr4core4pushILm2EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:1327019,_ZN6evmone5instr4core4pushILm3EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:119370,_ZN6evmone5instr4core4pushILm4EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:58177,_ZN6evmone5instr4core4pushILm5EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:176304,_ZN6evmone5instr4core22load_partial_push_dataILm5EEEmPKh +FNDA:111166,_ZN6evmone5instr4core4pushILm6EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:207546,_ZN6evmone5instr4core22load_partial_push_dataILm6EEEmPKh +FNDA:46622,_ZN6evmone5instr4core4pushILm7EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:206837,_ZN6evmone5instr4core22load_partial_push_dataILm7EEEmPKh +FNDA:47306,_ZN6evmone5instr4core4pushILm8EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:40376,_ZN6evmone5instr4core4pushILm9EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:34692,_ZN6evmone5instr4core4pushILm10EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:28814,_ZN6evmone5instr4core4pushILm11EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:40466,_ZN6evmone5instr4core4pushILm12EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:38777,_ZN6evmone5instr4core4pushILm13EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:34094,_ZN6evmone5instr4core4pushILm14EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:29026,_ZN6evmone5instr4core4pushILm15EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:48494,_ZN6evmone5instr4core4pushILm16EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:21224,_ZN6evmone5instr4core4pushILm17EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:66200,_ZN6evmone5instr4core4pushILm18EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:30702,_ZN6evmone5instr4core4pushILm19EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:2238494,_ZN6evmone5instr4core4pushILm20EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:44982,_ZN6evmone5instr4core4pushILm21EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:37344,_ZN6evmone5instr4core4pushILm22EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:37931,_ZN6evmone5instr4core4pushILm23EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:31802,_ZN6evmone5instr4core4pushILm24EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:30132,_ZN6evmone5instr4core4pushILm25EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:41031,_ZN6evmone5instr4core4pushILm26EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:42064,_ZN6evmone5instr4core4pushILm27EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:28704,_ZN6evmone5instr4core4pushILm28EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:34368,_ZN6evmone5instr4core4pushILm29EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:24942,_ZN6evmone5instr4core4pushILm30EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:93258,_ZN6evmone5instr4core4pushILm31EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:301104,_ZN6evmone5instr4core4pushILm32EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:5878347,_ZN6evmone5instr4core3dupILi1EEEvNS_8StackTopE +FNDA:1256469,_ZN6evmone5instr4core3dupILi2EEEvNS_8StackTopE +FNDA:617159,_ZN6evmone5instr4core3dupILi3EEEvNS_8StackTopE +FNDA:291940,_ZN6evmone5instr4core3dupILi4EEEvNS_8StackTopE +FNDA:126826,_ZN6evmone5instr4core3dupILi5EEEvNS_8StackTopE +FNDA:64880,_ZN6evmone5instr4core3dupILi6EEEvNS_8StackTopE +FNDA:47802,_ZN6evmone5instr4core3dupILi7EEEvNS_8StackTopE +FNDA:443772,_ZN6evmone5instr4core3dupILi8EEEvNS_8StackTopE +FNDA:26974,_ZN6evmone5instr4core3dupILi9EEEvNS_8StackTopE +FNDA:53284,_ZN6evmone5instr4core3dupILi10EEEvNS_8StackTopE +FNDA:24940,_ZN6evmone5instr4core3dupILi11EEEvNS_8StackTopE +FNDA:16556,_ZN6evmone5instr4core3dupILi12EEEvNS_8StackTopE +FNDA:30560,_ZN6evmone5instr4core3dupILi13EEEvNS_8StackTopE +FNDA:15010,_ZN6evmone5instr4core3dupILi14EEEvNS_8StackTopE +FNDA:25190,_ZN6evmone5instr4core3dupILi15EEEvNS_8StackTopE +FNDA:17342,_ZN6evmone5instr4core3dupILi16EEEvNS_8StackTopE +FNDA:722953,_ZN6evmone5instr4core4swapILi1EEEvNS_8StackTopE +FNDA:402696,_ZN6evmone5instr4core4swapILi2EEEvNS_8StackTopE +FNDA:271300,_ZN6evmone5instr4core4swapILi3EEEvNS_8StackTopE +FNDA:87278,_ZN6evmone5instr4core4swapILi4EEEvNS_8StackTopE +FNDA:36970,_ZN6evmone5instr4core4swapILi5EEEvNS_8StackTopE +FNDA:8208,_ZN6evmone5instr4core4swapILi6EEEvNS_8StackTopE +FNDA:3790,_ZN6evmone5instr4core4swapILi7EEEvNS_8StackTopE +FNDA:7706,_ZN6evmone5instr4core4swapILi8EEEvNS_8StackTopE +FNDA:5836,_ZN6evmone5instr4core4swapILi9EEEvNS_8StackTopE +FNDA:2222,_ZN6evmone5instr4core4swapILi10EEEvNS_8StackTopE +FNDA:2652,_ZN6evmone5instr4core4swapILi11EEEvNS_8StackTopE +FNDA:6708,_ZN6evmone5instr4core4swapILi12EEEvNS_8StackTopE +FNDA:4164,_ZN6evmone5instr4core4swapILi13EEEvNS_8StackTopE +FNDA:3578,_ZN6evmone5instr4core4swapILi14EEEvNS_8StackTopE +FNDA:2334,_ZN6evmone5instr4core4swapILi15EEEvNS_8StackTopE +FNDA:2340,_ZN6evmone5instr4core4swapILi16EEEvNS_8StackTopE +FNDA:9364,_ZN6evmone5instr4core3logILm0EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:8207,_ZN6evmone5instr4core3logILm1EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:4579,_ZN6evmone5instr4core3logILm2EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:6767,_ZN6evmone5instr4core3logILm3EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:731,_ZN6evmone5instr4core3logILm4EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNF:106 +FNH:90 +DA:25,245218797 +DA:26,245218797 +DA:29,0 +DA:34,30597077 +DA:37,144441534 +DA:41,113273209 +DA:44,128629533 +DA:67,2034058 +DA:68,2034058 +DA:69,2034058 +DA:73,166596 +DA:74,166596 +DA:75,166596 +DA:76,166596 +DA:87,1807518 +DA:91,1807518 +DA:92,1807518 +DA:93,1807518 +DA:94,1807518 +DA:95,1807518 +DA:97,1807518 +DA:98,1807518 +DA:99,1803642 +DA:100,1807518 +DA:101,1807518 +DA:106,25120369 +DA:110,25120369 +DA:111,1116 +DA:113,25119253 +DA:114,25119253 +DA:115,1807518 +DA:117,25119253 +DA:118,25120369 +DA:123,9057554 +DA:124,9057554 +DA:125,4640921 +DA:130,4416633 +DA:131,1706 +DA:133,4414927 +DA:134,4416633 +DA:147,28400137 +DA:154,1408636 +DA:155,1408636 +DA:156,1408636 +DA:161,15690783 +DA:162,15690783 +DA:163,15690783 +DA:166,236914 +DA:167,236914 +DA:168,236914 +DA:171,3127745 +DA:172,3127745 +DA:173,3127745 +DA:176,46598 +DA:177,46598 +DA:178,46598 +DA:179,46598 +DA:182,4014 +DA:183,4014 +DA:184,4014 +DA:185,4014 +DA:188,155007 +DA:189,155007 +DA:190,155007 +DA:191,155007 +DA:194,3514 +DA:195,3514 +DA:196,3514 +DA:197,3514 +DA:200,2000 +DA:201,2000 +DA:202,2000 +DA:203,2000 +DA:204,2000 +DA:205,2000 +DA:208,2274 +DA:209,2274 +DA:210,2274 +DA:211,2274 +DA:212,2274 +DA:213,2274 +DA:216,37166 +DA:217,37166 +DA:218,37166 +DA:220,37166 +DA:221,37166 +DA:222,37166 +DA:223,37166 +DA:224,37166 +DA:225,0 +DA:227,37166 +DA:228,37166 +DA:229,37166 +DA:232,2524 +DA:233,2524 +DA:234,2524 +DA:236,2524 +DA:237,1060 +DA:238,1060 +DA:239,1060 +DA:240,1060 +DA:241,1060 +DA:242,1060 +DA:244,1060 +DA:245,1060 +DA:248,1060 +DA:249,1060 +DA:251,1060 +DA:252,1060 +DA:253,1060 +DA:257,1060 +DA:259,4216 +DA:260,3156 +DA:261,1060 +DA:262,2524 +DA:265,2941140 +DA:266,2941140 +DA:267,2941140 +DA:268,2941140 +DA:271,394197 +DA:272,394197 +DA:273,394197 +DA:274,394197 +DA:277,6512 +DA:278,6512 +DA:279,6512 +DA:280,6512 +DA:283,6152 +DA:284,6152 +DA:285,6152 +DA:286,6152 +DA:289,825115 +DA:290,825115 +DA:291,825115 +DA:294,5107078 +DA:295,5107078 +DA:296,5107078 +DA:299,128355 +DA:300,128355 +DA:301,128355 +DA:304,51782 +DA:305,51782 +DA:306,51782 +DA:309,1616 +DA:310,1616 +DA:311,1616 +DA:314,70306 +DA:315,70306 +DA:316,70306 +DA:319,78242 +DA:320,78242 +DA:321,78242 +DA:323,78242 +DA:324,78242 +DA:326,78242 +DA:327,78242 +DA:328,78242 +DA:329,78242 +DA:330,78242 +DA:331,78242 +DA:334,3468550 +DA:335,3468550 +DA:336,3468550 +DA:339,18596 +DA:340,18596 +DA:341,18596 +DA:344,8244 +DA:345,8244 +DA:346,8244 +DA:348,8244 +DA:349,8244 +DA:351,8244 +DA:352,8244 +DA:353,8244 +DA:356,2814 +DA:357,2814 +DA:358,2814 +DA:361,15525 +DA:362,15525 +DA:363,15525 +DA:365,15525 +DA:366,2196 +DA:368,13329 +DA:369,13329 +DA:370,13329 +DA:371,13329 +DA:372,13329 +DA:373,600 +DA:375,12729 +DA:376,12729 +DA:377,12729 +DA:378,13329 +DA:382,56896 +DA:383,56896 +DA:384,56896 +DA:387,7837 +DA:388,7837 +DA:389,7837 +DA:391,7837 +DA:392,1560 +DA:393,1560 +DA:394,12 +DA:395,1560 +DA:397,7825 +DA:398,7825 +DA:399,7837 +DA:402,23610 +DA:403,23610 +DA:404,23610 +DA:407,269585 +DA:408,269585 +DA:409,269585 +DA:412,24900 +DA:413,24900 +DA:414,24900 +DA:417,1822683 +DA:418,1822683 +DA:420,1822683 +DA:421,8084 +DA:422,1814599 +DA:423,1814599 +DA:424,1814599 +DA:425,1814599 +DA:427,1814599 +DA:428,50406693 +DA:429,48592094 +DA:431,1814599 +DA:432,1814599 +DA:433,1822683 +DA:436,107551 +DA:437,107551 +DA:438,107551 +DA:441,121246 +DA:442,121246 +DA:443,121246 +DA:444,121246 +DA:446,121246 +DA:447,108 +DA:449,121138 +DA:450,121138 +DA:451,121138 +DA:452,121138 +DA:453,121138 +DA:455,121138 +DA:456,6 +DA:458,121132 +DA:459,113235 +DA:461,121132 +DA:462,7315 +DA:464,121132 +DA:465,121138 +DA:468,21244 +DA:469,21244 +DA:470,21244 +DA:473,23244 +DA:476,23244 +DA:477,23244 +DA:478,23244 +DA:480,23244 +DA:481,108 +DA:483,23136 +DA:484,23136 +DA:485,23136 +DA:486,23136 +DA:487,23136 +DA:489,23136 +DA:490,6 +DA:493,23130 +DA:494,22808 +DA:496,23130 +DA:497,876 +DA:499,23130 +DA:500,23136 +DA:504,13406 +DA:505,13406 +DA:506,13406 +DA:509,520 +DA:510,520 +DA:511,520 +DA:514,2858 +DA:515,2858 +DA:516,2858 +DA:518,2858 +DA:519,2079 +DA:520,2858 +DA:521,2858 +DA:524,12754 +DA:525,12754 +DA:526,12754 +DA:529,470560 +DA:530,470560 +DA:531,470560 +DA:533,470560 +DA:534,4781 +DA:535,4781 +DA:536,156 +DA:537,4781 +DA:539,470404 +DA:540,470404 +DA:541,470560 +DA:544,12840 +DA:545,12840 +DA:546,12840 +DA:547,12840 +DA:548,12840 +DA:550,12840 +DA:551,96 +DA:553,12744 +DA:554,12744 +DA:555,18 +DA:557,12726 +DA:558,1038 +DA:559,1038 +DA:560,6 +DA:561,1038 +DA:563,12720 +DA:564,12532 +DA:565,12532 +DA:566,12532 +DA:567,12532 +DA:568,12532 +DA:569,12532 +DA:570,1417 +DA:571,12532 +DA:573,12720 +DA:574,12726 +DA:577,0 +DA:578,0 +DA:580,0 +DA:581,0 +DA:582,0 +DA:583,0 +DA:584,0 +DA:585,0 +DA:587,0 +DA:588,0 +DA:589,0 +DA:591,0 +DA:592,0 +DA:593,0 +DA:596,58573 +DA:597,58573 +DA:598,58573 +DA:601,8891 +DA:602,8891 +DA:603,8891 +DA:604,8891 +DA:606,8891 +DA:607,204 +DA:609,8687 +DA:610,8687 +DA:612,8687 +DA:613,0 +DA:614,0 +DA:615,0 +DA:616,0 +DA:618,0 +DA:619,0 +DA:621,0 +DA:622,0 +DA:624,0 +DA:625,0 +DA:626,0 +DA:627,8687 +DA:628,8687 +DA:629,8687 +DA:630,252 +DA:631,8435 +DA:633,8435 +DA:634,234 +DA:636,8201 +DA:637,6 +DA:639,8195 +DA:640,6712 +DA:641,8195 +DA:643,8195 +DA:644,8687 +DA:647,3337 +DA:648,3337 +DA:649,3337 +DA:651,3337 +DA:652,801 +DA:653,801 +DA:654,6 +DA:655,801 +DA:657,3331 +DA:658,3331 +DA:659,3337 +DA:663,69778 +DA:664,69778 +DA:666,69778 +DA:667,69778 +DA:668,69778 +DA:669,69778 +DA:670,69778 +DA:671,69778 +DA:672,69778 +DA:675,14918 +DA:676,14918 +DA:677,14918 +DA:680,147095 +DA:682,147095 +DA:683,147095 +DA:686,133373 +DA:688,133373 +DA:689,133373 +DA:692,13776 +DA:693,13776 +DA:694,13776 +DA:697,15240 +DA:698,15240 +DA:699,15240 +DA:702,414 +DA:703,414 +DA:704,414 +DA:707,1526 +DA:709,1526 +DA:710,1526 +DA:713,11969002 +DA:714,11969002 +DA:716,11969002 +DA:717,666 +DA:719,11968336 +DA:720,11968336 +DA:721,11969002 +DA:724,8580910 +DA:725,8580910 +DA:726,8580910 +DA:728,8580910 +DA:729,698 +DA:731,8580212 +DA:732,8580212 +DA:733,8580910 +DA:736,155530 +DA:737,155530 +DA:738,155530 +DA:740,155530 +DA:741,612 +DA:743,154918 +DA:744,154918 +DA:745,155530 +DA:753,6960688 +DA:754,6960688 +DA:755,6960688 +DA:756,3110 +DA:757,3110 +DA:758,3110 +DA:759,3110 +DA:761,6957578 +DA:762,6960688 +DA:766,5332052 +DA:767,5332052 +DA:768,5332052 +DA:772,6931134 +DA:773,6931134 +DA:774,6931134 +DA:775,6931134 +DA:776,6931134 +DA:779,0 +DA:781,0 +DA:782,0 +DA:783,0 +DA:786,0 +DA:787,0 +DA:788,0 +DA:789,0 +DA:792,0 +DA:793,0 +DA:794,0 +DA:796,0 +DA:797,0 +DA:799,0 +DA:800,0 +DA:801,0 +DA:802,0 +DA:803,0 +DA:804,0 +DA:805,0 +DA:806,0 +DA:808,0 +DA:809,0 +DA:810,0 +DA:813,5498348 +DA:814,5498348 +DA:815,5498348 +DA:816,5498348 +DA:819,16590 +DA:820,16590 +DA:821,16590 +DA:824,16581249 +DA:825,16581249 +DA:826,16581249 +DA:827,16581249 +DA:830,1890161 +DA:831,1890161 +DA:832,1890161 +DA:833,1890161 +DA:834,1890161 +DA:835,1890161 +DA:838,9079278 +DA:839,9079278 +DA:840,84 +DA:842,9079194 +DA:843,9079194 +DA:844,9079194 +DA:845,9079194 +DA:846,9079278 +DA:849,1156630 +DA:850,1156630 +DA:851,1156630 +DA:856,590687 +DA:857,590687 +DA:860,590687 +DA:861,590687 +DA:865,76292635 +DA:866,76292635 +DA:867,76292635 +DA:871,10185178 +DA:872,10185178 +DA:873,10185178 +DA:877,1428599 +DA:879,1428599 +DA:880,1428599 +DA:884,2427034 +DA:885,2427034 +DA:886,2427034 +DA:894,91352839 +DA:895,91352839 +DA:896,91352839 +DA:897,91352839 +DA:899,91352839 +DA:900,91352839 +DA:901,91352839 +DA:905,90924133 +DA:906,90924133 +DA:907,90924133 +DA:908,90924133 +DA:912,3446327 +DA:913,10973939 +DA:914,7527612 +DA:915,7527612 +DA:916,7527612 +DA:917,7527612 +DA:918,3446327 +DA:920,91352839 +DA:921,91352839 +DA:927,8937051 +DA:928,8937051 +DA:929,8937051 +DA:930,8937051 +DA:936,1570735 +DA:937,1570735 +DA:943,1570735 +DA:944,1570735 +DA:945,1570735 +DA:946,1570735 +DA:947,1570735 +DA:948,1570735 +DA:949,1570735 +DA:950,1570735 +DA:951,1570735 +DA:952,1570735 +DA:953,1570735 +DA:954,1570735 +DA:957,0 +DA:958,0 +DA:959,0 +DA:960,0 +DA:963,0 +DA:965,0 +DA:966,0 +DA:967,0 +DA:970,0 +DA:971,0 +DA:972,0 +DA:974,0 +DA:975,0 +DA:976,0 +DA:979,1527 +DA:980,1527 +DA:981,1527 +DA:982,1527 +DA:984,1527 +DA:985,150 +DA:987,1377 +DA:988,1377 +DA:989,1377 +DA:991,1377 +DA:992,72 +DA:994,1305 +DA:995,1125 +DA:997,1305 +DA:998,1377 +DA:1001,0 +DA:1002,0 +DA:1003,0 +DA:1005,0 +DA:1006,0 +DA:1007,0 +DA:1008,0 +DA:1009,0 +DA:1010,0 +DA:1012,0 +DA:1013,0 +DA:1014,0 +DA:1016,0 +DA:1017,0 +DA:1018,0 +DA:1021,0 +DA:1022,0 +DA:1023,0 +DA:1026,0 +DA:1027,0 +DA:1029,0 +DA:1030,0 +DA:1031,0 +DA:1034,0 +DA:1035,0 +DA:1036,0 +DA:1037,0 +DA:1038,0 +DA:1040,0 +DA:1041,0 +DA:1043,0 +DA:1045,0 +DA:1046,0 +DA:1047,0 +DA:1049,0 +DA:1050,0 +DA:1052,0 +DA:1053,0 +DA:1055,0 +DA:1056,0 +DA:1058,0 +DA:1059,0 +DA:1063,29648 +DA:1064,29648 +DA:1066,29648 +DA:1067,215 +DA:1069,29433 +DA:1070,29433 +DA:1072,29433 +DA:1073,536 +DA:1075,28897 +DA:1076,28897 +DA:1078,28897 +DA:1079,28897 +DA:1080,14 +DA:1082,28883 +DA:1083,28883 +DA:1084,39372 +DA:1086,28883 +DA:1087,28883 +DA:1088,28883 +DA:1089,28897 +DA:1117,0 +DA:1118,0 +DA:1119,0 +DA:1120,0 +DA:1121,0 +DA:1122,0 +DA:1123,0 +DA:1124,0 +DA:1125,0 +DA:1126,0 +DA:1128,0 +DA:1129,0 +DA:1131,0 +DA:1132,0 +DA:1133,0 +DA:1134,0 +DA:1136,0 +DA:1137,0 +DA:1138,0 +DA:1141,0 +DA:1142,0 +DA:1143,0 +DA:1144,0 +DA:1145,0 +DA:1148,0 +DA:1149,0 +DA:1150,0 +DA:1151,0 +DA:1152,0 +DA:1153,0 +DA:1154,0 +DA:1155,0 +DA:1156,0 +DA:1157,0 +DA:1159,0 +DA:1160,0 +DA:1161,0 +DA:1165,551303 +DA:1166,551303 +DA:1167,551303 +DA:1169,551303 +DA:1170,198 +DA:1172,551105 +DA:1173,551105 +DA:1174,455833 +DA:1175,551105 +DA:1176,551303 +DA:1182,0 +DA:1183,0 +DA:1184,0 +DA:1186,0 +DA:1187,0 +DA:1189,0 +DA:1190,0 +DA:1191,0 +DA:1194,0 +DA:1195,0 +DA:1196,0 +DA:1198,0 +DA:1200,0 +DA:1201,0 +DA:1204,7750 +DA:1205,7750 +DA:1206,441 +DA:1208,7309 +DA:1210,7309 +DA:1211,2132 +DA:1212,2132 +DA:1213,12 +DA:1214,2132 +DA:1216,7297 +DA:1217,7250 +DA:1218,7250 +DA:1219,3486 +DA:1222,3486 +DA:1223,771 +DA:1224,771 +DA:1225,24 +DA:1226,771 +DA:1227,3486 +DA:1228,7250 +DA:1230,7273 +DA:1231,4142 +DA:1232,4142 +DA:1233,162 +DA:1234,4142 +DA:1235,7273 +DA:1236,7297 +DA:1254,710740107 +BRDA:98,0,0,1803642 +BRDA:98,0,1,3876 +BRDA:110,0,0,480 +BRDA:110,0,1,25119889 +BRDA:110,1,2,636 +BRDA:110,1,3,25119253 +BRDA:114,0,0,1807518 +BRDA:114,0,1,23311735 +BRDA:124,0,0,4640921 +BRDA:124,0,1,4416633 +BRDA:130,0,0,622 +BRDA:130,0,1,4416011 +BRDA:130,1,2,1084 +BRDA:130,1,3,4414927 +BRDA:178,0,0,46532 +BRDA:178,0,1,66 +BRDA:184,0,0,3924 +BRDA:184,0,1,90 +BRDA:190,0,0,154941 +BRDA:190,0,1,66 +BRDA:196,0,0,3442 +BRDA:196,0,1,72 +BRDA:204,0,0,1748 +BRDA:204,0,1,252 +BRDA:212,0,0,2034 +BRDA:212,0,1,240 +BRDA:222,0,0,37080 +BRDA:222,0,1,86 +BRDA:224,0,0,0 +BRDA:224,0,1,37166 +BRDA:236,0,0,1060 +BRDA:236,0,1,1464 +BRDA:259,0,0,3156 +BRDA:259,0,1,1060 +BRDA:324,0,0,78162 +BRDA:324,0,1,80 +BRDA:349,0,0,2328 +BRDA:349,0,1,5916 +BRDA:351,0,0,3298 +BRDA:351,0,1,4946 +BRDA:365,0,0,2196 +BRDA:365,0,1,13329 +BRDA:372,0,0,600 +BRDA:372,0,1,12729 +BRDA:375,0,0,11928 +BRDA:375,0,1,801 +BRDA:391,0,0,7664 +BRDA:391,0,1,173 +BRDA:391,1,2,1560 +BRDA:391,1,3,6104 +BRDA:393,0,0,12 +BRDA:393,0,1,1548 +BRDA:420,0,0,8084 +BRDA:420,0,1,1814599 +BRDA:428,0,0,48592094 +BRDA:428,0,1,1814599 +BRDA:446,0,0,108 +BRDA:446,0,1,121138 +BRDA:450,0,0,234 +BRDA:450,0,1,120904 +BRDA:455,0,0,6 +BRDA:455,0,1,121132 +BRDA:458,0,0,113235 +BRDA:458,0,1,7897 +BRDA:461,0,0,7315 +BRDA:461,0,1,113817 +BRDA:480,0,0,108 +BRDA:480,0,1,23136 +BRDA:485,0,0,186 +BRDA:485,0,1,22950 +BRDA:489,0,0,6 +BRDA:489,0,1,23130 +BRDA:493,0,0,22808 +BRDA:493,0,1,322 +BRDA:496,0,0,876 +BRDA:496,0,1,22254 +BRDA:518,0,0,2079 +BRDA:518,0,1,779 +BRDA:533,0,0,468215 +BRDA:533,0,1,2345 +BRDA:533,1,2,4781 +BRDA:533,1,3,463434 +BRDA:535,0,0,156 +BRDA:535,0,1,4625 +BRDA:550,0,0,96 +BRDA:550,0,1,12744 +BRDA:554,0,0,18 +BRDA:554,0,1,12726 +BRDA:557,0,0,11255 +BRDA:557,0,1,1471 +BRDA:557,1,2,1038 +BRDA:557,1,3,10217 +BRDA:559,0,0,6 +BRDA:559,0,1,1032 +BRDA:563,0,0,12532 +BRDA:563,0,1,188 +BRDA:566,0,0,66 +BRDA:566,0,1,12466 +BRDA:569,0,0,1417 +BRDA:569,0,1,11115 +BRDA:580,0,0,- +BRDA:580,0,1,- +BRDA:588,0,0,- +BRDA:588,0,1,- +BRDA:606,0,0,204 +BRDA:606,0,1,8687 +BRDA:612,0,0,0 +BRDA:612,0,1,8687 +BRDA:614,0,0,- +BRDA:614,0,1,- +BRDA:618,0,0,- +BRDA:618,0,1,- +BRDA:621,0,0,- +BRDA:621,0,1,- +BRDA:624,0,0,- +BRDA:624,0,1,- +BRDA:629,0,0,252 +BRDA:629,0,1,8435 +BRDA:633,0,0,234 +BRDA:633,0,1,8201 +BRDA:636,0,0,6 +BRDA:636,0,1,8195 +BRDA:639,0,0,6712 +BRDA:639,0,1,1483 +BRDA:651,0,0,3251 +BRDA:651,0,1,86 +BRDA:651,1,2,801 +BRDA:651,1,3,2450 +BRDA:653,0,0,6 +BRDA:653,0,1,795 +BRDA:670,0,0,69716 +BRDA:670,0,1,62 +BRDA:670,1,2,69647 +BRDA:670,1,3,69 +BRDA:716,0,0,666 +BRDA:716,0,1,11968336 +BRDA:728,0,0,698 +BRDA:728,0,1,8580212 +BRDA:740,0,0,612 +BRDA:740,0,1,154918 +BRDA:755,0,0,12 +BRDA:755,0,1,6960676 +BRDA:755,1,2,3098 +BRDA:755,1,3,6957578 +BRDA:775,0,0,1628636 +BRDA:775,0,1,5302498 +BRDA:788,0,0,- +BRDA:788,0,1,- +BRDA:799,0,0,- +BRDA:799,0,1,- +BRDA:839,0,0,84 +BRDA:839,0,1,9079194 +BRDA:913,0,0,89964 +BRDA:913,0,1,44982 +BRDA:913,1,2,4476988 +BRDA:913,1,3,2238494 +BRDA:913,2,4,61404 +BRDA:913,2,5,30702 +BRDA:913,3,6,132400 +BRDA:913,3,7,66200 +BRDA:913,4,8,42448 +BRDA:913,4,9,21224 +BRDA:913,5,10,96988 +BRDA:913,5,11,48494 +BRDA:913,6,12,29026 +BRDA:913,6,13,29026 +BRDA:913,7,14,34094 +BRDA:913,7,15,34094 +BRDA:913,8,16,38777 +BRDA:913,8,17,38777 +BRDA:913,9,18,40466 +BRDA:913,9,19,40466 +BRDA:913,10,20,28814 +BRDA:913,10,21,28814 +BRDA:913,11,22,34692 +BRDA:913,11,23,34692 +BRDA:913,12,24,40376 +BRDA:913,12,25,40376 +BRDA:913,13,26,47306 +BRDA:913,13,27,47306 +BRDA:913,14,28,74688 +BRDA:913,14,29,37344 +BRDA:913,15,30,75862 +BRDA:913,15,31,37931 +BRDA:913,16,32,95406 +BRDA:913,16,33,31802 +BRDA:913,17,34,90396 +BRDA:913,17,35,30132 +BRDA:913,18,36,123093 +BRDA:913,18,37,41031 +BRDA:913,19,38,126192 +BRDA:913,19,39,42064 +BRDA:913,20,40,86112 +BRDA:913,20,41,28704 +BRDA:913,21,42,103104 +BRDA:913,21,43,34368 +BRDA:913,22,44,74826 +BRDA:913,22,45,24942 +BRDA:913,23,46,279774 +BRDA:913,23,47,93258 +BRDA:913,24,48,1204416 +BRDA:913,24,49,301104 +BRDA:984,0,0,150 +BRDA:984,0,1,1377 +BRDA:991,0,0,72 +BRDA:991,0,1,1305 +BRDA:994,0,0,1125 +BRDA:994,0,1,180 +BRDA:1005,0,0,- +BRDA:1005,0,1,- +BRDA:1013,0,0,- +BRDA:1013,0,1,- +BRDA:1040,0,0,- +BRDA:1040,0,1,- +BRDA:1045,0,0,- +BRDA:1045,0,1,- +BRDA:1049,0,0,- +BRDA:1049,0,1,- +BRDA:1052,0,0,- +BRDA:1052,0,1,- +BRDA:1055,0,0,- +BRDA:1055,0,1,- +BRDA:1066,0,0,6 +BRDA:1066,0,1,6761 +BRDA:1066,1,2,6 +BRDA:1066,1,3,4573 +BRDA:1066,2,4,36 +BRDA:1066,2,5,8171 +BRDA:1066,3,6,161 +BRDA:1066,3,7,9203 +BRDA:1066,4,8,6 +BRDA:1066,4,9,725 +BRDA:1072,0,0,108 +BRDA:1072,0,1,6653 +BRDA:1072,1,2,114 +BRDA:1072,1,3,4459 +BRDA:1072,2,4,90 +BRDA:1072,2,5,9113 +BRDA:1072,3,6,112 +BRDA:1072,3,7,613 +BRDA:1072,4,8,112 +BRDA:1072,4,9,8059 +BRDA:1079,0,0,0 +BRDA:1079,0,1,4459 +BRDA:1079,1,2,4 +BRDA:1079,1,3,8055 +BRDA:1079,2,4,4 +BRDA:1079,2,5,6649 +BRDA:1079,3,6,6 +BRDA:1079,3,7,9107 +BRDA:1079,4,8,0 +BRDA:1079,4,9,613 +BRDA:1083,0,0,8055 +BRDA:1083,0,1,8055 +BRDA:1083,1,2,0 +BRDA:1083,1,3,9107 +BRDA:1083,2,4,8918 +BRDA:1083,2,5,4459 +BRDA:1083,3,6,19947 +BRDA:1083,3,7,6649 +BRDA:1083,4,8,2452 +BRDA:1083,4,9,613 +BRDA:1086,0,0,9053 +BRDA:1086,0,1,54 +BRDA:1086,1,2,565 +BRDA:1086,1,3,48 +BRDA:1086,2,4,7995 +BRDA:1086,2,5,60 +BRDA:1086,3,6,4375 +BRDA:1086,3,7,84 +BRDA:1086,4,8,6591 +BRDA:1086,4,9,58 +BRDA:1122,0,0,- +BRDA:1122,0,1,- +BRDA:1128,0,0,- +BRDA:1128,0,1,- +BRDA:1153,0,0,- +BRDA:1153,0,1,- +BRDA:1169,0,0,84 +BRDA:1169,0,1,25237 +BRDA:1169,1,2,114 +BRDA:1169,1,3,525868 +BRDA:1173,0,0,431557 +BRDA:1173,0,1,94311 +BRDA:1173,1,2,24276 +BRDA:1173,1,3,961 +BRDA:1186,0,0,- +BRDA:1186,0,1,- +BRDA:1194,0,0,- +BRDA:1194,0,1,- +BRDA:1205,0,0,441 +BRDA:1205,0,1,7309 +BRDA:1210,0,0,7159 +BRDA:1210,0,1,150 +BRDA:1210,1,2,2132 +BRDA:1210,1,3,5027 +BRDA:1212,0,0,12 +BRDA:1212,0,1,2120 +BRDA:1216,0,0,7250 +BRDA:1216,0,1,47 +BRDA:1218,0,0,3486 +BRDA:1218,0,1,3764 +BRDA:1218,1,2,0 +BRDA:1218,1,3,7250 +BRDA:1218,2,4,3486 +BRDA:1218,2,5,3764 +BRDA:1222,0,0,771 +BRDA:1222,0,1,2715 +BRDA:1224,0,0,24 +BRDA:1224,0,1,747 +BRDA:1230,0,0,4142 +BRDA:1230,0,1,3131 +BRDA:1232,0,0,162 +BRDA:1232,0,1,3980 +BRF:222 +BRH:179 +LF:743 +LH:585 +end_of_record +SF:/home/builder/project/lib/evmone/instructions_calls.cpp +FN:79,_ZN6evmone5instr4core9call_implILNS_6OpcodeE241EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:79,_ZN6evmone5instr4core9call_implILNS_6OpcodeE250EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:79,_ZN6evmone5instr4core9call_implILNS_6OpcodeE244EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:79,_ZN6evmone5instr4core9call_implILNS_6OpcodeE242EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:197,_ZN6evmone5instr4core12extcall_implILNS_6OpcodeE248EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:197,_ZN6evmone5instr4core12extcall_implILNS_6OpcodeE251EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:197,_ZN6evmone5instr4core12extcall_implILNS_6OpcodeE249EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:317,_ZN6evmone5instr4core11create_implILNS_6OpcodeE240EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:317,_ZN6evmone5instr4core11create_implILNS_6OpcodeE245EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:389,_ZN6evmone5instr4core15create_eof_implILNS_6OpcodeE236EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateERPKh +FN:389,_ZN6evmone5instr4core15create_eof_implILNS_6OpcodeE237EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateERPKh +FN:29,instructions_calls.cpp:_ZN6evmone5instr4core12_GLOBAL__N_118get_target_addressERKN4evmc7addressERlRNS_14ExecutionStateE +FNDA:875830,_ZN6evmone5instr4core9call_implILNS_6OpcodeE241EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:3064372,_ZN6evmone5instr4core9call_implILNS_6OpcodeE250EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:101340,_ZN6evmone5instr4core9call_implILNS_6OpcodeE244EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:82986,_ZN6evmone5instr4core9call_implILNS_6OpcodeE242EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:0,_ZN6evmone5instr4core12extcall_implILNS_6OpcodeE248EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:0,_ZN6evmone5instr4core12extcall_implILNS_6OpcodeE251EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:0,_ZN6evmone5instr4core12extcall_implILNS_6OpcodeE249EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:21959,_ZN6evmone5instr4core11create_implILNS_6OpcodeE240EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:25020,_ZN6evmone5instr4core11create_implILNS_6OpcodeE245EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:0,_ZN6evmone5instr4core15create_eof_implILNS_6OpcodeE236EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateERPKh +FNDA:0,_ZN6evmone5instr4core15create_eof_implILNS_6OpcodeE237EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateERPKh +FNDA:4123634,instructions_calls.cpp:_ZN6evmone5instr4core12_GLOBAL__N_118get_target_addressERKN4evmc7addressERlRNS_14ExecutionStateE +FNF:5 +FNH:3 +DA:29,4123634 +DA:30,4123634 +DA:31,1787045 +DA:33,2336589 +DA:34,2336589 +DA:35,2331701 +DA:37,4888 +DA:38,4888 +DA:39,330 +DA:40,4888 +DA:42,4888 +DA:43,18 +DA:45,4870 +DA:46,4888 +DA:79,4124528 +DA:80,4124528 +DA:81,4124528 +DA:83,4124528 +DA:84,4124528 +DA:85,4124528 +DA:86,4124528 +DA:87,4124528 +DA:88,4124528 +DA:89,4124528 +DA:90,4124528 +DA:92,4124528 +DA:93,4124528 +DA:95,4124528 +DA:96,185712 +DA:97,185712 +DA:98,894 +DA:99,185712 +DA:101,4123634 +DA:102,4123634 +DA:103,18 +DA:105,4123616 +DA:107,4123616 +DA:108,604 +DA:110,4123012 +DA:111,276 +DA:113,4122736 +DA:114,4122736 +DA:115,4122736 +DA:116,4122736 +DA:118,4122736 +DA:119,4122736 +DA:120,4122736 +DA:121,4846 +DA:122,4117890 +DA:123,4117890 +DA:124,4122736 +DA:125,4122736 +DA:126,4122736 +DA:127,4122736 +DA:128,4122736 +DA:129,4122736 +DA:131,4122736 +DA:132,3066570 +DA:134,3066570 +DA:135,3066570 +DA:136,3066570 +DA:138,4122736 +DA:141,875392 +DA:142,875392 +DA:143,180 +DA:145,875212 +DA:146,971 +DA:147,875212 +DA:149,4122736 +DA:150,122 +DA:152,4122614 +DA:153,4122614 +DA:154,4116998 +DA:156,4122614 +DA:157,4110939 +DA:158,11675 +DA:159,74 +DA:161,4122540 +DA:162,101137 +DA:163,101137 +DA:164,101137 +DA:165,101137 +DA:167,4122540 +DA:168,150 +DA:170,4122390 +DA:171,745 +DA:173,4121645 +DA:174,4121645 +DA:175,4121645 +DA:177,4121645 +DA:178,135687 +DA:180,4121645 +DA:181,4121645 +DA:182,4121645 +DA:183,4121645 +DA:184,4122390 +DA:197,0 +DA:198,0 +DA:200,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:204,0 +DA:206,0 +DA:207,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:214,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:219,0 +DA:220,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:226,0 +DA:228,0 +DA:229,0 +DA:231,0 +DA:232,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:247,0 +DA:248,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:254,0 +DA:257,0 +DA:258,0 +DA:259,0 +DA:261,0 +DA:262,0 +DA:263,0 +DA:265,0 +DA:266,0 +DA:268,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:274,0 +DA:275,0 +DA:276,0 +DA:279,0 +DA:283,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:288,0 +DA:289,0 +DA:290,0 +DA:291,0 +DA:293,0 +DA:294,0 +DA:295,0 +DA:296,0 +DA:297,0 +DA:298,0 +DA:299,0 +DA:300,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:317,46979 +DA:318,46979 +DA:320,46979 +DA:321,62 +DA:323,46917 +DA:324,46917 +DA:325,46917 +DA:326,46917 +DA:328,46917 +DA:329,46917 +DA:331,46917 +DA:332,246 +DA:334,46671 +DA:335,46671 +DA:337,46671 +DA:338,56 +DA:340,46615 +DA:341,46615 +DA:342,46615 +DA:343,60 +DA:345,46555 +DA:346,12 +DA:348,46543 +DA:349,46543 +DA:350,72 +DA:352,46471 +DA:353,46471 +DA:354,46471 +DA:355,45205 +DA:357,46471 +DA:358,45841 +DA:360,45841 +DA:361,45841 +DA:363,45841 +DA:364,0 +DA:366,0 +DA:367,0 +DA:368,0 +DA:369,45841 +DA:370,46471 +DA:371,46471 +DA:372,46471 +DA:373,46471 +DA:375,46471 +DA:376,46471 +DA:377,46471 +DA:379,46471 +DA:380,46471 +DA:381,44641 +DA:383,46471 +DA:384,46471 +DA:389,0 +DA:390,0 +DA:392,0 +DA:393,0 +DA:395,0 +DA:396,0 +DA:397,0 +DA:398,0 +DA:399,0 +DA:400,0 +DA:402,0 +DA:403,0 +DA:405,0 +DA:406,0 +DA:408,0 +DA:409,0 +DA:411,0 +DA:412,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:418,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:427,0 +DA:428,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:434,0 +DA:435,0 +DA:436,0 +DA:437,0 +DA:438,0 +DA:439,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:445,0 +DA:446,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:451,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:462,0 +DA:463,0 +DA:465,0 +DA:466,0 +DA:467,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:473,0 +DA:474,0 +BRDA:30,0,0,1787045 +BRDA:30,0,1,2336589 +BRDA:34,0,0,2331701 +BRDA:34,0,1,4888 +BRDA:38,0,0,330 +BRDA:38,0,1,4558 +BRDA:42,0,0,18 +BRDA:42,0,1,4870 +BRDA:85,0,0,0 +BRDA:85,0,1,875830 +BRDA:85,1,2,0 +BRDA:85,1,3,82986 +BRDA:85,2,4,0 +BRDA:85,2,5,101340 +BRDA:85,3,6,3064372 +BRDA:85,3,7,0 +BRDA:85,4,8,0 +BRDA:85,4,9,875830 +BRDA:85,5,10,0 +BRDA:85,5,11,82986 +BRDA:85,6,12,101340 +BRDA:85,6,13,0 +BRDA:85,7,14,- +BRDA:85,7,15,- +BRDA:95,0,0,99968 +BRDA:95,0,1,1372 +BRDA:95,1,2,80816 +BRDA:95,1,3,2170 +BRDA:95,2,4,3063278 +BRDA:95,2,5,1094 +BRDA:95,3,6,832803 +BRDA:95,3,7,43027 +BRDA:95,4,8,103242 +BRDA:95,4,9,729561 +BRDA:95,5,10,30962 +BRDA:95,5,11,69006 +BRDA:95,6,12,20026 +BRDA:95,6,13,3043252 +BRDA:95,7,14,31482 +BRDA:95,7,15,49334 +BRDA:97,0,0,198 +BRDA:97,0,1,103044 +BRDA:97,1,2,168 +BRDA:97,1,3,30794 +BRDA:97,2,4,168 +BRDA:97,2,5,19858 +BRDA:97,3,6,360 +BRDA:97,3,7,31122 +BRDA:102,0,0,6 +BRDA:102,0,1,875626 +BRDA:102,1,2,4 +BRDA:102,1,3,101168 +BRDA:102,2,4,4 +BRDA:102,2,5,3064200 +BRDA:102,3,6,4 +BRDA:102,3,7,82622 +BRDA:107,0,0,142 +BRDA:107,0,1,3064058 +BRDA:107,1,2,168 +BRDA:107,1,3,82454 +BRDA:107,2,4,162 +BRDA:107,2,5,875464 +BRDA:107,3,6,132 +BRDA:107,3,7,101036 +BRDA:110,0,0,72 +BRDA:110,0,1,875392 +BRDA:110,1,2,66 +BRDA:110,1,3,82388 +BRDA:110,2,4,72 +BRDA:110,2,5,100964 +BRDA:110,3,6,66 +BRDA:110,3,7,3063992 +BRDA:119,0,0,3063992 +BRDA:119,0,1,0 +BRDA:119,1,2,0 +BRDA:119,1,3,875392 +BRDA:119,2,4,0 +BRDA:119,2,5,100964 +BRDA:119,3,6,0 +BRDA:119,3,7,82388 +BRDA:120,0,0,102 +BRDA:120,0,1,3063890 +BRDA:120,1,2,4484 +BRDA:120,1,3,870908 +BRDA:120,2,4,110 +BRDA:120,2,5,82278 +BRDA:120,3,6,150 +BRDA:120,3,7,100814 +BRDA:125,0,0,0 +BRDA:125,0,1,100964 +BRDA:125,1,2,0 +BRDA:125,1,3,3063992 +BRDA:125,2,4,0 +BRDA:125,2,5,82388 +BRDA:125,3,6,875392 +BRDA:125,3,7,0 +BRDA:125,4,8,- +BRDA:125,4,9,- +BRDA:125,5,10,0 +BRDA:125,5,11,100964 +BRDA:125,6,12,3063992 +BRDA:125,6,13,0 +BRDA:125,7,14,0 +BRDA:125,7,15,82388 +BRDA:127,0,0,100964 +BRDA:127,0,1,0 +BRDA:127,1,2,0 +BRDA:127,1,3,3063992 +BRDA:127,2,4,0 +BRDA:127,2,5,82388 +BRDA:127,3,6,0 +BRDA:127,3,7,875392 +BRDA:129,0,0,100964 +BRDA:129,0,1,0 +BRDA:129,1,2,0 +BRDA:129,1,3,82388 +BRDA:129,2,4,0 +BRDA:129,2,5,875392 +BRDA:129,3,6,0 +BRDA:129,3,7,3063992 +BRDA:131,0,0,635478 +BRDA:131,0,1,239914 +BRDA:131,1,2,47618 +BRDA:131,1,3,34770 +BRDA:131,2,4,41506 +BRDA:131,2,5,59458 +BRDA:131,3,6,2341968 +BRDA:131,3,7,722024 +BRDA:138,0,0,91191 +BRDA:138,0,1,784201 +BRDA:138,1,2,10248 +BRDA:138,1,3,72140 +BRDA:138,2,4,0 +BRDA:138,2,5,100964 +BRDA:138,3,6,0 +BRDA:138,3,7,3063992 +BRDA:142,0,0,91191 +BRDA:142,0,1,784201 +BRDA:142,1,2,180 +BRDA:142,1,3,91011 +BRDA:145,0,0,91011 +BRDA:145,0,1,784201 +BRDA:145,1,2,9513 +BRDA:145,1,3,774688 +BRDA:145,2,4,971 +BRDA:145,2,5,99553 +BRDA:149,0,0,0 +BRDA:149,0,1,3063992 +BRDA:149,1,2,24 +BRDA:149,1,3,82364 +BRDA:149,2,4,0 +BRDA:149,2,5,100964 +BRDA:149,3,6,98 +BRDA:149,3,7,875294 +BRDA:153,0,0,3060934 +BRDA:153,0,1,3058 +BRDA:153,1,2,82130 +BRDA:153,1,3,234 +BRDA:153,2,4,873096 +BRDA:153,2,5,2198 +BRDA:153,3,6,100838 +BRDA:153,3,7,126 +BRDA:156,0,0,100690 +BRDA:156,0,1,274 +BRDA:156,1,2,864509 +BRDA:156,1,3,10785 +BRDA:156,2,4,3063992 +BRDA:156,2,5,0 +BRDA:156,3,6,81748 +BRDA:156,3,7,616 +BRDA:158,0,0,74 +BRDA:158,0,1,10711 +BRDA:158,1,2,- +BRDA:158,1,3,- +BRDA:158,2,4,0 +BRDA:158,2,5,616 +BRDA:158,3,6,0 +BRDA:158,3,7,274 +BRDA:161,0,0,90913 +BRDA:161,0,1,784307 +BRDA:161,1,2,10224 +BRDA:161,1,3,72140 +BRDA:161,2,4,0 +BRDA:161,2,5,100964 +BRDA:161,3,6,0 +BRDA:161,3,7,3063992 +BRDA:167,0,0,62 +BRDA:167,0,1,875158 +BRDA:167,1,2,4 +BRDA:167,1,3,82360 +BRDA:167,2,4,28 +BRDA:167,2,5,100936 +BRDA:167,3,6,56 +BRDA:167,3,7,3063936 +BRDA:170,0,0,10220 +BRDA:170,0,1,72140 +BRDA:170,1,2,134 +BRDA:170,1,3,82226 +BRDA:170,2,4,611 +BRDA:170,2,5,874547 +BRDA:170,3,6,90869 +BRDA:170,3,7,784289 +BRDA:170,4,8,0 +BRDA:170,4,9,3063936 +BRDA:170,5,10,0 +BRDA:170,5,11,100936 +BRDA:170,6,12,0 +BRDA:170,6,13,100936 +BRDA:170,7,14,0 +BRDA:170,7,15,3063936 +BRDA:170,8,16,- +BRDA:170,8,17,- +BRDA:170,9,18,134 +BRDA:170,9,19,10086 +BRDA:170,10,20,611 +BRDA:170,10,21,90258 +BRDA:170,11,22,- +BRDA:170,11,23,- +BRDA:177,0,0,9271 +BRDA:177,0,1,72955 +BRDA:177,1,2,23097 +BRDA:177,1,3,3040839 +BRDA:177,2,4,4161 +BRDA:177,2,5,96775 +BRDA:177,3,6,99158 +BRDA:177,3,7,775389 +BRDA:203,0,0,- +BRDA:203,0,1,- +BRDA:203,1,2,- +BRDA:203,1,3,- +BRDA:203,2,4,- +BRDA:203,2,5,- +BRDA:203,3,6,- +BRDA:203,3,7,- +BRDA:203,4,8,- +BRDA:203,4,9,- +BRDA:203,5,10,- +BRDA:203,5,11,- +BRDA:211,0,0,- +BRDA:211,0,1,- +BRDA:211,1,2,- +BRDA:211,1,3,- +BRDA:211,2,4,- +BRDA:211,2,5,- +BRDA:216,0,0,- +BRDA:216,0,1,- +BRDA:216,1,2,- +BRDA:216,1,3,- +BRDA:216,2,4,- +BRDA:216,2,5,- +BRDA:218,0,0,- +BRDA:218,0,1,- +BRDA:218,1,2,- +BRDA:218,1,3,- +BRDA:218,2,4,- +BRDA:218,2,5,- +BRDA:223,0,0,- +BRDA:223,0,1,- +BRDA:223,1,2,- +BRDA:223,1,3,- +BRDA:223,2,4,- +BRDA:223,2,5,- +BRDA:228,0,0,- +BRDA:228,0,1,- +BRDA:228,1,2,- +BRDA:228,1,3,- +BRDA:228,2,4,- +BRDA:228,2,5,- +BRDA:235,0,0,- +BRDA:235,0,1,- +BRDA:235,1,2,- +BRDA:235,1,3,- +BRDA:235,2,4,- +BRDA:235,2,5,- +BRDA:236,0,0,- +BRDA:236,0,1,- +BRDA:236,1,2,- +BRDA:236,1,3,- +BRDA:236,2,4,- +BRDA:236,2,5,- +BRDA:241,0,0,- +BRDA:241,0,1,- +BRDA:241,1,2,- +BRDA:241,1,3,- +BRDA:241,2,4,- +BRDA:241,2,5,- +BRDA:243,0,0,- +BRDA:243,0,1,- +BRDA:243,1,2,- +BRDA:243,1,3,- +BRDA:243,2,4,- +BRDA:243,2,5,- +BRDA:245,0,0,- +BRDA:245,0,1,- +BRDA:245,1,2,- +BRDA:245,1,3,- +BRDA:245,2,4,- +BRDA:245,2,5,- +BRDA:247,0,0,- +BRDA:247,0,1,- +BRDA:247,1,2,- +BRDA:247,1,3,- +BRDA:247,2,4,- +BRDA:247,2,5,- +BRDA:254,0,0,- +BRDA:254,0,1,- +BRDA:254,1,2,- +BRDA:254,1,3,- +BRDA:254,2,4,- +BRDA:254,2,5,- +BRDA:258,0,0,- +BRDA:258,0,1,- +BRDA:258,1,2,- +BRDA:258,1,3,- +BRDA:261,0,0,- +BRDA:261,0,1,- +BRDA:261,1,2,- +BRDA:261,1,3,- +BRDA:265,0,0,- +BRDA:265,0,1,- +BRDA:265,1,2,- +BRDA:265,1,3,- +BRDA:265,2,4,- +BRDA:265,2,5,- +BRDA:270,0,0,- +BRDA:270,0,1,- +BRDA:270,1,2,- +BRDA:270,1,3,- +BRDA:270,2,4,- +BRDA:270,2,5,- +BRDA:270,3,6,- +BRDA:270,3,7,- +BRDA:270,4,8,- +BRDA:270,4,9,- +BRDA:270,5,10,- +BRDA:270,5,11,- +BRDA:270,6,12,- +BRDA:270,6,13,- +BRDA:270,7,14,- +BRDA:270,7,15,- +BRDA:270,8,16,- +BRDA:270,8,17,- +BRDA:271,0,0,- +BRDA:271,0,1,- +BRDA:271,1,2,- +BRDA:271,1,3,- +BRDA:271,2,4,- +BRDA:271,2,5,- +BRDA:272,0,0,- +BRDA:272,0,1,- +BRDA:272,1,2,- +BRDA:272,1,3,- +BRDA:272,2,4,- +BRDA:272,2,5,- +BRDA:286,0,0,- +BRDA:286,0,1,- +BRDA:295,0,0,- +BRDA:295,0,1,- +BRDA:295,1,2,- +BRDA:295,1,3,- +BRDA:295,2,4,- +BRDA:295,2,5,- +BRDA:297,0,0,- +BRDA:297,0,1,- +BRDA:297,1,2,- +BRDA:297,1,3,- +BRDA:297,2,4,- +BRDA:297,2,5,- +BRDA:320,0,0,44 +BRDA:320,0,1,21915 +BRDA:320,1,2,18 +BRDA:320,1,3,25002 +BRDA:326,0,0,0 +BRDA:326,0,1,21915 +BRDA:326,1,2,25002 +BRDA:326,1,3,0 +BRDA:331,0,0,138 +BRDA:331,0,1,21777 +BRDA:331,1,2,108 +BRDA:331,1,3,24894 +BRDA:337,0,0,16120 +BRDA:337,0,1,5657 +BRDA:337,1,2,21298 +BRDA:337,1,3,3596 +BRDA:337,2,4,34 +BRDA:337,2,5,16086 +BRDA:337,3,6,22 +BRDA:337,3,7,21276 +BRDA:342,0,0,24 +BRDA:342,0,1,21719 +BRDA:342,1,2,36 +BRDA:342,1,3,24836 +BRDA:345,0,0,4 +BRDA:345,0,1,21715 +BRDA:345,1,2,8 +BRDA:345,1,3,24828 +BRDA:348,0,0,2451 +BRDA:348,0,1,19264 +BRDA:348,1,2,60 +BRDA:348,1,3,21655 +BRDA:348,2,4,12 +BRDA:348,2,5,24816 +BRDA:348,3,6,2034 +BRDA:348,3,7,22794 +BRDA:349,0,0,60 +BRDA:349,0,1,2391 +BRDA:349,1,2,12 +BRDA:349,1,3,2022 +BRDA:354,0,0,24816 +BRDA:354,0,1,0 +BRDA:354,1,2,20389 +BRDA:354,1,3,1266 +BRDA:357,0,0,24410 +BRDA:357,0,1,406 +BRDA:357,1,2,21431 +BRDA:357,1,3,224 +BRDA:363,0,0,0 +BRDA:363,0,1,24410 +BRDA:363,1,2,0 +BRDA:363,1,3,21431 +BRDA:366,0,0,- +BRDA:366,0,1,- +BRDA:366,1,2,- +BRDA:366,1,3,- +BRDA:380,0,0,20731 +BRDA:380,0,1,924 +BRDA:380,1,2,23910 +BRDA:380,1,3,906 +BRDA:392,0,0,- +BRDA:392,0,1,- +BRDA:392,1,2,- +BRDA:392,1,3,- +BRDA:396,0,0,- +BRDA:396,0,1,- +BRDA:396,1,2,- +BRDA:396,1,3,- +BRDA:405,0,0,- +BRDA:405,0,1,- +BRDA:405,1,2,- +BRDA:405,1,3,- +BRDA:408,0,0,- +BRDA:408,0,1,- +BRDA:408,1,2,- +BRDA:408,1,3,- +BRDA:411,0,0,- +BRDA:411,0,1,- +BRDA:411,1,2,- +BRDA:411,1,3,- +BRDA:414,0,0,- +BRDA:414,0,1,- +BRDA:414,1,2,- +BRDA:414,1,3,- +BRDA:414,2,4,- +BRDA:414,2,5,- +BRDA:414,3,6,- +BRDA:414,3,7,- +BRDA:415,0,0,- +BRDA:415,0,1,- +BRDA:415,1,2,- +BRDA:415,1,3,- +BRDA:430,0,0,- +BRDA:430,0,1,- +BRDA:434,0,0,- +BRDA:434,0,1,- +BRDA:441,0,0,- +BRDA:441,0,1,- +BRDA:450,0,0,- +BRDA:450,0,1,- +BRDA:450,1,2,- +BRDA:450,1,3,- +BRDA:470,0,0,- +BRDA:470,0,1,- +BRDA:470,1,2,- +BRDA:470,1,3,- +BRF:162 +BRH:88 +LF:283 +LH:143 +end_of_record +SF:/home/builder/project/lib/evmone/instructions_storage.cpp +FN:98,_ZN6evmone5instr4core5sloadENS_8StackTopElRNS_14ExecutionStateE +FN:119,_ZN6evmone5instr4core6sstoreENS_8StackTopElRNS_14ExecutionStateE +FNDA:1014945,_ZN6evmone5instr4core5sloadENS_8StackTopElRNS_14ExecutionStateE +FNDA:4690417,_ZN6evmone5instr4core6sstoreENS_8StackTopElRNS_14ExecutionStateE +FNF:2 +FNH:2 +DA:98,1014945 +DA:99,1014945 +DA:100,1014945 +DA:102,1014945 +DA:103,1014945 +DA:104,614082 +DA:107,614082 +DA:108,614082 +DA:109,614082 +DA:110,23 +DA:111,614082 +DA:113,1014922 +DA:115,1014922 +DA:116,1014945 +DA:119,4690417 +DA:120,4690417 +DA:121,221353 +DA:123,4469064 +DA:124,33432 +DA:126,4435632 +DA:127,4435632 +DA:129,4435632 +DA:130,4435632 +DA:131,4435632 +DA:132,1449305 +DA:133,4435632 +DA:134,4435632 +DA:136,4435632 +DA:137,4435632 +DA:138,4435632 +DA:139,33960 +DA:140,4401672 +DA:141,4401672 +DA:142,4435632 +BRDA:102,0,0,614082 +BRDA:102,0,1,400863 +BRDA:102,1,2,1014516 +BRDA:102,1,3,429 +BRDA:103,0,0,614082 +BRDA:103,0,1,400434 +BRDA:109,0,0,23 +BRDA:109,0,1,614059 +BRDA:120,0,0,221353 +BRDA:120,0,1,4469064 +BRDA:123,0,0,4445505 +BRDA:123,0,1,23559 +BRDA:123,1,2,33432 +BRDA:123,1,3,4412073 +BRDA:130,0,0,4400746 +BRDA:130,0,1,34886 +BRDA:131,0,0,1449305 +BRDA:131,0,1,2951441 +BRDA:138,0,0,33960 +BRDA:138,0,1,4401672 +BRF:20 +BRH:20 +LF:34 +LH:34 +end_of_record +SF:/home/builder/project/lib/evmone/instructions_xmacro.hpp +FNF:0 +FNH:0 +DA:7,713450780 +DA:35,2751709 +DA:36,18442492 +DA:37,15690783 +DA:38,5879454 +DA:39,3127745 +DA:40,2755723 +DA:41,2906716 +DA:42,2755223 +DA:43,2753709 +DA:44,2753983 +DA:45,2788875 +DA:46,2754233 +DA:47,2751709 +DA:48,2751709 +DA:49,2751709 +DA:50,2751709 +DA:51,2524 +DA:52,5692849 +DA:53,3145906 +DA:54,2758221 +DA:55,2757861 +DA:56,3576824 +DA:57,7858787 +DA:58,5107078 +DA:59,2803491 +DA:60,2753325 +DA:61,2822015 +DA:62,2829951 +DA:63,6220259 +DA:64,3468550 +DA:65,2759953 +DA:66,2754523 +DA:67,2751709 +DA:68,2814 +DA:69,2764438 +DA:70,2751709 +DA:71,2751709 +DA:72,2751709 +DA:73,2751709 +DA:74,2751709 +DA:75,2751709 +DA:76,2751709 +DA:77,2751709 +DA:78,2751709 +DA:79,2751709 +DA:80,2751709 +DA:81,2751709 +DA:82,2751709 +DA:83,2751709 +DA:84,2751709 +DA:85,12729 +DA:86,2808605 +DA:87,2759534 +DA:88,2775319 +DA:89,3021294 +DA:90,2776609 +DA:91,4574392 +DA:92,2859260 +DA:93,2872841 +DA:94,2772953 +DA:95,2774839 +DA:96,2765115 +DA:97,3222113 +DA:98,2764429 +DA:99,2810282 +DA:100,2759904 +DA:101,2755040 +DA:102,3331 +DA:103,2821487 +DA:104,2766627 +DA:105,2898804 +DA:106,2885082 +DA:107,2765485 +DA:108,2766949 +DA:109,2752123 +DA:110,2753235 +DA:111,2752229 +DA:112,2754567 +DA:113,2764463 +DA:114,2751709 +DA:115,2751709 +DA:116,2751709 +DA:117,2751709 +DA:118,2751709 +DA:119,12754 +DA:120,7278018 +DA:121,14720045 +DA:122,11968336 +DA:123,8580212 +DA:124,3766631 +DA:125,7153381 +DA:126,8083289 +DA:127,9680205 +DA:128,8250057 +DA:129,5498348 +DA:130,19332958 +DA:131,26625537 +DA:132,23873828 +DA:133,11830903 +DA:134,9079194 +DA:135,3908339 +DA:136,1156630 +DA:137,78952612 +DA:138,76200903 +DA:139,10043255 +DA:140,2871079 +DA:141,2809886 +DA:142,2862875 +DA:143,2798331 +DA:144,2799015 +DA:145,2792085 +DA:146,2786401 +DA:147,2780523 +DA:148,2792175 +DA:149,2790486 +DA:150,2785803 +DA:151,2780735 +DA:152,29026 +DA:153,2800203 +DA:154,2772933 +DA:155,2817909 +DA:156,2782411 +DA:157,4990203 +DA:158,2796691 +DA:159,2789053 +DA:160,2789640 +DA:161,2783511 +DA:162,2781841 +DA:163,2792740 +DA:164,2793773 +DA:165,2780413 +DA:166,2786077 +DA:167,2776651 +DA:168,2844967 +DA:169,3052813 +DA:170,301104 +DA:171,8630056 +DA:172,5878347 +DA:173,3368868 +DA:174,3043649 +DA:175,2878535 +DA:176,2816589 +DA:177,2799511 +DA:178,3195481 +DA:179,2778683 +DA:180,2804993 +DA:181,2776649 +DA:182,2768265 +DA:183,2782269 +DA:184,2766719 +DA:185,2776899 +DA:186,2769051 +DA:187,17342 +DA:188,3474662 +DA:189,3154405 +DA:190,3023009 +DA:191,2838987 +DA:192,2788679 +DA:193,2759917 +DA:194,2755499 +DA:195,2759415 +DA:196,2757545 +DA:197,2753931 +DA:198,2754361 +DA:199,2758417 +DA:200,2755873 +DA:201,2755287 +DA:202,2754043 +DA:203,2754049 +DA:204,2340 +DA:205,2760816 +DA:206,2759764 +DA:207,2756168 +DA:208,2758358 +DA:209,2752322 +DA:210,2751709 +DA:211,2751709 +DA:212,2751709 +DA:213,2751709 +DA:214,2751709 +DA:215,2751709 +DA:216,2751709 +DA:217,2751709 +DA:218,2751709 +DA:219,2751709 +DA:220,2751709 +DA:221,613 +DA:222,2751709 +DA:223,2751709 +DA:224,2751709 +DA:225,2751709 +DA:226,2751709 +DA:227,2751709 +DA:228,2751709 +DA:229,2751709 +DA:230,2751709 +DA:231,2751709 +DA:232,2751709 +DA:233,2751709 +DA:234,2751709 +DA:235,2751709 +DA:236,2751709 +DA:237,2751709 +DA:238,613 +DA:239,2751709 +DA:240,2751709 +DA:241,2751709 +DA:242,2751709 +DA:243,2751709 +DA:244,2751709 +DA:245,2751709 +DA:246,2751709 +DA:247,2751709 +DA:248,2751709 +DA:249,2751709 +DA:250,2751709 +DA:251,2751709 +DA:252,2751709 +DA:253,2751709 +DA:254,2751709 +DA:255,613 +DA:256,2751709 +DA:257,2751709 +DA:258,2751709 +DA:259,2751709 +DA:260,2751709 +DA:261,2751709 +DA:262,2751709 +DA:263,2751709 +DA:264,2751709 +DA:265,2751709 +DA:266,2751709 +DA:267,2751709 +DA:268,2751709 +DA:269,2751709 +DA:270,2751709 +DA:271,2751709 +DA:272,0 +DA:273,2751709 +DA:274,2751709 +DA:275,2751709 +DA:276,2751709 +DA:277,2751709 +DA:278,2751709 +DA:279,2751709 +DA:280,2751709 +DA:281,2751709 +DA:282,2751709 +DA:283,2751709 +DA:284,2751709 +DA:285,2751709 +DA:286,2751709 +DA:287,2751709 +DA:288,2751709 +DA:289,0 +DA:290,2773428 +DA:291,3626749 +DA:292,2834073 +DA:293,2751709 +DA:294,2852673 +DA:295,2776545 +DA:296,2751709 +DA:297,2751709 +DA:298,2751709 +DA:299,2751709 +DA:300,5815701 +DA:301,3063992 +DA:302,2751709 +DA:303,2751709 +DA:304,2751709 +DA:305,2751709 +BRF:0 +BRH:0 +LF:0 +LH:0 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/blake2b.cpp +FN:40,_ZN6evmone6crypto16blake2b_compressEjPmPKmS3_b +FN:25,blake2b.cpp:_ZN6evmone6crypto12_GLOBAL__N_11gEPmmmmmmm +FN:14,blake2b.cpp:_ZN6evmone6crypto12_GLOBAL__N_14rotrEmj +FNDA:1024,_ZN6evmone6crypto16blake2b_compressEjPmPKmS3_b +FNDA:26164864,blake2b.cpp:_ZN6evmone6crypto12_GLOBAL__N_11gEPmmmmmmm +FNDA:104659456,blake2b.cpp:_ZN6evmone6crypto12_GLOBAL__N_14rotrEmj +FNF:3 +FNH:3 +DA:14,104659456 +DA:15,104659456 +DA:16,104659456 +DA:25,26164864 +DA:26,26164864 +DA:27,26164864 +DA:28,26164864 +DA:29,26164864 +DA:30,26164864 +DA:31,26164864 +DA:32,26164864 +DA:33,26164864 +DA:34,26164864 +DA:40,1024 +DA:43,1024 +DA:44,1024 +DA:45,1024 +DA:46,1024 +DA:47,1024 +DA:48,1024 +DA:49,1024 +DA:50,1024 +DA:51,1024 +DA:52,1024 +DA:53,1024 +DA:54,1024 +DA:58,1024 +DA:59,1024 +DA:60,1024 +DA:61,1024 +DA:62,1024 +DA:63,1024 +DA:64,1024 +DA:67,3271632 +DA:68,3270608 +DA:70,3270608 +DA:72,3270608 +DA:73,3270608 +DA:74,3270608 +DA:75,3270608 +DA:76,3270608 +DA:77,3270608 +DA:78,3270608 +DA:79,3270608 +DA:80,3270608 +DA:82,9216 +DA:83,8192 +DA:84,1024 +BRDA:67,0,0,3270608 +BRDA:67,0,1,1024 +BRDA:82,0,0,8192 +BRDA:82,0,1,1024 +BRF:4 +BRH:4 +LF:48 +LH:48 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/bls.cpp +FN:96,_ZN6evmone6crypto3bls6g1_addEPhS2_PKhS4_S4_S4_ +FN:119,_ZN6evmone6crypto3bls6g1_mulEPhS2_PKhS4_S4_ +FN:146,_ZN6evmone6crypto3bls6g2_addEPhS2_PKhS4_S4_S4_ +FN:169,_ZN6evmone6crypto3bls6g2_mulEPhS2_PKhS4_S4_ +FN:196,_ZN6evmone6crypto3bls6g1_msmEPhS2_PKhm +FN:258,_ZN6evmone6crypto3bls6g2_msmEPhS2_PKhm +FN:319,_ZN6evmone6crypto3bls12map_fp_to_g1EPhS2_PKh +FN:337,_ZN6evmone6crypto3bls13map_fp2_to_g2EPhS2_PKh +FN:354,_ZN6evmone6crypto3bls13pairing_checkEPhPKhm +FN:30,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_111validate_p1EPKhS4_ +FN:80,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_15storeEPhRK7blst_fp +FN:62,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_111validate_p2EPKhS4_ +FN:87,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_15storeEPhRK8blst_fp2 +FN:17,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_111validate_fpEPKh +FN:47,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_112validate_fp2EPKh +FNDA:324,_ZN6evmone6crypto3bls6g1_addEPhS2_PKhS4_S4_S4_ +FNDA:0,_ZN6evmone6crypto3bls6g1_mulEPhS2_PKhS4_S4_ +FNDA:348,_ZN6evmone6crypto3bls6g2_addEPhS2_PKhS4_S4_S4_ +FNDA:0,_ZN6evmone6crypto3bls6g2_mulEPhS2_PKhS4_S4_ +FNDA:1584,_ZN6evmone6crypto3bls6g1_msmEPhS2_PKhm +FNDA:1608,_ZN6evmone6crypto3bls6g2_msmEPhS2_PKhm +FNDA:116,_ZN6evmone6crypto3bls12map_fp_to_g1EPhS2_PKh +FNDA:104,_ZN6evmone6crypto3bls13map_fp2_to_g2EPhS2_PKh +FNDA:412,_ZN6evmone6crypto3bls13pairing_checkEPhPKhm +FNDA:95294,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_111validate_p1EPKhS4_ +FNDA:2520,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_15storeEPhRK7blst_fp +FNDA:93786,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_111validate_p2EPKhS4_ +FNDA:816,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_15storeEPhRK8blst_fp2 +FNDA:565404,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_111validate_fpEPKh +FNDA:187508,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_112validate_fp2EPKh +FNF:15 +FNH:13 +DA:17,565404 +DA:18,565404 +DA:19,540 +DA:21,564864 +DA:22,564864 +DA:23,564864 +DA:24,565404 +DA:30,95294 +DA:31,95294 +DA:32,95294 +DA:33,124 +DA:34,95170 +DA:35,95170 +DA:36,60 +DA:38,95110 +DA:39,95110 +DA:40,172 +DA:42,94938 +DA:43,95110 +DA:47,187508 +DA:48,187508 +DA:49,187508 +DA:50,192 +DA:51,187316 +DA:52,187316 +DA:53,128 +DA:55,187188 +DA:56,187316 +DA:62,93786 +DA:63,93786 +DA:64,93786 +DA:65,168 +DA:67,93618 +DA:68,93618 +DA:69,96 +DA:71,93522 +DA:72,93522 +DA:73,164 +DA:75,93358 +DA:76,93522 +DA:80,2520 +DA:81,2520 +DA:82,2520 +DA:83,2520 +DA:87,816 +DA:88,816 +DA:89,816 +DA:90,816 +DA:96,324 +DA:97,324 +DA:98,324 +DA:100,324 +DA:101,144 +DA:103,180 +DA:104,180 +DA:106,180 +DA:107,180 +DA:109,180 +DA:110,180 +DA:111,180 +DA:112,180 +DA:114,180 +DA:115,324 +DA:119,0 +DA:120,0 +DA:121,0 +DA:123,0 +DA:124,0 +DA:125,0 +DA:127,0 +DA:128,0 +DA:130,0 +DA:131,0 +DA:133,0 +DA:134,0 +DA:136,0 +DA:137,0 +DA:138,0 +DA:139,0 +DA:141,0 +DA:142,0 +DA:146,348 +DA:147,348 +DA:148,348 +DA:150,348 +DA:151,176 +DA:153,172 +DA:154,172 +DA:156,172 +DA:157,172 +DA:159,172 +DA:160,172 +DA:161,172 +DA:162,172 +DA:164,172 +DA:165,348 +DA:169,0 +DA:170,0 +DA:171,0 +DA:173,0 +DA:174,0 +DA:175,0 +DA:177,0 +DA:178,0 +DA:180,0 +DA:181,0 +DA:183,0 +DA:184,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:191,0 +DA:192,0 +DA:196,1584 +DA:197,1584 +DA:198,1584 +DA:199,1584 +DA:201,1584 +DA:202,1584 +DA:203,1584 +DA:204,1584 +DA:206,1584 +DA:207,1584 +DA:208,1584 +DA:209,1584 +DA:211,1584 +DA:212,82756 +DA:213,81392 +DA:214,81392 +DA:215,81392 +DA:216,136 +DA:218,81256 +DA:219,84 +DA:222,81172 +DA:223,78328 +DA:225,2844 +DA:226,2844 +DA:228,2844 +DA:229,2844 +DA:230,2844 +DA:231,2844 +DA:232,2844 +DA:234,1364 +DA:235,1180 +DA:236,1180 +DA:237,1180 +DA:238,1180 +DA:239,1180 +DA:241,184 +DA:242,184 +DA:243,184 +DA:244,184 +DA:245,184 +DA:246,184 +DA:248,184 +DA:249,184 +DA:250,184 +DA:251,184 +DA:253,184 +DA:254,1364 +DA:258,1608 +DA:259,1608 +DA:260,1608 +DA:261,1608 +DA:263,1608 +DA:264,1608 +DA:265,1608 +DA:266,1608 +DA:268,1608 +DA:269,1608 +DA:270,1608 +DA:271,1608 +DA:273,1608 +DA:274,81276 +DA:275,79908 +DA:276,79908 +DA:277,79908 +DA:278,164 +DA:280,79744 +DA:281,76 +DA:284,79668 +DA:285,78348 +DA:287,1320 +DA:288,1320 +DA:290,1320 +DA:291,1320 +DA:292,1320 +DA:293,1320 +DA:294,1320 +DA:296,1368 +DA:297,1180 +DA:298,1180 +DA:299,1180 +DA:300,1180 +DA:301,1180 +DA:303,188 +DA:304,188 +DA:305,188 +DA:306,188 +DA:307,188 +DA:308,188 +DA:310,188 +DA:311,188 +DA:312,188 +DA:313,188 +DA:315,188 +DA:316,1368 +DA:319,116 +DA:320,116 +DA:321,116 +DA:322,36 +DA:324,80 +DA:325,80 +DA:327,80 +DA:328,80 +DA:329,80 +DA:330,80 +DA:332,80 +DA:333,116 +DA:337,104 +DA:338,104 +DA:339,104 +DA:340,56 +DA:342,48 +DA:343,48 +DA:345,48 +DA:346,48 +DA:347,48 +DA:348,48 +DA:350,48 +DA:351,104 +DA:354,412 +DA:355,412 +DA:356,412 +DA:357,412 +DA:358,412 +DA:359,412 +DA:360,412 +DA:362,412 +DA:363,412 +DA:364,13462 +DA:365,13254 +DA:366,13254 +DA:367,13254 +DA:368,72 +DA:370,13182 +DA:371,13182 +DA:372,84 +DA:374,13098 +DA:375,24 +DA:377,13074 +DA:378,24 +DA:381,13050 +DA:382,12910 +DA:384,140 +DA:385,140 +DA:386,140 +DA:387,140 +DA:389,208 +DA:390,208 +DA:391,208 +DA:392,208 +DA:393,208 +DA:394,412 +BRDA:18,0,0,540 +BRDA:18,0,1,564864 +BRDA:32,0,0,124 +BRDA:32,0,1,95170 +BRDA:35,0,0,60 +BRDA:35,0,1,95110 +BRDA:39,0,0,172 +BRDA:39,0,1,94938 +BRDA:49,0,0,192 +BRDA:49,0,1,187316 +BRDA:52,0,0,128 +BRDA:52,0,1,187188 +BRDA:64,0,0,168 +BRDA:64,0,1,93618 +BRDA:68,0,0,96 +BRDA:68,0,1,93522 +BRDA:72,0,0,164 +BRDA:72,0,1,93358 +BRDA:100,0,0,92 +BRDA:100,0,1,232 +BRDA:100,1,2,52 +BRDA:100,1,3,180 +BRDA:124,0,0,- +BRDA:124,0,1,- +BRDA:130,0,0,- +BRDA:130,0,1,- +BRDA:150,0,0,108 +BRDA:150,0,1,240 +BRDA:150,1,2,68 +BRDA:150,1,3,172 +BRDA:174,0,0,- +BRDA:174,0,1,- +BRDA:180,0,0,- +BRDA:180,0,1,- +BRDA:212,0,0,81392 +BRDA:212,0,1,1364 +BRDA:215,0,0,136 +BRDA:215,0,1,81256 +BRDA:218,0,0,84 +BRDA:218,0,1,81172 +BRDA:222,0,0,78328 +BRDA:222,0,1,2844 +BRDA:234,0,0,1180 +BRDA:234,0,1,184 +BRDA:274,0,0,79908 +BRDA:274,0,1,1368 +BRDA:277,0,0,164 +BRDA:277,0,1,79744 +BRDA:280,0,0,76 +BRDA:280,0,1,79668 +BRDA:284,0,0,78348 +BRDA:284,0,1,1320 +BRDA:296,0,0,1180 +BRDA:296,0,1,188 +BRDA:321,0,0,36 +BRDA:321,0,1,80 +BRDA:339,0,0,56 +BRDA:339,0,1,48 +BRDA:364,0,0,13254 +BRDA:364,0,1,208 +BRDA:367,0,0,72 +BRDA:367,0,1,13182 +BRDA:371,0,0,84 +BRDA:371,0,1,13098 +BRDA:374,0,0,24 +BRDA:374,0,1,13074 +BRDA:377,0,0,24 +BRDA:377,0,1,13050 +BRDA:381,0,0,12894 +BRDA:381,0,1,156 +BRDA:381,1,2,16 +BRDA:381,1,3,140 +BRDA:392,0,0,168 +BRDA:392,0,1,40 +BRF:74 +BRH:66 +LF:265 +LH:229 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/bn254.cpp +FN:12,_ZN6evmmax5bn2548validateERKNS_3ecc11AffinePointINS0_5CurveEEE +FN:20,_ZN6evmmax5bn2543mulERKNS_3ecc11AffinePointINS0_5CurveEEERKN4intx4uintILj256EEE +FNDA:12038,_ZN6evmmax5bn2548validateERKNS_3ecc11AffinePointINS0_5CurveEEE +FNDA:4604,_ZN6evmmax5bn2543mulERKNS_3ecc11AffinePointINS0_5CurveEEERKN4intx4uintILj256EEE +FNF:2 +FNH:2 +DA:12,12038 +DA:13,12038 +DA:14,12038 +DA:15,12038 +DA:16,12038 +DA:17,12038 +DA:20,4604 +DA:21,4604 +DA:22,4604 +DA:23,4604 +BRDA:16,0,0,5580 +BRDA:16,0,1,6458 +BRDA:16,1,2,4288 +BRDA:16,1,3,2170 +BRF:4 +BRH:4 +LF:10 +LH:10 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/ecc.hpp +FN:135,_ZN6evmmax3ecc11AffinePointINS_5bn2545CurveEE10from_bytesESt4spanIKhLm64EE +FN:42,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEE10from_bytesESt4spanIKhLm32EE +FN:37,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEEC2EN4intx4uintILj256EEE +FN:120,_ZN6evmmax3ecc11AffinePointINS_5bn2545CurveEEC2ERKNS0_12FieldElementIS3_EES8_ +FN:227,_ZN6evmmax3ecc3addINS_5bn2545CurveEEENS0_11AffinePointIT_EERKS6_S8_ +FN:130,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_5bn2545CurveEEENS0_8ConstantILi0EEE +FN:127,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_5bn2545CurveEEES6_ +FN:56,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FN:71,_ZN6evmmax3eccmiERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FN:93,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEE4wrapERKN4intx4uintILj256EEE +FN:35,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEEC2Ev +FN:58,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_5bn2545CurveEEENS0_8ConstantILi0EEE +FN:119,_ZN6evmmax3ecc11AffinePointINS_5bn2545CurveEEC2Ev +FN:61,_ZN6evmmax3eccmlERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FN:66,_ZN6evmmax3eccplERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FN:86,_ZN6evmmax3eccdvERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FN:119,_ZN6evmmax3ecc11AffinePointINS_9secp256k15CurveEEC2Ev +FN:35,_ZN6evmmax3ecc12FieldElementINS_9secp256k15CurveEEC2Ev +FN:130,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256k15CurveEEENS0_8ConstantILi0EEE +FN:127,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256k15CurveEEES6_ +FN:56,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FN:227,_ZN6evmmax3ecc3addINS_9secp256k15CurveEEENS0_11AffinePointIT_EERKS6_S8_ +FN:71,_ZN6evmmax3eccmiERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FN:93,_ZN6evmmax3ecc12FieldElementINS_9secp256k15CurveEE4wrapERKN4intx4uintILj256EEE +FN:58,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256k15CurveEEENS0_8ConstantILi0EEE +FN:61,_ZN6evmmax3eccmlERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FN:66,_ZN6evmmax3eccplERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FN:86,_ZN6evmmax3eccdvERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FN:120,_ZN6evmmax3ecc11AffinePointINS_9secp256k15CurveEEC2ERKNS0_12FieldElementIS3_EES8_ +FN:142,_ZNK6evmmax3ecc11AffinePointINS_5bn2545CurveEE8to_bytesESt4spanIhLm64EE +FN:48,_ZNK6evmmax3ecc12FieldElementINS_5bn2545CurveEE8to_bytesESt4spanIhLm32EE +FN:39,_ZNK6evmmax3ecc12FieldElementINS_5bn2545CurveEE5valueEv +FN:423,_ZN6evmmax3ecc3mulINS_5bn2545CurveEEENS0_9ProjPointIT_EERKNS0_11AffinePointIS5_EENS5_9uint_typeE +FN:159,_ZN6evmmax3ecc9ProjPointINS_5bn2545CurveEEC2Ev +FN:359,_ZN6evmmax3ecc3dblINS_5bn2545CurveEEENS0_9ProjPointIT_EERKS6_ +FN:160,_ZN6evmmax3ecc9ProjPointINS_5bn2545CurveEEC2ERKNS0_12FieldElementIS3_EES8_S8_ +FN:317,_ZN6evmmax3ecc3addINS_5bn2545CurveEEENS0_9ProjPointIT_EERKS6_RKNS0_11AffinePointIS5_EE +FN:163,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_5bn2545CurveEEENS0_8ConstantILi0EEE +FN:161,_ZN6evmmax3ecc9ProjPointINS_5bn2545CurveEEC2ERKNS0_11AffinePointIS3_EE +FN:214,_ZN6evmmax3ecc9to_affineINS_5bn2545CurveEEENS0_11AffinePointIT_EERKNS0_9ProjPointIS5_EE +FN:81,_ZN6evmmax3eccdvENS0_8ConstantILi1EEERKNS0_12FieldElementINS_5bn2545CurveEEE +FN:203,_ZN6evmmax3ecc8JacPointINS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEEE4fromERKNS0_5PointIS5_EE +FN:189,_ZN6evmmax3ecceqERKNS0_8JacPointINS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEEEES8_ +FN:107,_ZN6evmmax3eccngERKNS0_5PointINS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEEEE +FN:142,_ZNK6evmmax3ecc11AffinePointINS_9secp256k15CurveEE8to_bytesESt4spanIhLm64EE +FN:48,_ZNK6evmmax3ecc12FieldElementINS_9secp256k15CurveEE8to_bytesESt4spanIhLm32EE +FN:39,_ZNK6evmmax3ecc12FieldElementINS_9secp256k15CurveEE5valueEv +FN:423,_ZN6evmmax3ecc3mulINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKNS0_11AffinePointIS5_EENS5_9uint_typeE +FN:159,_ZN6evmmax3ecc9ProjPointINS_9secp256k15CurveEEC2Ev +FN:37,_ZN6evmmax3ecc12FieldElementINS_9secp256k15CurveEEC2EN4intx4uintILj256EEE +FN:359,_ZN6evmmax3ecc3dblINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKS6_ +FN:160,_ZN6evmmax3ecc9ProjPointINS_9secp256k15CurveEEC2ERKNS0_12FieldElementIS3_EES8_S8_ +FN:317,_ZN6evmmax3ecc3addINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKS6_RKNS0_11AffinePointIS5_EE +FN:163,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256k15CurveEEENS0_8ConstantILi0EEE +FN:161,_ZN6evmmax3ecc9ProjPointINS_9secp256k15CurveEEC2ERKNS0_11AffinePointIS3_EE +FN:214,_ZN6evmmax3ecc9to_affineINS_9secp256k15CurveEEENS0_11AffinePointIT_EERKNS0_9ProjPointIS5_EE +FN:81,_ZN6evmmax3eccdvENS0_8ConstantILi1EEERKNS0_12FieldElementINS_9secp256k15CurveEEE +FN:264,_ZN6evmmax3ecc3addINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKS6_S8_ +FN:166,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256k15CurveEEES6_ +FN:37,_ZN6evmmax3ecc12FieldElementINS_9secp256r15CurveEEC2EN4intx4uintILj256EEE +FN:120,_ZN6evmmax3ecc11AffinePointINS_9secp256r15CurveEEC2ERKNS0_12FieldElementIS3_EES8_ +FN:130,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256r15CurveEEENS0_8ConstantILi0EEE +FN:127,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256r15CurveEEES6_ +FN:56,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FN:119,_ZN6evmmax3ecc11AffinePointINS_9secp256r15CurveEEC2Ev +FN:35,_ZN6evmmax3ecc12FieldElementINS_9secp256r15CurveEEC2Ev +FN:61,_ZN6evmmax3eccmlERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FN:93,_ZN6evmmax3ecc12FieldElementINS_9secp256r15CurveEE4wrapERKN4intx4uintILj256EEE +FN:66,_ZN6evmmax3eccplERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FN:39,_ZNK6evmmax3ecc12FieldElementINS_9secp256r15CurveEE5valueEv +FN:423,_ZN6evmmax3ecc3mulINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKNS0_11AffinePointIS5_EENS5_9uint_typeE +FN:159,_ZN6evmmax3ecc9ProjPointINS_9secp256r15CurveEEC2Ev +FN:359,_ZN6evmmax3ecc3dblINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKS6_ +FN:71,_ZN6evmmax3eccmiERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FN:160,_ZN6evmmax3ecc9ProjPointINS_9secp256r15CurveEEC2ERKNS0_12FieldElementIS3_EES8_S8_ +FN:317,_ZN6evmmax3ecc3addINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKS6_RKNS0_11AffinePointIS5_EE +FN:163,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256r15CurveEEENS0_8ConstantILi0EEE +FN:58,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256r15CurveEEENS0_8ConstantILi0EEE +FN:161,_ZN6evmmax3ecc9ProjPointINS_9secp256r15CurveEEC2ERKNS0_11AffinePointIS3_EE +FN:264,_ZN6evmmax3ecc3addINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKS6_S8_ +FN:166,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256r15CurveEEES6_ +FN:214,_ZN6evmmax3ecc9to_affineINS_9secp256r15CurveEEENS0_11AffinePointIT_EERKNS0_9ProjPointIS5_EE +FN:81,_ZN6evmmax3eccdvENS0_8ConstantILi1EEERKNS0_12FieldElementINS_9secp256r15CurveEEE +FNDA:12298,_ZN6evmmax3ecc11AffinePointINS_5bn2545CurveEE10from_bytesESt4spanIKhLm64EE +FNDA:24596,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEE10from_bytesESt4spanIKhLm32EE +FNDA:31252,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEEC2EN4intx4uintILj256EEE +FNDA:17790,_ZN6evmmax3ecc11AffinePointINS_5bn2545CurveEEC2ERKNS0_12FieldElementIS3_EES8_ +FNDA:2596,_ZN6evmmax3ecc3addINS_5bn2545CurveEEENS0_11AffinePointIT_EERKS6_S8_ +FNDA:138732,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_5bn2545CurveEEENS0_8ConstantILi0EEE +FNDA:230878,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_5bn2545CurveEEES6_ +FNDA:197320,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FNDA:2100138,_ZN6evmmax3eccmiERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FNDA:9863838,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEE4wrapERKN4intx4uintILj256EEE +FNDA:10150798,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEEC2Ev +FNDA:90048,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_5bn2545CurveEEENS0_8ConstantILi0EEE +FNDA:138876,_ZN6evmmax3ecc11AffinePointINS_5bn2545CurveEEC2Ev +FNDA:3213524,_ZN6evmmax3eccmlERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FNDA:4544684,_ZN6evmmax3eccplERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FNDA:888,_ZN6evmmax3eccdvERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FNDA:119106,_ZN6evmmax3ecc11AffinePointINS_9secp256k15CurveEEC2Ev +FNDA:9100686,_ZN6evmmax3ecc12FieldElementINS_9secp256k15CurveEEC2Ev +FNDA:119106,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256k15CurveEEENS0_8ConstantILi0EEE +FNDA:119118,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256k15CurveEEES6_ +FNDA:119416,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FNDA:0,_ZN6evmmax3ecc3addINS_9secp256k15CurveEEENS0_11AffinePointIT_EERKS6_S8_ +FNDA:1958962,_ZN6evmmax3eccmiERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FNDA:8859746,_ZN6evmmax3ecc12FieldElementINS_9secp256k15CurveEE4wrapERKN4intx4uintILj256EEE +FNDA:119404,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256k15CurveEEENS0_8ConstantILi0EEE +FNDA:3054694,_ZN6evmmax3eccmlERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FNDA:3844044,_ZN6evmmax3eccplERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FNDA:0,_ZN6evmmax3eccdvERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FNDA:1364,_ZN6evmmax3ecc11AffinePointINS_9secp256k15CurveEEC2ERKNS0_12FieldElementIS3_EES8_ +FNDA:7200,_ZNK6evmmax3ecc11AffinePointINS_5bn2545CurveEE8to_bytesESt4spanIhLm64EE +FNDA:14400,_ZNK6evmmax3ecc12FieldElementINS_5bn2545CurveEE8to_bytesESt4spanIhLm32EE +FNDA:14400,_ZNK6evmmax3ecc12FieldElementINS_5bn2545CurveEE5valueEv +FNDA:4604,_ZN6evmmax3ecc3mulINS_5bn2545CurveEEENS0_9ProjPointIT_EERKNS0_11AffinePointIS5_EENS5_9uint_typeE +FNDA:4604,_ZN6evmmax3ecc9ProjPointINS_5bn2545CurveEEC2Ev +FNDA:315354,_ZN6evmmax3ecc3dblINS_5bn2545CurveEEENS0_9ProjPointIT_EERKS6_ +FNDA:401646,_ZN6evmmax3ecc9ProjPointINS_5bn2545CurveEEC2ERKNS0_12FieldElementIS3_EES8_S8_ +FNDA:128088,_ZN6evmmax3ecc3addINS_5bn2545CurveEEENS0_9ProjPointIT_EERKS6_RKNS0_11AffinePointIS5_EE +FNDA:88344,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_5bn2545CurveEEENS0_8ConstantILi0EEE +FNDA:2052,_ZN6evmmax3ecc9ProjPointINS_5bn2545CurveEEC2ERKNS0_11AffinePointIS3_EE +FNDA:4604,_ZN6evmmax3ecc9to_affineINS_5bn2545CurveEEENS0_11AffinePointIT_EERKNS0_9ProjPointIS5_EE +FNDA:4604,_ZN6evmmax3eccdvENS0_8ConstantILi1EEERKNS0_12FieldElementINS_5bn2545CurveEEE +FNDA:2520,_ZN6evmmax3ecc8JacPointINS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEEE4fromERKNS0_5PointIS5_EE +FNDA:1518,_ZN6evmmax3ecceqERKNS0_8JacPointINS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEEEES8_ +FNDA:2004,_ZN6evmmax3eccngERKNS0_5PointINS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEEEE +FNDA:676,_ZNK6evmmax3ecc11AffinePointINS_9secp256k15CurveEE8to_bytesESt4spanIhLm64EE +FNDA:1352,_ZNK6evmmax3ecc12FieldElementINS_9secp256k15CurveEE8to_bytesESt4spanIhLm32EE +FNDA:1352,_ZNK6evmmax3ecc12FieldElementINS_9secp256k15CurveEE5valueEv +FNDA:1364,_ZN6evmmax3ecc3mulINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKNS0_11AffinePointIS5_EENS5_9uint_typeE +FNDA:1364,_ZN6evmmax3ecc9ProjPointINS_9secp256k15CurveEEC2Ev +FNDA:2344,_ZN6evmmax3ecc12FieldElementINS_9secp256k15CurveEEC2EN4intx4uintILj256EEE +FNDA:250502,_ZN6evmmax3ecc3dblINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKS6_ +FNDA:368244,_ZN6evmmax3ecc9ProjPointINS_9secp256k15CurveEEC2ERKNS0_12FieldElementIS3_EES8_S8_ +FNDA:118424,_ZN6evmmax3ecc3addINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKS6_RKNS0_11AffinePointIS5_EE +FNDA:119404,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256k15CurveEEENS0_8ConstantILi0EEE +FNDA:980,_ZN6evmmax3ecc9ProjPointINS_9secp256k15CurveEEC2ERKNS0_11AffinePointIS3_EE +FNDA:682,_ZN6evmmax3ecc9to_affineINS_9secp256k15CurveEEENS0_11AffinePointIT_EERKNS0_9ProjPointIS5_EE +FNDA:682,_ZN6evmmax3eccdvENS0_8ConstantILi1EEERKNS0_12FieldElementINS_9secp256k15CurveEEE +FNDA:682,_ZN6evmmax3ecc3addINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKS6_S8_ +FNDA:298,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256k15CurveEEES6_ +FNDA:3232,_ZN6evmmax3ecc12FieldElementINS_9secp256r15CurveEEC2EN4intx4uintILj256EEE +FNDA:1098,_ZN6evmmax3ecc11AffinePointINS_9secp256r15CurveEEC2ERKNS0_12FieldElementIS3_EES8_ +FNDA:129840,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256r15CurveEEENS0_8ConstantILi0EEE +FNDA:129850,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256r15CurveEEES6_ +FNDA:130964,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FNDA:129840,_ZN6evmmax3ecc11AffinePointINS_9secp256r15CurveEEC2Ev +FNDA:11871930,_ZN6evmmax3ecc12FieldElementINS_9secp256r15CurveEEC2Ev +FNDA:3430272,_ZN6evmmax3eccmlERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FNDA:11610162,_ZN6evmmax3ecc12FieldElementINS_9secp256r15CurveEE4wrapERKN4intx4uintILj256EEE +FNDA:5903832,_ZN6evmmax3eccplERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FNDA:522,_ZNK6evmmax3ecc12FieldElementINS_9secp256r15CurveEE5valueEv +FNDA:1044,_ZN6evmmax3ecc3mulINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKNS0_11AffinePointIS5_EENS5_9uint_typeE +FNDA:1044,_ZN6evmmax3ecc9ProjPointINS_9secp256r15CurveEEC2Ev +FNDA:250526,_ZN6evmmax3ecc3dblINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKS6_ +FNDA:2275536,_ZN6evmmax3eccmiERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FNDA:379256,_ZN6evmmax3ecc9ProjPointINS_9secp256r15CurveEEC2ERKNS0_12FieldElementIS3_EES8_S8_ +FNDA:129264,_ZN6evmmax3ecc3addINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKS6_RKNS0_11AffinePointIS5_EE +FNDA:130300,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256r15CurveEEENS0_8ConstantILi0EEE +FNDA:130300,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256r15CurveEEENS0_8ConstantILi0EEE +FNDA:1036,_ZN6evmmax3ecc9ProjPointINS_9secp256r15CurveEEC2ERKNS0_11AffinePointIS3_EE +FNDA:522,_ZN6evmmax3ecc3addINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKS6_S8_ +FNDA:514,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256r15CurveEEES6_ +FNDA:522,_ZN6evmmax3ecc9to_affineINS_9secp256r15CurveEEENS0_11AffinePointIT_EERKNS0_9ProjPointIS5_EE +FNDA:522,_ZN6evmmax3eccdvENS0_8ConstantILi1EEERKNS0_12FieldElementINS_9secp256r15CurveEEE +FNF:33 +FNH:33 +DA:35,31123414 +DA:37,36828 +DA:39,16274 +DA:42,24596 +DA:44,24596 +DA:45,24596 +DA:48,15752 +DA:50,15752 +DA:51,15752 +DA:56,447700 +DA:58,339752 +DA:61,9698490 +DA:62,9698490 +DA:63,9698490 +DA:66,14292560 +DA:67,14292560 +DA:68,14292560 +DA:71,6334636 +DA:72,6334636 +DA:73,6334636 +DA:81,5808 +DA:82,5808 +DA:83,5808 +DA:86,888 +DA:87,888 +DA:88,888 +DA:93,30333746 +DA:94,30333746 +DA:95,30333746 +DA:96,30333746 +DA:97,30333746 +DA:107,2004 +DA:119,387822 +DA:120,20252 +DA:127,1439538 +DA:130,387678 +DA:131,387678 +DA:132,387678 +DA:135,12298 +DA:136,12298 +DA:137,12298 +DA:138,12298 +DA:139,12298 +DA:142,7876 +DA:143,7876 +DA:144,7876 +DA:145,7876 +DA:159,7012 +DA:160,1149146 +DA:161,4068 +DA:163,338048 +DA:166,812 +DA:167,812 +DA:168,812 +DA:169,812 +DA:170,812 +DA:171,812 +DA:172,812 +DA:173,812 +DA:174,812 +DA:189,1518 +DA:190,1518 +DA:191,1518 +DA:193,1518 +DA:194,1518 +DA:196,1518 +DA:197,1518 +DA:203,2520 +DA:204,2520 +DA:205,2520 +DA:214,5808 +DA:216,5808 +DA:217,5808 +DA:218,5808 +DA:219,5808 +DA:220,5808 +DA:227,2596 +DA:228,2596 +DA:229,1006 +DA:230,1590 +DA:231,558 +DA:233,1032 +DA:234,1032 +DA:239,1032 +DA:240,1032 +DA:241,1032 +DA:242,672 +DA:243,672 +DA:244,144 +DA:247,528 +DA:248,528 +DA:249,528 +DA:250,528 +DA:251,888 +DA:253,888 +DA:254,888 +DA:255,888 +DA:256,1032 +DA:264,1204 +DA:265,1204 +DA:266,392 +DA:267,812 +DA:268,0 +DA:270,812 +DA:271,12 +DA:280,800 +DA:281,800 +DA:283,800 +DA:284,800 +DA:285,800 +DA:286,800 +DA:287,800 +DA:288,800 +DA:289,800 +DA:290,800 +DA:291,800 +DA:292,800 +DA:293,800 +DA:294,800 +DA:295,800 +DA:296,800 +DA:297,800 +DA:298,800 +DA:299,800 +DA:300,800 +DA:301,800 +DA:302,800 +DA:303,800 +DA:304,800 +DA:305,800 +DA:306,800 +DA:308,800 +DA:309,812 +DA:317,375776 +DA:318,375776 +DA:320,375776 +DA:321,39744 +DA:322,336032 +DA:323,4068 +DA:328,331964 +DA:329,331964 +DA:331,331964 +DA:332,331964 +DA:333,331964 +DA:334,331964 +DA:335,331964 +DA:336,331964 +DA:337,331964 +DA:338,331964 +DA:339,331964 +DA:340,331964 +DA:341,331964 +DA:342,331964 +DA:343,331964 +DA:344,331964 +DA:345,331964 +DA:346,331964 +DA:347,331964 +DA:348,331964 +DA:349,331964 +DA:350,331964 +DA:351,331964 +DA:352,331964 +DA:354,331964 +DA:355,336032 +DA:359,816382 +DA:360,816382 +DA:363,565856 +DA:367,565856 +DA:368,565856 +DA:369,565856 +DA:370,565856 +DA:371,565856 +DA:372,565856 +DA:373,565856 +DA:374,565856 +DA:375,565856 +DA:376,565856 +DA:377,565856 +DA:378,565856 +DA:379,565856 +DA:380,565856 +DA:381,565856 +DA:382,565856 +DA:383,565856 +DA:384,565856 +DA:385,565856 +DA:388,250526 +DA:392,250526 +DA:393,250526 +DA:394,250526 +DA:395,250526 +DA:396,250526 +DA:397,250526 +DA:398,250526 +DA:399,250526 +DA:400,250526 +DA:401,250526 +DA:402,250526 +DA:403,250526 +DA:404,250526 +DA:405,250526 +DA:406,250526 +DA:407,250526 +DA:408,250526 +DA:409,250526 +DA:410,250526 +DA:411,250526 +DA:412,250526 +DA:419,816382 +DA:423,7012 +DA:424,7012 +DA:428,9598 +DA:429,9598 +DA:430,9598 +DA:431,9598 +DA:432,7012 +DA:433,2586 +DA:434,2586 +DA:436,7012 +DA:437,7012 +DA:438,823382 +DA:439,816370 +DA:440,816370 +DA:441,816370 +DA:442,375776 +DA:443,816370 +DA:444,7012 +DA:445,7012 +BRDA:127,0,0,230878 +BRDA:127,0,1,0 +BRDA:127,1,2,230878 +BRDA:127,1,3,0 +BRDA:127,2,4,119118 +BRDA:127,2,5,0 +BRDA:127,3,6,119118 +BRDA:127,3,7,0 +BRDA:127,4,8,129850 +BRDA:127,4,9,0 +BRDA:127,5,10,129850 +BRDA:127,5,11,0 +BRDA:173,0,0,32 +BRDA:173,0,1,482 +BRDA:173,1,2,6 +BRDA:173,1,3,292 +BRDA:173,2,4,12 +BRDA:173,2,5,20 +BRDA:173,3,6,0 +BRDA:173,3,7,6 +BRDA:196,0,0,1044 +BRDA:196,0,1,474 +BRDA:196,1,2,1044 +BRDA:196,1,3,0 +BRDA:228,0,0,1006 +BRDA:228,0,1,1590 +BRDA:228,1,2,- +BRDA:228,1,3,- +BRDA:230,0,0,558 +BRDA:230,0,1,1032 +BRDA:230,1,2,- +BRDA:230,1,3,- +BRDA:241,0,0,672 +BRDA:241,0,1,360 +BRDA:241,1,2,- +BRDA:241,1,3,- +BRDA:243,0,0,144 +BRDA:243,0,1,528 +BRDA:243,1,2,- +BRDA:243,1,3,- +BRDA:265,0,0,8 +BRDA:265,0,1,514 +BRDA:265,1,2,384 +BRDA:265,1,3,298 +BRDA:267,0,0,0 +BRDA:267,0,1,514 +BRDA:267,1,2,0 +BRDA:267,1,3,298 +BRDA:270,0,0,12 +BRDA:270,0,1,502 +BRDA:270,1,2,0 +BRDA:270,1,3,298 +BRDA:320,0,0,39744 +BRDA:320,0,1,88344 +BRDA:320,1,2,0 +BRDA:320,1,3,129264 +BRDA:320,2,4,0 +BRDA:320,2,5,118424 +BRDA:322,0,0,980 +BRDA:322,0,1,117444 +BRDA:322,1,2,1036 +BRDA:322,1,3,128228 +BRDA:322,2,4,2052 +BRDA:322,2,5,86292 +BRDA:428,0,0,7190 +BRDA:428,0,1,0 +BRDA:428,1,2,1044 +BRDA:428,1,3,0 +BRDA:428,2,4,1364 +BRDA:428,2,5,0 +BRDA:431,0,0,1044 +BRDA:431,0,1,0 +BRDA:431,1,2,1364 +BRDA:431,1,3,0 +BRDA:431,2,4,4604 +BRDA:431,2,5,2586 +BRDA:438,0,0,250502 +BRDA:438,0,1,1364 +BRDA:438,1,2,250514 +BRDA:438,1,3,1044 +BRDA:438,2,4,315354 +BRDA:438,2,5,4604 +BRDA:441,0,0,118424 +BRDA:441,0,1,132078 +BRDA:441,1,2,129264 +BRDA:441,1,3,121250 +BRDA:441,2,4,128088 +BRDA:441,2,5,187266 +BRF:35 +BRH:33 +LF:209 +LH:208 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/keccak.c +FN:306,keccak.c:select_keccakf1600_implementation +FN:375,ethash_keccak256 +FN:382,ethash_keccak256_32 +FN:301,keccak.c:keccakf1600_bmi +FN:77,keccak.c:keccakf1600_implementation +FN:53,keccak.c:rol +FN:290,keccak.c:keccakf1600_generic +FN:321,keccak.c:keccak +FN:39,keccak.c:load_le +FNDA:4,keccak.c:select_keccakf1600_implementation +FNDA:42093328,ethash_keccak256 +FNDA:0,ethash_keccak256_32 +FNDA:60502908,keccak.c:keccakf1600_bmi +FNDA:60502908,keccak.c:keccakf1600_implementation +FNDA:42110023968,keccak.c:rol +FNDA:0,keccak.c:keccakf1600_generic +FNDA:42093328,keccak.c:keccak +FNDA:567417998,keccak.c:load_le +FNF:9 +FNH:7 +DA:34,777884638 +DA:39,567417998 +DA:45,567417998 +DA:46,567417998 +DA:47,567417998 +DA:48,567417998 +DA:53,42110023968 +DA:54,42110023968 +DA:55,42110023968 +DA:77,60502908 +DA:78,60502908 +DA:79,60502908 +DA:80,60502908 +DA:81,60502908 +DA:82,60502908 +DA:84,60502908 +DA:85,60502908 +DA:86,60502908 +DA:87,60502908 +DA:88,60502908 +DA:90,60502908 +DA:92,60502908 +DA:94,60502908 +DA:95,60502908 +DA:96,60502908 +DA:97,60502908 +DA:98,60502908 +DA:99,60502908 +DA:100,60502908 +DA:101,60502908 +DA:102,60502908 +DA:103,60502908 +DA:104,60502908 +DA:105,60502908 +DA:106,60502908 +DA:107,60502908 +DA:108,60502908 +DA:109,60502908 +DA:110,60502908 +DA:111,60502908 +DA:112,60502908 +DA:113,60502908 +DA:114,60502908 +DA:115,60502908 +DA:116,60502908 +DA:117,60502908 +DA:118,60502908 +DA:120,786537804 +DA:121,726034896 +DA:124,726034896 +DA:125,726034896 +DA:126,726034896 +DA:127,726034896 +DA:128,726034896 +DA:130,726034896 +DA:131,726034896 +DA:132,726034896 +DA:133,726034896 +DA:134,726034896 +DA:136,726034896 +DA:137,726034896 +DA:138,726034896 +DA:139,726034896 +DA:140,726034896 +DA:141,726034896 +DA:142,726034896 +DA:143,726034896 +DA:144,726034896 +DA:145,726034896 +DA:147,726034896 +DA:148,726034896 +DA:149,726034896 +DA:150,726034896 +DA:151,726034896 +DA:152,726034896 +DA:153,726034896 +DA:154,726034896 +DA:155,726034896 +DA:156,726034896 +DA:158,726034896 +DA:159,726034896 +DA:160,726034896 +DA:161,726034896 +DA:162,726034896 +DA:163,726034896 +DA:164,726034896 +DA:165,726034896 +DA:166,726034896 +DA:167,726034896 +DA:169,726034896 +DA:170,726034896 +DA:171,726034896 +DA:172,726034896 +DA:173,726034896 +DA:174,726034896 +DA:175,726034896 +DA:176,726034896 +DA:177,726034896 +DA:178,726034896 +DA:180,726034896 +DA:181,726034896 +DA:182,726034896 +DA:183,726034896 +DA:184,726034896 +DA:185,726034896 +DA:186,726034896 +DA:187,726034896 +DA:188,726034896 +DA:189,726034896 +DA:194,726034896 +DA:195,726034896 +DA:196,726034896 +DA:197,726034896 +DA:198,726034896 +DA:200,726034896 +DA:201,726034896 +DA:202,726034896 +DA:203,726034896 +DA:204,726034896 +DA:206,726034896 +DA:207,726034896 +DA:208,726034896 +DA:209,726034896 +DA:210,726034896 +DA:211,726034896 +DA:212,726034896 +DA:213,726034896 +DA:214,726034896 +DA:215,726034896 +DA:217,726034896 +DA:218,726034896 +DA:219,726034896 +DA:220,726034896 +DA:221,726034896 +DA:222,726034896 +DA:223,726034896 +DA:224,726034896 +DA:225,726034896 +DA:226,726034896 +DA:228,726034896 +DA:229,726034896 +DA:230,726034896 +DA:231,726034896 +DA:232,726034896 +DA:233,726034896 +DA:234,726034896 +DA:235,726034896 +DA:236,726034896 +DA:237,726034896 +DA:239,726034896 +DA:240,726034896 +DA:241,726034896 +DA:242,726034896 +DA:243,726034896 +DA:244,726034896 +DA:245,726034896 +DA:246,726034896 +DA:247,726034896 +DA:248,726034896 +DA:250,726034896 +DA:251,726034896 +DA:252,726034896 +DA:253,726034896 +DA:254,726034896 +DA:255,726034896 +DA:256,726034896 +DA:257,726034896 +DA:258,726034896 +DA:259,726034896 +DA:260,726034896 +DA:262,60502908 +DA:263,60502908 +DA:264,60502908 +DA:265,60502908 +DA:266,60502908 +DA:267,60502908 +DA:268,60502908 +DA:269,60502908 +DA:270,60502908 +DA:271,60502908 +DA:272,60502908 +DA:273,60502908 +DA:274,60502908 +DA:275,60502908 +DA:276,60502908 +DA:277,60502908 +DA:278,60502908 +DA:279,60502908 +DA:280,60502908 +DA:281,60502908 +DA:282,60502908 +DA:283,60502908 +DA:284,60502908 +DA:285,60502908 +DA:286,60502908 +DA:287,60502908 +DA:290,0 +DA:291,0 +DA:292,0 +DA:301,60502908 +DA:302,60502908 +DA:303,60502908 +DA:306,4 +DA:309,4 +DA:313,4 +DA:314,4 +DA:315,4 +DA:321,42093328 +DA:322,42093328 +DA:323,42093328 +DA:324,42093328 +DA:326,42093328 +DA:327,42093328 +DA:328,42093328 +DA:329,42093328 +DA:331,42093328 +DA:333,60502908 +DA:334,18409580 +DA:335,331372440 +DA:336,312962860 +DA:337,312962860 +DA:338,312962860 +DA:339,312962860 +DA:341,18409580 +DA:343,18409580 +DA:344,18409580 +DA:346,42093328 +DA:348,296548466 +DA:349,254455138 +DA:350,254455138 +DA:351,254455138 +DA:352,254455138 +DA:353,254455138 +DA:354,254455138 +DA:356,149984644 +DA:357,107891316 +DA:358,107891316 +DA:359,107891316 +DA:360,107891316 +DA:361,107891316 +DA:362,107891316 +DA:363,42093328 +DA:364,42093328 +DA:366,42093328 +DA:368,42093328 +DA:370,210466640 +DA:371,168373312 +DA:372,42093328 +DA:375,42093328 +DA:376,42093328 +DA:377,42093328 +DA:378,42093328 +DA:379,42093328 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +BRDA:120,0,0,726034896 +BRDA:120,0,1,60502908 +BRDA:313,0,0,4 +BRDA:313,0,1,0 +BRDA:313,1,2,4 +BRDA:313,1,3,0 +BRDA:333,0,0,18409580 +BRDA:333,0,1,42093328 +BRDA:335,0,0,312962860 +BRDA:335,0,1,18409580 +BRDA:348,0,0,254455138 +BRDA:348,0,1,42093328 +BRDA:356,0,0,107891316 +BRDA:356,0,1,42093328 +BRDA:370,0,0,168373312 +BRDA:370,0,1,42093328 +BRF:16 +BRH:14 +LF:257 +LH:249 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/keccak.hpp +FN:12,_ZN6ethash9keccak256EPKhm +FN:17,_ZN6ethash9keccak256ERK14ethash_hash256 +FNDA:42093328,_ZN6ethash9keccak256EPKhm +FNDA:0,_ZN6ethash9keccak256ERK14ethash_hash256 +FNF:2 +FNH:1 +DA:12,42093328 +DA:13,42093328 +DA:14,42093328 +DA:17,0 +DA:18,0 +DA:19,0 +BRF:0 +BRH:0 +LF:6 +LH:3 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/kzg.cpp +FN:126,_ZN6evmone6crypto16kzg_verify_proofEPKSt4byteS3_S3_S3_S3_ +FN:57,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_115validate_scalarESt4spanIKSt4byteLm32EE +FN:65,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_111validate_G1ESt4spanIKSt4byteLm48EE +FN:89,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_14multERK7blst_p1RK11blst_scalar +FN:80,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_113add_or_doubleERK14blst_p1_affineRK7blst_p1 +FN:107,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_14multERK7blst_p2RK11blst_scalar +FN:98,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_113add_or_doubleERK14blst_p2_affineRK7blst_p2 +FN:115,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_115pairings_verifyERK14blst_p1_affineS4_RK14blst_p2_affine +FNDA:906,_ZN6evmone6crypto16kzg_verify_proofEPKSt4byteS3_S3_S3_S3_ +FNDA:1734,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_115validate_scalarESt4spanIKSt4byteLm32EE +FNDA:1626,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_111validate_G1ESt4spanIKSt4byteLm48EE +FNDA:792,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_14multERK7blst_p1RK11blst_scalar +FNDA:792,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_113add_or_doubleERK14blst_p1_affineRK7blst_p1 +FNDA:792,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_14multERK7blst_p2RK11blst_scalar +FNDA:792,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_113add_or_doubleERK14blst_p2_affineRK7blst_p2 +FNDA:792,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_115pairings_verifyERK14blst_p1_affineS4_RK14blst_p2_affine +FNF:8 +FNH:8 +DA:57,1734 +DA:58,1734 +DA:59,1734 +DA:60,1734 +DA:61,1734 +DA:65,1626 +DA:66,1626 +DA:67,1626 +DA:68,18 +DA:72,1608 +DA:73,12 +DA:74,1596 +DA:75,1608 +DA:80,792 +DA:81,792 +DA:82,792 +DA:83,792 +DA:84,792 +DA:85,792 +DA:86,792 +DA:89,792 +DA:90,792 +DA:91,792 +DA:92,792 +DA:93,792 +DA:98,792 +DA:99,792 +DA:100,792 +DA:101,792 +DA:102,792 +DA:103,792 +DA:104,792 +DA:107,792 +DA:108,792 +DA:109,792 +DA:110,792 +DA:111,792 +DA:115,792 +DA:116,792 +DA:117,792 +DA:118,792 +DA:119,792 +DA:120,792 +DA:121,792 +DA:126,906 +DA:127,906 +DA:128,906 +DA:129,906 +DA:130,906 +DA:131,24 +DA:135,882 +DA:136,882 +DA:137,30 +DA:138,852 +DA:139,852 +DA:140,30 +DA:146,822 +DA:147,822 +DA:148,18 +DA:149,804 +DA:150,804 +DA:151,12 +DA:154,792 +DA:157,792 +DA:160,792 +DA:163,792 +DA:166,792 +DA:167,804 +BRDA:60,0,0,1674 +BRDA:60,0,1,60 +BRDA:67,0,0,18 +BRDA:67,0,1,1608 +BRDA:72,0,0,12 +BRDA:72,0,1,1596 +BRDA:130,0,0,24 +BRDA:130,0,1,882 +BRDA:136,0,0,30 +BRDA:136,0,1,852 +BRDA:139,0,0,30 +BRDA:139,0,1,822 +BRDA:147,0,0,18 +BRDA:147,0,1,804 +BRDA:150,0,0,12 +BRDA:150,0,1,792 +BRF:16 +BRH:16 +LF:68 +LH:68 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/modexp.cpp +FN:140,_ZN6evmone6crypto6modexpESt4spanIKhLm18446744073709551615EES3_S3_Ph +FN:145,modexp.cpp:_ZZN6evmone6crypto6modexpESt4spanIKhLm18446744073709551615EES3_S3_PhENK3$_0clIhEEDaT_ +FN:107,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm16EEEvSt4spanIKhLm18446744073709551615EES3_S3_Ph +FN:96,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj128EEEEET_St4spanIKhLm18446744073709551615EE +FN:23,modexp.cpp:_ZN12_GLOBAL__N_13ctzILj128EEEjRKN4intx4uintIXT_EEE +FN:39,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj128EEEEET_RKS4_St4spanIKhLm18446744073709551615EES6_ +FN:60,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj128EEEEET_RKS4_St4spanIKhLm18446744073709551615EEj +FN:82,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj128EEEEET_RKS4_j +FN:15,modexp.cpp:_ZN12_GLOBAL__N_15truncILj128EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FN:107,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm32EEEvSt4spanIKhLm18446744073709551615EES3_S3_Ph +FN:96,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj256EEEEET_St4spanIKhLm18446744073709551615EE +FN:23,modexp.cpp:_ZN12_GLOBAL__N_13ctzILj256EEEjRKN4intx4uintIXT_EEE +FN:39,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj256EEEEET_RKS4_St4spanIKhLm18446744073709551615EES6_ +FN:60,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj256EEEEET_RKS4_St4spanIKhLm18446744073709551615EEj +FN:82,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj256EEEEET_RKS4_j +FN:15,modexp.cpp:_ZN12_GLOBAL__N_15truncILj256EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FN:107,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm64EEEvSt4spanIKhLm18446744073709551615EES3_S3_Ph +FN:96,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj512EEEEET_St4spanIKhLm18446744073709551615EE +FN:23,modexp.cpp:_ZN12_GLOBAL__N_13ctzILj512EEEjRKN4intx4uintIXT_EEE +FN:39,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj512EEEEET_RKS4_St4spanIKhLm18446744073709551615EES6_ +FN:60,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj512EEEEET_RKS4_St4spanIKhLm18446744073709551615EEj +FN:82,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj512EEEEET_RKS4_j +FN:15,modexp.cpp:_ZN12_GLOBAL__N_15truncILj512EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FN:107,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm128EEEvSt4spanIKhLm18446744073709551615EES3_S3_Ph +FN:96,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj1024EEEEET_St4spanIKhLm18446744073709551615EE +FN:23,modexp.cpp:_ZN12_GLOBAL__N_13ctzILj1024EEEjRKN4intx4uintIXT_EEE +FN:39,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj1024EEEEET_RKS4_St4spanIKhLm18446744073709551615EES6_ +FN:60,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj1024EEEEET_RKS4_St4spanIKhLm18446744073709551615EEj +FN:82,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj1024EEEEET_RKS4_j +FN:15,modexp.cpp:_ZN12_GLOBAL__N_15truncILj1024EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FN:107,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm256EEEvSt4spanIKhLm18446744073709551615EES3_S3_Ph +FN:96,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj2048EEEEET_St4spanIKhLm18446744073709551615EE +FN:23,modexp.cpp:_ZN12_GLOBAL__N_13ctzILj2048EEEjRKN4intx4uintIXT_EEE +FN:39,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj2048EEEEET_RKS4_St4spanIKhLm18446744073709551615EES6_ +FN:60,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj2048EEEEET_RKS4_St4spanIKhLm18446744073709551615EEj +FN:82,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj2048EEEEET_RKS4_j +FN:15,modexp.cpp:_ZN12_GLOBAL__N_15truncILj2048EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FN:107,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm1024EEEvSt4spanIKhLm18446744073709551615EES3_S3_Ph +FN:96,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj8192EEEEET_St4spanIKhLm18446744073709551615EE +FN:23,modexp.cpp:_ZN12_GLOBAL__N_13ctzILj8192EEEjRKN4intx4uintIXT_EEE +FN:39,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj8192EEEEET_RKS4_St4spanIKhLm18446744073709551615EES6_ +FN:60,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj8192EEEEET_RKS4_St4spanIKhLm18446744073709551615EEj +FN:82,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj8192EEEEET_RKS4_j +FN:15,modexp.cpp:_ZN12_GLOBAL__N_15truncILj8192EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNDA:2909,_ZN6evmone6crypto6modexpESt4spanIKhLm18446744073709551615EES3_S3_Ph +FNDA:66695,modexp.cpp:_ZZN6evmone6crypto6modexpESt4spanIKhLm18446744073709551615EES3_S3_PhENK3$_0clIhEEDaT_ +FNDA:856,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm16EEEvSt4spanIKhLm18446744073709551615EES3_S3_Ph +FNDA:1712,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj128EEEEET_St4spanIKhLm18446744073709551615EE +FNDA:856,modexp.cpp:_ZN12_GLOBAL__N_13ctzILj128EEEjRKN4intx4uintIXT_EEE +FNDA:590,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj128EEEEET_RKS4_St4spanIKhLm18446744073709551615EES6_ +FNDA:610,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj128EEEEET_RKS4_St4spanIKhLm18446744073709551615EEj +FNDA:344,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj128EEEEET_RKS4_j +FNDA:856,modexp.cpp:_ZN12_GLOBAL__N_15truncILj128EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNDA:1190,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm32EEEvSt4spanIKhLm18446744073709551615EES3_S3_Ph +FNDA:2380,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj256EEEEET_St4spanIKhLm18446744073709551615EE +FNDA:1190,modexp.cpp:_ZN12_GLOBAL__N_13ctzILj256EEEjRKN4intx4uintIXT_EEE +FNDA:842,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj256EEEEET_RKS4_St4spanIKhLm18446744073709551615EES6_ +FNDA:602,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj256EEEEET_RKS4_St4spanIKhLm18446744073709551615EEj +FNDA:254,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj256EEEEET_RKS4_j +FNDA:1190,modexp.cpp:_ZN12_GLOBAL__N_15truncILj256EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNDA:593,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm64EEEvSt4spanIKhLm18446744073709551615EES3_S3_Ph +FNDA:1186,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj512EEEEET_St4spanIKhLm18446744073709551615EE +FNDA:593,modexp.cpp:_ZN12_GLOBAL__N_13ctzILj512EEEjRKN4intx4uintIXT_EEE +FNDA:551,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj512EEEEET_RKS4_St4spanIKhLm18446744073709551615EES6_ +FNDA:210,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj512EEEEET_RKS4_St4spanIKhLm18446744073709551615EEj +FNDA:168,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj512EEEEET_RKS4_j +FNDA:593,modexp.cpp:_ZN12_GLOBAL__N_15truncILj512EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNDA:42,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm128EEEvSt4spanIKhLm18446744073709551615EES3_S3_Ph +FNDA:84,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj1024EEEEET_St4spanIKhLm18446744073709551615EE +FNDA:42,modexp.cpp:_ZN12_GLOBAL__N_13ctzILj1024EEEjRKN4intx4uintIXT_EEE +FNDA:42,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj1024EEEEET_RKS4_St4spanIKhLm18446744073709551615EES6_ +FNDA:0,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj1024EEEEET_RKS4_St4spanIKhLm18446744073709551615EEj +FNDA:0,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj1024EEEEET_RKS4_j +FNDA:42,modexp.cpp:_ZN12_GLOBAL__N_15truncILj1024EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNDA:70,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm256EEEvSt4spanIKhLm18446744073709551615EES3_S3_Ph +FNDA:140,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj2048EEEEET_St4spanIKhLm18446744073709551615EE +FNDA:70,modexp.cpp:_ZN12_GLOBAL__N_13ctzILj2048EEEjRKN4intx4uintIXT_EEE +FNDA:70,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj2048EEEEET_RKS4_St4spanIKhLm18446744073709551615EES6_ +FNDA:14,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj2048EEEEET_RKS4_St4spanIKhLm18446744073709551615EEj +FNDA:14,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj2048EEEEET_RKS4_j +FNDA:70,modexp.cpp:_ZN12_GLOBAL__N_15truncILj2048EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNDA:158,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm1024EEEvSt4spanIKhLm18446744073709551615EES3_S3_Ph +FNDA:316,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj8192EEEEET_St4spanIKhLm18446744073709551615EE +FNDA:158,modexp.cpp:_ZN12_GLOBAL__N_13ctzILj8192EEEjRKN4intx4uintIXT_EEE +FNDA:156,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj8192EEEEET_RKS4_St4spanIKhLm18446744073709551615EES6_ +FNDA:20,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj8192EEEEET_RKS4_St4spanIKhLm18446744073709551615EEj +FNDA:18,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj8192EEEEET_RKS4_j +FNDA:158,modexp.cpp:_ZN12_GLOBAL__N_15truncILj8192EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNF:9 +FNH:9 +DA:15,2909 +DA:16,2909 +DA:17,2909 +DA:18,2909 +DA:19,2909 +DA:23,2909 +DA:24,2909 +DA:25,4221 +DA:26,4221 +DA:27,4221 +DA:28,2909 +DA:29,2909 +DA:30,2909 +DA:31,2909 +DA:32,1312 +DA:33,1312 +DA:34,2909 +DA:35,2909 +DA:39,2251 +DA:40,2251 +DA:41,2251 +DA:43,2251 +DA:44,2251 +DA:45,40378 +DA:46,363402 +DA:47,323024 +DA:48,323024 +DA:49,323024 +DA:50,323024 +DA:51,229047 +DA:52,323024 +DA:53,40378 +DA:55,2251 +DA:56,2251 +DA:60,1456 +DA:61,1456 +DA:62,1456 +DA:63,1456 +DA:64,23230 +DA:65,209070 +DA:66,185840 +DA:67,185840 +DA:68,185840 +DA:69,185840 +DA:70,119390 +DA:71,185840 +DA:72,23230 +DA:74,1456 +DA:75,1456 +DA:76,1456 +DA:77,1456 +DA:82,798 +DA:83,798 +DA:84,798 +DA:85,57030 +DA:86,56232 +DA:87,56232 +DA:88,56232 +DA:89,56232 +DA:90,56232 +DA:91,798 +DA:92,798 +DA:96,5818 +DA:97,5818 +DA:98,5818 +DA:99,5818 +DA:100,5818 +DA:101,5818 +DA:102,5818 +DA:107,2909 +DA:108,2909 +DA:109,2909 +DA:110,2909 +DA:112,2909 +DA:113,2909 +DA:114,1453 +DA:115,1453 +DA:116,1453 +DA:117,1456 +DA:118,658 +DA:119,658 +DA:120,658 +DA:121,798 +DA:122,798 +DA:123,798 +DA:124,798 +DA:126,798 +DA:128,798 +DA:129,798 +DA:130,798 +DA:132,2909 +DA:133,2909 +DA:140,2909 +DA:141,2909 +DA:142,2909 +DA:143,2909 +DA:145,66695 +DA:146,2909 +DA:148,2909 +DA:149,856 +DA:150,2053 +DA:151,1190 +DA:152,863 +DA:153,593 +DA:154,270 +DA:155,42 +DA:156,228 +DA:157,70 +DA:158,158 +DA:159,158 +DA:160,2909 +BRDA:25,0,0,70 +BRDA:25,0,1,0 +BRDA:25,1,2,42 +BRDA:25,1,3,0 +BRDA:25,2,4,1676 +BRDA:25,2,5,0 +BRDA:25,3,6,593 +BRDA:25,3,7,0 +BRDA:25,4,8,870 +BRDA:25,4,9,0 +BRDA:25,5,10,970 +BRDA:25,5,11,0 +BRDA:27,0,0,1190 +BRDA:27,0,1,486 +BRDA:27,1,2,42 +BRDA:27,1,3,0 +BRDA:27,2,4,856 +BRDA:27,2,5,14 +BRDA:27,3,6,158 +BRDA:27,3,7,812 +BRDA:27,4,8,70 +BRDA:27,4,9,0 +BRDA:27,5,10,593 +BRDA:27,5,11,0 +BRDA:44,0,0,12724 +BRDA:44,0,1,842 +BRDA:44,1,2,5224 +BRDA:44,1,3,551 +BRDA:44,2,4,18510 +BRDA:44,2,5,590 +BRDA:44,3,6,182 +BRDA:44,3,7,156 +BRDA:44,4,8,3668 +BRDA:44,4,9,70 +BRDA:44,5,10,70 +BRDA:44,5,11,42 +BRDA:46,0,0,41792 +BRDA:46,0,1,5224 +BRDA:46,1,2,29344 +BRDA:46,1,3,3668 +BRDA:46,2,4,560 +BRDA:46,2,5,70 +BRDA:46,3,6,101792 +BRDA:46,3,7,12724 +BRDA:46,4,8,1456 +BRDA:46,4,9,182 +BRDA:46,5,10,148080 +BRDA:46,5,11,18510 +BRDA:50,0,0,73144 +BRDA:50,0,1,28648 +BRDA:50,1,2,196 +BRDA:50,1,3,1260 +BRDA:50,2,4,14910 +BRDA:50,2,5,14434 +BRDA:50,3,6,70 +BRDA:50,3,7,490 +BRDA:50,4,8,30835 +BRDA:50,4,9,10957 +BRDA:50,5,10,109892 +BRDA:50,5,11,38188 +BRDA:63,0,0,15636 +BRDA:63,0,1,610 +BRDA:63,1,2,3584 +BRDA:63,1,3,14 +BRDA:63,2,4,1008 +BRDA:63,2,5,210 +BRDA:63,3,6,- +BRDA:63,3,7,- +BRDA:63,4,8,2988 +BRDA:63,4,9,602 +BRDA:63,5,10,14 +BRDA:63,5,11,20 +BRDA:65,0,0,125088 +BRDA:65,0,1,15636 +BRDA:65,1,2,8064 +BRDA:65,1,3,1008 +BRDA:65,2,4,28672 +BRDA:65,2,5,3584 +BRDA:65,3,6,- +BRDA:65,3,7,- +BRDA:65,4,8,23904 +BRDA:65,4,9,2988 +BRDA:65,5,10,112 +BRDA:65,5,11,14 +BRDA:69,0,0,- +BRDA:69,0,1,- +BRDA:69,1,2,10996 +BRDA:69,1,3,12908 +BRDA:69,2,4,5376 +BRDA:69,2,5,2688 +BRDA:69,3,6,14812 +BRDA:69,3,7,13860 +BRDA:69,4,8,88192 +BRDA:69,4,9,36896 +BRDA:69,5,10,14 +BRDA:69,5,11,98 +BRDA:85,0,0,52420 +BRDA:85,0,1,18 +BRDA:85,1,2,42 +BRDA:85,1,3,14 +BRDA:85,2,4,- +BRDA:85,2,5,- +BRDA:85,3,6,2502 +BRDA:85,3,7,344 +BRDA:85,4,8,196 +BRDA:85,4,9,168 +BRDA:85,5,10,1072 +BRDA:85,5,11,254 +BRDA:113,0,0,56 +BRDA:113,0,1,14 +BRDA:113,1,2,246 +BRDA:113,1,3,610 +BRDA:113,2,4,588 +BRDA:113,2,5,602 +BRDA:113,3,6,138 +BRDA:113,3,7,20 +BRDA:113,4,8,383 +BRDA:113,4,9,210 +BRDA:113,5,10,42 +BRDA:113,5,11,0 +BRDA:117,0,0,348 +BRDA:117,0,1,254 +BRDA:117,1,2,42 +BRDA:117,1,3,168 +BRDA:117,2,4,2 +BRDA:117,2,5,18 +BRDA:117,3,6,- +BRDA:117,3,7,- +BRDA:117,4,8,266 +BRDA:117,4,9,344 +BRDA:117,5,10,0 +BRDA:117,5,11,14 +BRDA:148,0,0,856 +BRDA:148,0,1,2053 +BRDA:150,0,0,1190 +BRDA:150,0,1,863 +BRDA:152,0,0,593 +BRDA:152,0,1,270 +BRDA:154,0,0,42 +BRDA:154,0,1,228 +BRDA:156,0,0,70 +BRDA:156,0,1,158 +BRF:32 +BRH:31 +LF:110 +LH:110 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/pairing/bn254/fields.hpp +FN:64,_ZN6evmmax5bn2548multiplyERKNS_3ecc12ExtFieldElemINS0_9Fq2ConfigEEES6_ +FN:96,_ZN6evmmax5bn2548multiplyERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEES6_ +FN:73,_ZN6evmmax5bn2548multiplyERKNS_3ecc12ExtFieldElemINS0_9Fq6ConfigEEES6_ +FN:165,_ZN6evmmax5bn2547inverseERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FN:138,_ZN6evmmax5bn2547inverseERKNS_3ecc12ExtFieldElemINS0_9Fq6ConfigEEE +FN:121,_ZN6evmmax5bn2547inverseERKNS_3ecc12ExtFieldElemINS0_9Fq2ConfigEEE +FN:115,_ZN6evmmax5bn2547inverseERKNS_3ecc13BaseFieldElemINS0_15BaseFieldConfigEEE +FNDA:7542774,_ZN6evmmax5bn2548multiplyERKNS_3ecc12ExtFieldElemINS0_9Fq2ConfigEEES6_ +FNDA:35058,_ZN6evmmax5bn2548multiplyERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEES6_ +FNDA:235494,_ZN6evmmax5bn2548multiplyERKNS_3ecc12ExtFieldElemINS0_9Fq6ConfigEEES6_ +FNDA:516,_ZN6evmmax5bn2547inverseERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FNDA:516,_ZN6evmmax5bn2547inverseERKNS_3ecc12ExtFieldElemINS0_9Fq6ConfigEEE +FNDA:516,_ZN6evmmax5bn2547inverseERKNS_3ecc12ExtFieldElemINS0_9Fq2ConfigEEE +FNDA:516,_ZN6evmmax5bn2547inverseERKNS_3ecc13BaseFieldElemINS0_15BaseFieldConfigEEE +FNF:7 +FNH:7 +DA:64,7542774 +DA:65,7542774 +DA:66,7542774 +DA:67,7542774 +DA:68,7542774 +DA:69,7542774 +DA:73,235494 +DA:74,235494 +DA:75,235494 +DA:76,235494 +DA:77,235494 +DA:78,235494 +DA:79,235494 +DA:81,235494 +DA:83,235494 +DA:84,235494 +DA:85,235494 +DA:87,235494 +DA:88,235494 +DA:89,235494 +DA:91,235494 +DA:92,235494 +DA:96,35058 +DA:97,35058 +DA:98,35058 +DA:99,35058 +DA:100,35058 +DA:102,35058 +DA:103,35058 +DA:105,35058 +DA:107,35058 +DA:108,35058 +DA:110,35058 +DA:111,35058 +DA:115,516 +DA:116,516 +DA:117,516 +DA:121,516 +DA:122,516 +DA:123,516 +DA:124,516 +DA:125,516 +DA:127,516 +DA:128,516 +DA:130,516 +DA:131,516 +DA:133,516 +DA:134,516 +DA:138,516 +DA:139,516 +DA:140,516 +DA:141,516 +DA:143,516 +DA:145,516 +DA:146,516 +DA:147,516 +DA:149,516 +DA:150,516 +DA:151,516 +DA:153,516 +DA:154,516 +DA:155,516 +DA:157,516 +DA:158,516 +DA:160,516 +DA:161,516 +DA:165,516 +DA:166,516 +DA:167,516 +DA:169,516 +DA:170,516 +DA:172,516 +DA:174,516 +DA:175,516 +DA:177,516 +DA:178,516 +DA:180,516 +DA:181,516 +BRF:0 +BRH:0 +LF:78 +LH:78 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/pairing/bn254/pairing.cpp +FN:132,_ZN6evmmax5bn25413pairing_checkESt4spanIKSt4pairINS_3ecc5PointIN4intx4uintILj256EEEEENS4_IS2_IS7_S7_EEEELm18446744073709551615EE +FN:49,pairing.cpp:_ZN6evmmax5bn25412_GLOBAL__N_111miller_loopERKNS_3ecc5PointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKNS3_INS2_13BaseFieldElemINS0_15BaseFieldConfigEEEEE +FN:18,pairing.cpp:_ZN6evmmax5bn25412_GLOBAL__N_126multiply_by_lin_func_valueERNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEESt5arrayINS3_INS0_9Fq2ConfigEEELm3EERKNS2_13BaseFieldElemINS0_15BaseFieldConfigEEESF_ +FN:96,pairing.cpp:_ZN6evmmax5bn25412_GLOBAL__N_19final_expERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FNDA:1598,_ZN6evmmax5bn25413pairing_checkESt4spanIKSt4pairINS_3ecc5PointIN4intx4uintILj256EEEEENS4_IS2_IS7_S7_EEEELm18446744073709551615EE +FNDA:1002,pairing.cpp:_ZN6evmmax5bn25412_GLOBAL__N_111miller_loopERKNS_3ecc5PointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKNS3_INS2_13BaseFieldElemINS0_15BaseFieldConfigEEEEE +FNDA:87174,pairing.cpp:_ZN6evmmax5bn25412_GLOBAL__N_126multiply_by_lin_func_valueERNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEESt5arrayINS3_INS0_9Fq2ConfigEEELm3EERKNS2_13BaseFieldElemINS0_15BaseFieldConfigEEESF_ +FNDA:516,pairing.cpp:_ZN6evmmax5bn25412_GLOBAL__N_19final_expERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FNF:4 +FNH:4 +DA:18,87174 +DA:19,87174 +DA:20,87174 +DA:22,87174 +DA:23,87174 +DA:24,87174 +DA:26,87174 +DA:27,87174 +DA:28,87174 +DA:29,87174 +DA:30,87174 +DA:31,87174 +DA:32,87174 +DA:33,87174 +DA:34,87174 +DA:35,87174 +DA:36,87174 +DA:37,87174 +DA:38,87174 +DA:49,1002 +DA:50,1002 +DA:51,1002 +DA:52,1002 +DA:53,1002 +DA:54,1002 +DA:55,1002 +DA:57,65130 +DA:58,64128 +DA:59,64128 +DA:60,64128 +DA:61,64128 +DA:63,64128 +DA:64,9018 +DA:65,9018 +DA:66,9018 +DA:67,9018 +DA:68,55110 +DA:69,12024 +DA:70,12024 +DA:71,12024 +DA:72,12024 +DA:73,64128 +DA:74,64128 +DA:78,1002 +DA:82,1002 +DA:84,1002 +DA:85,1002 +DA:87,1002 +DA:88,1002 +DA:90,1002 +DA:91,1002 +DA:96,516 +DA:97,516 +DA:98,516 +DA:100,516 +DA:101,516 +DA:103,516 +DA:105,516 +DA:106,516 +DA:107,516 +DA:108,516 +DA:109,516 +DA:110,516 +DA:111,516 +DA:112,516 +DA:113,516 +DA:114,516 +DA:115,516 +DA:116,516 +DA:117,516 +DA:119,516 +DA:120,516 +DA:121,516 +DA:122,516 +DA:123,516 +DA:124,516 +DA:125,516 +DA:126,516 +DA:127,516 +DA:128,516 +DA:132,1598 +DA:133,1598 +DA:134,284 +DA:136,1314 +DA:138,1314 +DA:139,2052 +DA:140,2052 +DA:141,2052 +DA:142,2052 +DA:143,132 +DA:144,132 +DA:145,132 +DA:148,1920 +DA:149,1920 +DA:150,1920 +DA:152,1920 +DA:153,1920 +DA:156,1920 +DA:157,108 +DA:161,1812 +DA:162,558 +DA:165,1254 +DA:166,1002 +DA:167,1254 +DA:170,516 +DA:171,1314 +BRDA:57,0,0,64128 +BRDA:57,0,1,1002 +BRDA:63,0,0,9018 +BRDA:63,0,1,55110 +BRDA:68,0,0,12024 +BRDA:68,0,1,43086 +BRDA:133,0,0,284 +BRDA:133,0,1,1314 +BRDA:138,0,0,2052 +BRDA:138,0,1,516 +BRDA:140,0,0,36 +BRDA:140,0,1,2016 +BRDA:140,1,2,6 +BRDA:140,1,3,2010 +BRDA:140,2,4,30 +BRDA:140,2,5,1980 +BRDA:141,0,0,6 +BRDA:141,0,1,1974 +BRDA:141,1,2,30 +BRDA:141,1,3,1944 +BRDA:142,0,0,24 +BRDA:142,0,1,1920 +BRDA:156,0,0,1584 +BRDA:156,0,1,336 +BRDA:156,1,2,108 +BRDA:156,1,3,1476 +BRDA:161,0,0,1602 +BRDA:161,0,1,210 +BRDA:161,1,2,84 +BRDA:161,1,3,1518 +BRDA:161,2,4,474 +BRDA:161,2,5,1044 +BRDA:165,0,0,1146 +BRDA:165,0,1,108 +BRDA:165,1,2,1002 +BRDA:165,1,3,144 +BRF:36 +BRH:36 +LF:106 +LH:106 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/pairing/bn254/utils.hpp +FN:72,_ZN6evmmax5bn25416is_field_elementERKN4intx4uintILj256EEE +FN:98,_ZN6evmmax5bn25411is_infinityERKNS_3ecc5PointINS1_13BaseFieldElemINS0_15BaseFieldConfigEEEEE +FN:104,_ZN6evmmax5bn25414g2_is_infinityERKNS_3ecc5PointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FN:78,_ZN6evmmax5bn25411is_on_curveERKNS_3ecc5PointINS1_13BaseFieldElemINS0_15BaseFieldConfigEEEEE +FN:89,_ZN6evmmax5bn25419is_on_twisted_curveERKNS_3ecc5PointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FN:326,_ZN6evmmax5bn25417g2_subgroup_checkERKNS_3ecc5PointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FN:288,_ZN6evmmax5bn2548mul_by_XERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FN:277,_ZN6evmmax5bn2545n_dblILi6EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FN:277,_ZN6evmmax5bn2545n_dblILi7EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FN:277,_ZN6evmmax5bn2545n_dblILi8EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FN:277,_ZN6evmmax5bn2545n_dblILi10EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FN:212,_ZN6evmmax5bn2543addERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEES8_ +FN:249,_ZN6evmmax5bn2543dblERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FN:120,_ZN6evmmax5bn25412endomorphismILi1EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QooeqT_Li1EeqT_Li3E +FN:134,_ZN6evmmax5bn25412endomorphismILi2EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QeqT_Li2E +FN:348,_ZN6evmmax5bn25416lin_func_and_dblERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEERSt5arrayIS5_Lm3EE +FN:441,_ZN6evmmax5bn2546squareERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FN:382,_ZN6evmmax5bn25416lin_func_and_addERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEERKNS1_5PointIS5_EERSt5arrayIS5_Lm3EE +FN:148,_ZN6evmmax5bn25412endomorphismILi1EEENS_3ecc5PointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QooeqT_Li1EeqT_Li3E +FN:161,_ZN6evmmax5bn25412endomorphismILi2EEENS_3ecc5PointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QeqT_Li2E +FN:420,_ZN6evmmax5bn2548lin_funcERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEERKNS1_5PointIS5_EERSt5arrayIS5_Lm3EE +FN:193,_ZN6evmmax5bn25412endomorphismILi2EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_QeqT_Li2E +FN:520,_ZN6evmmax5bn25419cyclotomic_pow_to_XERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FN:509,_ZN6evmmax5bn25419n_cyclotomic_squareILi6EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FN:509,_ZN6evmmax5bn25419n_cyclotomic_squareILi7EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FN:509,_ZN6evmmax5bn25419n_cyclotomic_squareILi8EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FN:509,_ZN6evmmax5bn25419n_cyclotomic_squareILi10EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FN:173,_ZN6evmmax5bn25412endomorphismILi1EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_QooeqT_Li1EeqT_Li3E +FN:173,_ZN6evmmax5bn25412endomorphismILi3EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_QooeqT_Li1EeqT_Li3E +FN:477,_ZN6evmmax5bn25417cyclotomic_squareERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FN:460,_ZN6evmmax5bn25410fq4_squareERKSt4pairINS_3ecc12ExtFieldElemINS0_9Fq2ConfigEEES5_E +FNDA:11976,_ZN6evmmax5bn25416is_field_elementERKN4intx4uintILj256EEE +FNDA:1920,_ZN6evmmax5bn25411is_infinityERKNS_3ecc5PointINS1_13BaseFieldElemINS0_15BaseFieldConfigEEEEE +FNDA:1920,_ZN6evmmax5bn25414g2_is_infinityERKNS_3ecc5PointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FNDA:1584,_ZN6evmmax5bn25411is_on_curveERKNS_3ecc5PointINS1_13BaseFieldElemINS0_15BaseFieldConfigEEEEE +FNDA:1602,_ZN6evmmax5bn25419is_on_twisted_curveERKNS_3ecc5PointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FNDA:1518,_ZN6evmmax5bn25417g2_subgroup_checkERKNS_3ecc5PointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FNDA:1518,_ZN6evmmax5bn2548mul_by_XERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FNDA:6072,_ZN6evmmax5bn2545n_dblILi6EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FNDA:1518,_ZN6evmmax5bn2545n_dblILi7EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FNDA:3036,_ZN6evmmax5bn2545n_dblILi8EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FNDA:1518,_ZN6evmmax5bn2545n_dblILi10EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FNDA:30360,_ZN6evmmax5bn2543addERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEES8_ +FNDA:95634,_ZN6evmmax5bn2543dblERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FNDA:4554,_ZN6evmmax5bn25412endomorphismILi1EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QooeqT_Li1EeqT_Li3E +FNDA:1518,_ZN6evmmax5bn25412endomorphismILi2EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QeqT_Li2E +FNDA:64128,_ZN6evmmax5bn25416lin_func_and_dblERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEERSt5arrayIS5_Lm3EE +FNDA:64128,_ZN6evmmax5bn2546squareERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FNDA:22044,_ZN6evmmax5bn25416lin_func_and_addERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEERKNS1_5PointIS5_EERSt5arrayIS5_Lm3EE +FNDA:1002,_ZN6evmmax5bn25412endomorphismILi1EEENS_3ecc5PointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QooeqT_Li1EeqT_Li3E +FNDA:1002,_ZN6evmmax5bn25412endomorphismILi2EEENS_3ecc5PointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QeqT_Li2E +FNDA:1002,_ZN6evmmax5bn2548lin_funcERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEERKNS1_5PointIS5_EERSt5arrayIS5_Lm3EE +FNDA:1548,_ZN6evmmax5bn25412endomorphismILi2EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_QeqT_Li2E +FNDA:1548,_ZN6evmmax5bn25419cyclotomic_pow_to_XERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FNDA:6192,_ZN6evmmax5bn25419n_cyclotomic_squareILi6EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FNDA:1548,_ZN6evmmax5bn25419n_cyclotomic_squareILi7EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FNDA:3096,_ZN6evmmax5bn25419n_cyclotomic_squareILi8EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FNDA:1548,_ZN6evmmax5bn25419n_cyclotomic_squareILi10EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FNDA:2064,_ZN6evmmax5bn25412endomorphismILi1EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_QooeqT_Li1EeqT_Li3E +FNDA:516,_ZN6evmmax5bn25412endomorphismILi3EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_QooeqT_Li1EeqT_Li3E +FNDA:98040,_ZN6evmmax5bn25417cyclotomic_squareERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FNDA:294120,_ZN6evmmax5bn25410fq4_squareERKSt4pairINS_3ecc12ExtFieldElemINS0_9Fq2ConfigEEES5_E +FNF:24 +FNH:24 +DA:72,11976 +DA:73,11976 +DA:74,11976 +DA:78,1584 +DA:80,1584 +DA:82,1584 +DA:83,1584 +DA:84,1584 +DA:85,1584 +DA:89,1602 +DA:90,1602 +DA:91,1602 +DA:93,1602 +DA:94,1602 +DA:98,1920 +DA:99,1920 +DA:100,1920 +DA:104,1920 +DA:105,1920 +DA:106,1920 +DA:120,4554 +DA:121,4554 +DA:122,4554 +DA:123,4554 +DA:124,4554 +DA:125,4554 +DA:126,4554 +DA:134,1518 +DA:135,1518 +DA:136,1518 +DA:137,1518 +DA:138,1518 +DA:139,1518 +DA:140,1518 +DA:148,1002 +DA:149,1002 +DA:150,1002 +DA:151,1002 +DA:152,1002 +DA:153,1002 +DA:161,1002 +DA:162,1002 +DA:163,1002 +DA:164,1002 +DA:165,1002 +DA:166,1002 +DA:173,2580 +DA:174,2580 +DA:175,2580 +DA:176,2580 +DA:177,2580 +DA:178,2580 +DA:179,2580 +DA:180,2580 +DA:181,2580 +DA:182,2580 +DA:183,2580 +DA:184,2580 +DA:185,2580 +DA:186,2580 +DA:193,1548 +DA:194,1548 +DA:195,1548 +DA:196,1548 +DA:197,1548 +DA:198,1548 +DA:199,1548 +DA:200,1548 +DA:201,1548 +DA:202,1548 +DA:203,1548 +DA:204,1548 +DA:205,1548 +DA:206,1548 +DA:212,30360 +DA:213,30360 +DA:214,30360 +DA:215,30360 +DA:217,30360 +DA:218,30360 +DA:219,30360 +DA:221,30360 +DA:222,30360 +DA:224,30360 +DA:225,30360 +DA:227,30360 +DA:228,30360 +DA:229,30360 +DA:230,30360 +DA:231,30360 +DA:232,30360 +DA:234,30360 +DA:235,30360 +DA:236,30360 +DA:238,30360 +DA:240,30360 +DA:241,30360 +DA:242,30360 +DA:244,30360 +DA:245,30360 +DA:249,95634 +DA:250,95634 +DA:251,95634 +DA:252,95634 +DA:254,95634 +DA:255,95634 +DA:256,95634 +DA:257,95634 +DA:258,95634 +DA:260,95634 +DA:261,95634 +DA:262,95634 +DA:263,95634 +DA:265,95634 +DA:267,95634 +DA:268,95634 +DA:269,95634 +DA:271,95634 +DA:272,95634 +DA:277,12144 +DA:278,12144 +DA:279,86526 +DA:280,74382 +DA:282,12144 +DA:283,12144 +DA:288,1518 +DA:289,1518 +DA:290,1518 +DA:291,1518 +DA:292,1518 +DA:293,1518 +DA:294,1518 +DA:295,1518 +DA:296,1518 +DA:297,1518 +DA:298,1518 +DA:299,1518 +DA:300,1518 +DA:301,1518 +DA:302,1518 +DA:303,1518 +DA:304,1518 +DA:305,1518 +DA:306,1518 +DA:307,1518 +DA:308,1518 +DA:309,1518 +DA:310,1518 +DA:311,1518 +DA:312,1518 +DA:313,1518 +DA:314,1518 +DA:315,1518 +DA:316,1518 +DA:317,1518 +DA:318,1518 +DA:320,1518 +DA:321,1518 +DA:326,1518 +DA:327,1518 +DA:329,1518 +DA:330,1518 +DA:331,1518 +DA:333,1518 +DA:334,1518 +DA:335,1518 +DA:337,1518 +DA:339,1518 +DA:340,1518 +DA:348,64128 +DA:349,64128 +DA:350,64128 +DA:351,64128 +DA:353,64128 +DA:354,64128 +DA:355,64128 +DA:356,64128 +DA:357,64128 +DA:359,64128 +DA:360,64128 +DA:361,64128 +DA:362,64128 +DA:364,64128 +DA:366,64128 +DA:367,64128 +DA:368,64128 +DA:370,64128 +DA:371,64128 +DA:372,64128 +DA:374,64128 +DA:375,64128 +DA:382,22044 +DA:383,22044 +DA:384,22044 +DA:385,22044 +DA:387,22044 +DA:388,22044 +DA:390,22044 +DA:391,22044 +DA:393,22044 +DA:394,22044 +DA:395,22044 +DA:396,22044 +DA:398,22044 +DA:399,22044 +DA:400,22044 +DA:402,22044 +DA:404,22044 +DA:405,22044 +DA:406,22044 +DA:408,22044 +DA:409,22044 +DA:410,22044 +DA:412,22044 +DA:413,22044 +DA:420,1002 +DA:421,1002 +DA:422,1002 +DA:423,1002 +DA:425,1002 +DA:426,1002 +DA:428,1002 +DA:429,1002 +DA:431,1002 +DA:432,1002 +DA:434,1002 +DA:435,1002 +DA:436,1002 +DA:437,1002 +DA:441,64128 +DA:442,64128 +DA:444,64128 +DA:445,64128 +DA:446,64128 +DA:447,64128 +DA:448,64128 +DA:449,64128 +DA:450,64128 +DA:451,64128 +DA:452,64128 +DA:454,64128 +DA:455,64128 +DA:460,294120 +DA:461,294120 +DA:462,294120 +DA:464,294120 +DA:465,294120 +DA:467,294120 +DA:468,294120 +DA:469,294120 +DA:471,294120 +DA:472,294120 +DA:477,98040 +DA:478,98040 +DA:479,98040 +DA:481,98040 +DA:482,98040 +DA:483,98040 +DA:485,98040 +DA:486,98040 +DA:487,98040 +DA:489,98040 +DA:490,98040 +DA:491,98040 +DA:493,98040 +DA:495,98040 +DA:496,98040 +DA:497,98040 +DA:499,98040 +DA:500,98040 +DA:501,98040 +DA:503,98040 +DA:504,98040 +DA:509,12384 +DA:510,12384 +DA:511,100620 +DA:512,88236 +DA:514,12384 +DA:515,12384 +DA:520,1548 +DA:521,1548 +DA:522,1548 +DA:523,1548 +DA:524,1548 +DA:525,1548 +DA:526,1548 +DA:527,1548 +DA:528,1548 +DA:529,1548 +DA:530,1548 +DA:531,1548 +DA:532,1548 +DA:533,1548 +DA:534,1548 +DA:535,1548 +DA:536,1548 +DA:537,1548 +DA:538,1548 +DA:539,1548 +DA:540,1548 +DA:541,1548 +DA:542,1548 +DA:543,1548 +DA:544,1548 +DA:545,1548 +DA:546,1548 +DA:547,1548 +DA:548,1548 +DA:549,1548 +DA:550,1548 +DA:552,1548 +DA:553,1548 +BRDA:99,0,0,360 +BRDA:99,0,1,1560 +BRDA:99,1,2,336 +BRDA:99,1,3,24 +BRDA:105,0,0,276 +BRDA:105,0,1,1644 +BRDA:105,1,2,264 +BRDA:105,1,3,12 +BRDA:279,0,0,30360 +BRDA:279,0,1,6072 +BRDA:279,1,2,9108 +BRDA:279,1,3,1518 +BRDA:279,2,4,21252 +BRDA:279,2,5,3036 +BRDA:279,3,6,13662 +BRDA:279,3,7,1518 +BRDA:511,0,0,37152 +BRDA:511,0,1,6192 +BRDA:511,1,2,10836 +BRDA:511,1,3,1548 +BRDA:511,2,4,24768 +BRDA:511,2,5,3096 +BRDA:511,3,6,15480 +BRDA:511,3,7,1548 +BRF:12 +BRH:12 +LF:312 +LH:312 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/pairing/field_template.hpp +FN:97,_ZN6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEE3oneEv +FN:82,_ZN6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEEC2Ev +FN:82,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEEC2Ev +FN:82,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEEC2Ev +FN:23,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEEC2Ev +FN:97,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEE3oneEv +FN:97,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE3oneEv +FN:38,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE3oneEv +FN:25,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEEC2ERKN4intx4uintILj256EEE +FN:28,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE8from_intERKN4intx4uintILj256EEE +FN:86,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEEC2ERKSt5arrayINS0_13BaseFieldElemINS2_15BaseFieldConfigEEELm2EE +FN:36,_ZNK6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE7is_zeroEv +FN:137,_ZN6evmmax3ecceqERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FN:66,_ZN6evmmax3ecceqERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FN:103,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE4zeroEv +FN:56,_ZN6evmmax3eccmlERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FN:44,_ZN6evmmax3eccplERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FN:132,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FN:50,_ZN6evmmax3eccmiERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FN:108,_ZN6evmmax3eccplERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FN:116,_ZN6evmmax3eccmiERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FN:89,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE9conjugateEv +FN:61,_ZN6evmmax3eccngERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEE +FN:132,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn25410Fq12ConfigEEES6_ +FN:132,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FN:108,_ZN6evmmax3eccplERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FN:86,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEEC2ERKSt5arrayINS1_INS2_9Fq2ConfigEEELm3EE +FN:116,_ZN6evmmax3eccmiERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FN:86,_ZN6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEEC2ERKSt5arrayINS1_INS2_9Fq6ConfigEEELm2EE +FN:124,_ZN6evmmax3eccngERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEE +FN:140,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEERKNS0_13BaseFieldElemINS2_15BaseFieldConfigEEE +FN:137,_ZN6evmmax3ecceqERKNS0_12ExtFieldElemINS_5bn25410Fq12ConfigEEES6_ +FN:137,_ZN6evmmax3ecceqERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FN:89,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEE9conjugateEv +FN:124,_ZN6evmmax3eccngERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEE +FN:105,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEE3invEv +FN:105,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEE3invEv +FN:105,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE3invEv +FN:34,_ZNK6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE3invEv +FN:32,_ZNK6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE5valueEv +FNDA:2832,_ZN6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEE3oneEv +FNDA:2832,_ZN6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEEC2Ev +FNDA:8496,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEEC2Ev +FNDA:46878,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEEC2Ev +FNDA:119436,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEEC2Ev +FNDA:2832,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEE3oneEv +FNDA:5352,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE3oneEv +FNDA:5352,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE3oneEv +FNDA:71325000,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEEC2ERKN4intx4uintILj256EEE +FNDA:11520,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE8from_intERKN4intx4uintILj256EEE +FNDA:20408622,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEEC2ERKSt5arrayINS0_13BaseFieldElemINS2_15BaseFieldConfigEEELm2EE +FNDA:2280,_ZNK6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE7is_zeroEv +FNDA:9066,_ZN6evmmax3ecceqERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FNDA:17544,_ZN6evmmax3ecceqERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FNDA:2196,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE4zeroEv +FNDA:30526608,_ZN6evmmax3eccmlERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FNDA:24260766,_ZN6evmmax3eccplERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FNDA:7542774,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FNDA:16461894,_ZN6evmmax3eccmiERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FNDA:8357946,_ZN6evmmax3eccplERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FNDA:4459560,_ZN6evmmax3eccmiERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FNDA:31146,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE9conjugateEv +FNDA:58344,_ZN6evmmax3eccngERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEE +FNDA:35058,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn25410Fq12ConfigEEES6_ +FNDA:235494,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FNDA:297558,_ZN6evmmax3eccplERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FNDA:1104234,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEEC2ERKSt5arrayINS1_INS2_9Fq2ConfigEEELm3EE +FNDA:198888,_ZN6evmmax3eccmiERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FNDA:204966,_ZN6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEEC2ERKSt5arrayINS1_INS2_9Fq6ConfigEEELm2EE +FNDA:12840,_ZN6evmmax3eccngERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEE +FNDA:174348,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEERKNS0_13BaseFieldElemINS2_15BaseFieldConfigEEE +FNDA:516,_ZN6evmmax3ecceqERKNS0_12ExtFieldElemINS_5bn25410Fq12ConfigEEES6_ +FNDA:954,_ZN6evmmax3ecceqERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FNDA:3096,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEE9conjugateEv +FNDA:3612,_ZN6evmmax3eccngERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEE +FNDA:516,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEE3invEv +FNDA:516,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEE3invEv +FNDA:516,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE3invEv +FNDA:516,_ZNK6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE3invEv +FNDA:516,_ZNK6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE5valueEv +FNF:24 +FNH:24 +DA:23,119436 +DA:25,71325000 +DA:28,11520 +DA:29,11520 +DA:30,11520 +DA:32,516 +DA:34,516 +DA:36,2280 +DA:38,5352 +DA:44,24260766 +DA:45,24260766 +DA:46,24260766 +DA:50,16461894 +DA:51,16461894 +DA:52,16461894 +DA:56,30526608 +DA:57,30526608 +DA:58,30526608 +DA:61,58344 +DA:62,58344 +DA:63,58344 +DA:66,17544 +DA:82,58206 +DA:86,21717822 +DA:89,34242 +DA:90,34242 +DA:91,68484 +DA:92,34242 +DA:93,34242 +DA:94,34242 +DA:97,11016 +DA:98,11016 +DA:99,11016 +DA:100,11016 +DA:101,11016 +DA:103,2196 +DA:105,1548 +DA:108,8655504 +DA:109,8655504 +DA:110,26264070 +DA:111,17608566 +DA:112,8655504 +DA:113,8655504 +DA:116,4658448 +DA:117,4658448 +DA:118,14174232 +DA:119,9515784 +DA:120,4658448 +DA:121,4658448 +DA:124,16452 +DA:125,16452 +DA:126,52968 +DA:127,36516 +DA:128,16452 +DA:129,16452 +DA:132,7813326 +DA:133,7813326 +DA:134,7813326 +DA:137,10536 +DA:140,174348 +DA:141,174348 +DA:142,174348 +DA:143,348696 +DA:144,174348 +DA:145,174348 +BRDA:91,0,0,31146 +BRDA:91,0,1,31146 +BRDA:91,1,2,3096 +BRDA:91,1,3,3096 +BRDA:110,0,0,16715892 +BRDA:110,0,1,8357946 +BRDA:110,1,2,892674 +BRDA:110,1,3,297558 +BRDA:118,0,0,8919120 +BRDA:118,0,1,4459560 +BRDA:118,1,2,596664 +BRDA:118,1,3,198888 +BRDA:126,0,0,25680 +BRDA:126,0,1,12840 +BRDA:126,1,2,10836 +BRDA:126,1,3,3612 +BRDA:142,0,0,348696 +BRDA:142,0,1,174348 +BRF:10 +BRH:10 +LF:65 +LH:65 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/ripemd160.cpp +FN:193,_ZN6evmone6crypto9ripemd160EPSt4bytePKS1_m +FN:181,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_18compressERSt5arrayIjLm5EEPKSt4byte +FN:176,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_15stepsIJLm0ELm1ELm2ELm3ELm4ELm5ELm6ELm7ELm8ELm9ELm10ELm11ELm12ELm13ELm14ELm15ELm16ELm17ELm18ELm19ELm20ELm21ELm22ELm23ELm24ELm25ELm26ELm27ELm28ELm29ELm30ELm31ELm32ELm33ELm34ELm35ELm36ELm37ELm38ELm39ELm40ELm41ELm42ELm43ELm44ELm45ELm46ELm47ELm48ELm49ELm50ELm51ELm52ELm53ELm54ELm55ELm56ELm57ELm58ELm59ELm60ELm61ELm62ELm63ELm64ELm65ELm66ELm67ELm68ELm69ELm70ELm71ELm72ELm73ELm74ELm75ELm76ELm77ELm78ELm79EEEEvPSt5arrayIjLm5EEPKSt4byteSt16integer_sequenceImJXspT_EEE +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm0EEEvPSt5arrayIjLm5EEPKSt4byte +FN:52,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_0clEjjj +FN:64,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_1clEjjj +FN:132,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_17load_leIjEET_PKSt4byte +FN:124,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_15to_leITkSt8integraljEEDaT_ +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm1EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm2EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm3EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm4EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm5EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm6EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm7EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm8EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm9EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm10EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm11EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm12EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm13EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm14EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm15EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm16EEEvPSt5arrayIjLm5EEPKSt4byte +FN:55,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_2clEjjj +FN:61,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_3clEjjj +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm17EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm18EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm19EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm20EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm21EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm22EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm23EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm24EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm25EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm26EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm27EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm28EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm29EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm30EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm31EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm32EEEvPSt5arrayIjLm5EEPKSt4byte +FN:58,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_4clEjjj +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm33EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm34EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm35EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm36EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm37EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm38EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm39EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm40EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm41EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm42EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm43EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm44EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm45EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm46EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm47EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm48EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm49EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm50EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm51EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm52EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm53EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm54EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm55EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm56EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm57EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm58EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm59EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm60EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm61EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm62EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm63EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm64EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm65EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm66EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm67EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm68EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm69EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm70EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm71EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm72EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm73EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm74EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm75EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm76EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm77EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm78EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm79EEEvPSt5arrayIjLm5EEPKSt4byte +FN:139,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_18store_leITkSt8integralmEEPSt4byteS4_T_ +FN:124,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_15to_leITkSt8integralmEEDaT_ +FN:139,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_18store_leITkSt8integraljEEPSt4byteS4_T_ +FNDA:568,_ZN6evmone6crypto9ripemd160EPSt4bytePKS1_m +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_18compressERSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_15stepsIJLm0ELm1ELm2ELm3ELm4ELm5ELm6ELm7ELm8ELm9ELm10ELm11ELm12ELm13ELm14ELm15ELm16ELm17ELm18ELm19ELm20ELm21ELm22ELm23ELm24ELm25ELm26ELm27ELm28ELm29ELm30ELm31ELm32ELm33ELm34ELm35ELm36ELm37ELm38ELm39ELm40ELm41ELm42ELm43ELm44ELm45ELm46ELm47ELm48ELm49ELm50ELm51ELm52ELm53ELm54ELm55ELm56ELm57ELm58ELm59ELm60ELm61ELm62ELm63ELm64ELm65ELm66ELm67ELm68ELm69ELm70ELm71ELm72ELm73ELm74ELm75ELm76ELm77ELm78ELm79EEEEvPSt5arrayIjLm5EEPKSt4byteSt16integer_sequenceImJXspT_EEE +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm0EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:19968,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_0clEjjj +FNDA:19968,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_1clEjjj +FNDA:99840,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_17load_leIjEET_PKSt4byte +FNDA:102680,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_15to_leITkSt8integraljEEDaT_ +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm1EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm2EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm3EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm4EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm5EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm6EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm7EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm8EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm9EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm10EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm11EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm12EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm13EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm14EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm15EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm16EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:19968,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_2clEjjj +FNDA:19968,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_3clEjjj +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm17EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm18EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm19EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm20EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm21EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm22EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm23EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm24EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm25EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm26EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm27EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm28EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm29EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm30EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm31EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm32EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:19968,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_4clEjjj +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm33EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm34EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm35EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm36EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm37EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm38EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm39EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm40EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm41EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm42EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm43EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm44EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm45EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm46EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm47EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm48EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm49EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm50EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm51EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm52EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm53EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm54EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm55EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm56EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm57EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm58EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm59EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm60EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm61EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm62EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm63EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm64EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm65EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm66EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm67EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm68EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm69EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm70EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm71EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm72EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm73EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm74EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm75EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm76EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm77EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm78EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:624,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm79EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:568,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_18store_leITkSt8integralmEEPSt4byteS4_T_ +FNDA:568,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_15to_leITkSt8integralmEEDaT_ +FNDA:2840,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_18store_leITkSt8integraljEEPSt4byteS4_T_ +FNF:12 +FNH:12 +DA:52,19968 +DA:55,19968 +DA:58,19968 +DA:61,19968 +DA:64,19968 +DA:124,103248 +DA:127,103248 +DA:128,103248 +DA:132,99840 +DA:133,99840 +DA:134,99840 +DA:135,99840 +DA:136,99840 +DA:139,3408 +DA:140,3408 +DA:141,3408 +DA:145,49920 +DA:146,49920 +DA:147,49920 +DA:149,149760 +DA:150,99840 +DA:151,99840 +DA:152,99840 +DA:153,99840 +DA:154,99840 +DA:156,99840 +DA:157,99840 +DA:158,99840 +DA:159,99840 +DA:160,99840 +DA:162,99840 +DA:163,99840 +DA:164,99840 +DA:165,99840 +DA:166,99840 +DA:167,99840 +DA:168,49920 +DA:176,624 +DA:177,624 +DA:178,624 +DA:181,624 +DA:182,624 +DA:183,624 +DA:185,624 +DA:186,3744 +DA:187,3120 +DA:188,624 +DA:189,624 +DA:193,568 +DA:194,568 +DA:195,568 +DA:197,568 +DA:198,624 +DA:199,56 +DA:201,568 +DA:202,568 +DA:203,568 +DA:204,568 +DA:207,568 +DA:208,568 +DA:209,568 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,568 +DA:215,568 +DA:216,568 +DA:218,568 +DA:219,2840 +DA:220,568 +BRDA:149,0,0,1248 +BRDA:149,0,1,624 +BRDA:149,1,2,1248 +BRDA:149,1,3,624 +BRDA:149,2,4,1248 +BRDA:149,2,5,624 +BRDA:149,3,6,1248 +BRDA:149,3,7,624 +BRDA:149,4,8,1248 +BRDA:149,4,9,624 +BRDA:149,5,10,1248 +BRDA:149,5,11,624 +BRDA:149,6,12,1248 +BRDA:149,6,13,624 +BRDA:149,7,14,1248 +BRDA:149,7,15,624 +BRDA:149,8,16,1248 +BRDA:149,8,17,624 +BRDA:149,9,18,1248 +BRDA:149,9,19,624 +BRDA:149,10,20,1248 +BRDA:149,10,21,624 +BRDA:149,11,22,1248 +BRDA:149,11,23,624 +BRDA:149,12,24,1248 +BRDA:149,12,25,624 +BRDA:149,13,26,1248 +BRDA:149,13,27,624 +BRDA:149,14,28,1248 +BRDA:149,14,29,624 +BRDA:149,15,30,1248 +BRDA:149,15,31,624 +BRDA:149,16,32,1248 +BRDA:149,16,33,624 +BRDA:149,17,34,1248 +BRDA:149,17,35,624 +BRDA:149,18,36,1248 +BRDA:149,18,37,624 +BRDA:149,19,38,1248 +BRDA:149,19,39,624 +BRDA:149,20,40,1248 +BRDA:149,20,41,624 +BRDA:149,21,42,1248 +BRDA:149,21,43,624 +BRDA:149,22,44,1248 +BRDA:149,22,45,624 +BRDA:149,23,46,1248 +BRDA:149,23,47,624 +BRDA:149,24,48,1248 +BRDA:149,24,49,624 +BRDA:149,25,50,1248 +BRDA:149,25,51,624 +BRDA:149,26,52,1248 +BRDA:149,26,53,624 +BRDA:149,27,54,1248 +BRDA:149,27,55,624 +BRDA:149,28,56,1248 +BRDA:149,28,57,624 +BRDA:149,29,58,1248 +BRDA:149,29,59,624 +BRDA:149,30,60,1248 +BRDA:149,30,61,624 +BRDA:149,31,62,1248 +BRDA:149,31,63,624 +BRDA:149,32,64,1248 +BRDA:149,32,65,624 +BRDA:149,33,66,1248 +BRDA:149,33,67,624 +BRDA:149,34,68,1248 +BRDA:149,34,69,624 +BRDA:149,35,70,1248 +BRDA:149,35,71,624 +BRDA:149,36,72,1248 +BRDA:149,36,73,624 +BRDA:149,37,74,1248 +BRDA:149,37,75,624 +BRDA:149,38,76,1248 +BRDA:149,38,77,624 +BRDA:149,39,78,1248 +BRDA:149,39,79,624 +BRDA:149,40,80,1248 +BRDA:149,40,81,624 +BRDA:149,41,82,1248 +BRDA:149,41,83,624 +BRDA:149,42,84,1248 +BRDA:149,42,85,624 +BRDA:149,43,86,1248 +BRDA:149,43,87,624 +BRDA:149,44,88,1248 +BRDA:149,44,89,624 +BRDA:149,45,90,1248 +BRDA:149,45,91,624 +BRDA:149,46,92,1248 +BRDA:149,46,93,624 +BRDA:149,47,94,1248 +BRDA:149,47,95,624 +BRDA:149,48,96,1248 +BRDA:149,48,97,624 +BRDA:149,49,98,1248 +BRDA:149,49,99,624 +BRDA:149,50,100,1248 +BRDA:149,50,101,624 +BRDA:149,51,102,1248 +BRDA:149,51,103,624 +BRDA:149,52,104,1248 +BRDA:149,52,105,624 +BRDA:149,53,106,1248 +BRDA:149,53,107,624 +BRDA:149,54,108,1248 +BRDA:149,54,109,624 +BRDA:149,55,110,1248 +BRDA:149,55,111,624 +BRDA:149,56,112,1248 +BRDA:149,56,113,624 +BRDA:149,57,114,1248 +BRDA:149,57,115,624 +BRDA:149,58,116,1248 +BRDA:149,58,117,624 +BRDA:149,59,118,1248 +BRDA:149,59,119,624 +BRDA:149,60,120,1248 +BRDA:149,60,121,624 +BRDA:149,61,122,1248 +BRDA:149,61,123,624 +BRDA:149,62,124,1248 +BRDA:149,62,125,624 +BRDA:149,63,126,1248 +BRDA:149,63,127,624 +BRDA:149,64,128,1248 +BRDA:149,64,129,624 +BRDA:149,65,130,1248 +BRDA:149,65,131,624 +BRDA:149,66,132,1248 +BRDA:149,66,133,624 +BRDA:149,67,134,1248 +BRDA:149,67,135,624 +BRDA:149,68,136,1248 +BRDA:149,68,137,624 +BRDA:149,69,138,1248 +BRDA:149,69,139,624 +BRDA:149,70,140,1248 +BRDA:149,70,141,624 +BRDA:149,71,142,1248 +BRDA:149,71,143,624 +BRDA:149,72,144,1248 +BRDA:149,72,145,624 +BRDA:149,73,146,1248 +BRDA:149,73,147,624 +BRDA:149,74,148,1248 +BRDA:149,74,149,624 +BRDA:149,75,150,1248 +BRDA:149,75,151,624 +BRDA:149,76,152,1248 +BRDA:149,76,153,624 +BRDA:149,77,154,1248 +BRDA:149,77,155,624 +BRDA:149,78,156,1248 +BRDA:149,78,157,624 +BRDA:149,79,158,1248 +BRDA:149,79,159,624 +BRDA:186,0,0,3120 +BRDA:186,0,1,624 +BRDA:198,0,0,56 +BRDA:198,0,1,568 +BRDA:209,0,0,0 +BRDA:209,0,1,568 +BRDA:218,0,0,2840 +BRDA:218,0,1,568 +BRF:10 +BRH:9 +LF:71 +LH:67 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/secp256k1.cpp +FN:20,_ZN6evmmax9secp256k111calculate_yERKNS_8ModArithIN4intx4uintILj256EEEEERKS4_b +FN:33,_ZN6evmmax9secp256k13mulERKNS_3ecc11AffinePointINS0_5CurveEEERKN4intx4uintILj256EEE +FN:39,_ZN6evmmax9secp256k110to_addressERKNS_3ecc11AffinePointINS0_5CurveEEE +FN:53,_ZN6evmmax9secp256k123secp256k1_ecdsa_recoverERK14ethash_hash256RKN4intx4uintILj256EEES8_b +FN:110,_ZN6evmmax9secp256k19ecrecoverERK14ethash_hash256RKN4intx4uintILj256EEES8_b +FN:119,_ZN6evmmax9secp256k110field_sqrtERKNS_8ModArithIN4intx4uintILj256EEEEERKS4_ +FNDA:730,_ZN6evmmax9secp256k111calculate_yERKNS_8ModArithIN4intx4uintILj256EEEEERKS4_b +FNDA:0,_ZN6evmmax9secp256k13mulERKNS_3ecc11AffinePointINS0_5CurveEEERKN4intx4uintILj256EEE +FNDA:676,_ZN6evmmax9secp256k110to_addressERKNS_3ecc11AffinePointINS0_5CurveEEE +FNDA:952,_ZN6evmmax9secp256k123secp256k1_ecdsa_recoverERK14ethash_hash256RKN4intx4uintILj256EEES8_b +FNDA:952,_ZN6evmmax9secp256k19ecrecoverERK14ethash_hash256RKN4intx4uintILj256EEES8_b +FNDA:730,_ZN6evmmax9secp256k110field_sqrtERKNS_8ModArithIN4intx4uintILj256EEEEERKS4_ +FNF:6 +FNH:5 +DA:20,730 +DA:22,730 +DA:23,730 +DA:24,730 +DA:25,48 +DA:28,682 +DA:29,682 +DA:30,730 +DA:33,0 +DA:34,0 +DA:35,0 +DA:36,0 +DA:39,676 +DA:41,676 +DA:42,676 +DA:44,676 +DA:45,676 +DA:46,676 +DA:48,676 +DA:49,676 +DA:53,952 +DA:58,952 +DA:59,222 +DA:65,730 +DA:66,730 +DA:67,730 +DA:68,0 +DA:70,730 +DA:73,730 +DA:74,730 +DA:76,730 +DA:77,730 +DA:78,730 +DA:79,730 +DA:81,730 +DA:82,730 +DA:83,730 +DA:84,730 +DA:87,730 +DA:88,730 +DA:89,730 +DA:90,730 +DA:91,48 +DA:94,682 +DA:95,682 +DA:96,682 +DA:97,682 +DA:98,682 +DA:100,682 +DA:102,682 +DA:103,6 +DA:105,676 +DA:106,682 +DA:110,952 +DA:111,952 +DA:112,952 +DA:113,276 +DA:115,676 +DA:116,952 +DA:119,730 +DA:149,730 +DA:150,730 +DA:151,730 +DA:152,730 +DA:153,730 +DA:157,730 +DA:160,730 +DA:163,730 +DA:164,1460 +DA:165,730 +DA:168,730 +DA:171,730 +DA:174,730 +DA:177,730 +DA:178,1460 +DA:179,730 +DA:182,730 +DA:185,730 +DA:186,2920 +DA:187,2190 +DA:190,730 +DA:193,730 +DA:194,8030 +DA:195,7300 +DA:198,730 +DA:201,730 +DA:202,3650 +DA:203,2920 +DA:206,730 +DA:209,730 +DA:210,19710 +DA:211,18980 +DA:214,730 +DA:217,730 +DA:218,39420 +DA:219,38690 +DA:222,730 +DA:225,730 +DA:226,78840 +DA:227,78110 +DA:230,730 +DA:233,5840 +DA:234,5110 +DA:237,730 +DA:240,17520 +DA:241,16790 +DA:244,730 +DA:247,5110 +DA:248,4380 +DA:251,730 +DA:254,2190 +DA:255,1460 +DA:257,730 +DA:258,48 +DA:260,682 +DA:261,730 +BRDA:24,0,0,48 +BRDA:24,0,1,682 +BRDA:29,0,0,256 +BRDA:29,0,1,426 +BRDA:58,0,0,222 +BRDA:58,0,1,730 +BRDA:58,1,2,6 +BRDA:58,1,3,946 +BRDA:58,2,4,12 +BRDA:58,2,5,934 +BRDA:58,3,6,192 +BRDA:58,3,7,742 +BRDA:58,4,8,12 +BRDA:58,4,9,730 +BRDA:67,0,0,0 +BRDA:67,0,1,730 +BRDA:90,0,0,48 +BRDA:90,0,1,682 +BRDA:102,0,0,6 +BRDA:102,0,1,676 +BRDA:112,0,0,276 +BRDA:112,0,1,676 +BRDA:164,0,0,730 +BRDA:164,0,1,730 +BRDA:178,0,0,730 +BRDA:178,0,1,730 +BRDA:186,0,0,2190 +BRDA:186,0,1,730 +BRDA:194,0,0,7300 +BRDA:194,0,1,730 +BRDA:202,0,0,2920 +BRDA:202,0,1,730 +BRDA:210,0,0,18980 +BRDA:210,0,1,730 +BRDA:218,0,0,38690 +BRDA:218,0,1,730 +BRDA:226,0,0,78110 +BRDA:226,0,1,730 +BRDA:233,0,0,5110 +BRDA:233,0,1,730 +BRDA:240,0,0,16790 +BRDA:240,0,1,730 +BRDA:247,0,0,4380 +BRDA:247,0,1,730 +BRDA:254,0,0,1460 +BRDA:254,0,1,730 +BRDA:257,0,0,48 +BRDA:257,0,1,682 +BRF:48 +BRH:47 +LF:116 +LH:111 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/secp256r1.cpp +FN:20,_ZN6evmmax9secp256r16verifyERK14ethash_hash256RKN4intx4uintILj256EEES8_S8_S8_ +FN:11,secp256r1.cpp:_ZN6evmmax9secp256r112_GLOBAL__N_111is_on_curveERKNS_3ecc11AffinePointINS0_5CurveEEE +FNDA:710,_ZN6evmmax9secp256r16verifyERK14ethash_hash256RKN4intx4uintILj256EEES8_S8_S8_ +FNDA:572,secp256r1.cpp:_ZN6evmmax9secp256r112_GLOBAL__N_111is_on_curveERKNS_3ecc11AffinePointINS0_5CurveEEE +FNF:2 +FNH:2 +DA:11,572 +DA:12,572 +DA:13,572 +DA:14,572 +DA:15,572 +DA:20,710 +DA:27,710 +DA:28,126 +DA:31,584 +DA:32,8 +DA:33,576 +DA:34,576 +DA:35,4 +DA:38,572 +DA:39,50 +DA:41,522 +DA:44,522 +DA:45,522 +DA:48,522 +DA:49,522 +DA:50,522 +DA:53,522 +DA:54,522 +DA:55,522 +DA:56,522 +DA:61,522 +DA:62,522 +DA:63,6 +DA:65,522 +DA:66,572 +BRDA:27,0,0,126 +BRDA:27,0,1,584 +BRDA:27,1,2,24 +BRDA:27,1,3,686 +BRDA:27,2,4,70 +BRDA:27,2,5,616 +BRDA:27,3,6,10 +BRDA:27,3,7,606 +BRDA:27,4,8,22 +BRDA:27,4,9,584 +BRDA:31,0,0,4 +BRDA:31,0,1,580 +BRDA:31,1,2,4 +BRDA:31,1,3,576 +BRDA:34,0,0,4 +BRDA:34,0,1,572 +BRDA:38,0,0,50 +BRDA:38,0,1,522 +BRDA:62,0,0,6 +BRDA:62,0,1,516 +BRF:20 +BRH:20 +LF:30 +LH:30 +end_of_record +SF:/home/builder/project/lib/evmone_precompiles/sha256.cpp +FN:476,sha256.cpp:_ZN6evmone6cryptoL28select_sha256_implementationEv +FN:714,_ZN6evmone6crypto6sha256EPSt4bytePKS1_m +FN:471,sha256.cpp:_ZN6evmone6cryptoL5cpuidEPii +FN:268,sha256.cpp:_ZN6evmone6cryptoL15sha_256_x86_shaEPjPKSt4bytem +FN:255,sha256.cpp:_ZN6evmone6cryptoL3setEmm +FN:70,_ZN6evmone6crypto11BufferStateC2EPKSt4bytem +FN:75,sha256.cpp:_ZN6evmone6cryptoL10calc_chunkEPhPNS0_11BufferStateE +FN:240,sha256.cpp:_ZN6evmone6cryptoL15sha_256_genericEPjPKSt4bytem +FN:140,sha256.cpp:_ZN6evmone6cryptoL22sha_256_implementationEPjPKSt4bytem +FN:250,sha256.cpp:_ZN6evmone6cryptoL15sha_256_x86_bmiEPjPKSt4bytem +FNDA:2,sha256.cpp:_ZN6evmone6cryptoL28select_sha256_implementationEv +FNDA:65503,_ZN6evmone6crypto6sha256EPSt4bytePKS1_m +FNDA:6,sha256.cpp:_ZN6evmone6cryptoL5cpuidEPii +FNDA:0,sha256.cpp:_ZN6evmone6cryptoL15sha_256_x86_shaEPjPKSt4bytem +FNDA:0,sha256.cpp:_ZN6evmone6cryptoL3setEmm +FNDA:65503,_ZN6evmone6crypto11BufferStateC2EPKSt4bytem +FNDA:156702,sha256.cpp:_ZN6evmone6cryptoL10calc_chunkEPhPNS0_11BufferStateE +FNDA:0,sha256.cpp:_ZN6evmone6cryptoL15sha_256_genericEPjPKSt4bytem +FNDA:65503,sha256.cpp:_ZN6evmone6cryptoL22sha_256_implementationEPjPKSt4bytem +FNDA:65503,sha256.cpp:_ZN6evmone6cryptoL15sha_256_x86_bmiEPjPKSt4bytem +FNF:10 +FNH:7 +DA:39,233778 +DA:40,131012 +DA:70,65503 +DA:71,65503 +DA:75,156702 +DA:76,156702 +DA:77,65503 +DA:78,65503 +DA:79,65503 +DA:81,91199 +DA:82,25690 +DA:83,25690 +DA:84,25690 +DA:85,25690 +DA:86,25690 +DA:87,25690 +DA:89,65509 +DA:90,65509 +DA:91,3701 +DA:92,3701 +DA:93,3701 +DA:94,3701 +DA:95,3701 +DA:96,65509 +DA:99,65509 +DA:100,65503 +DA:101,65503 +DA:102,65503 +DA:103,65503 +DA:104,65503 +DA:112,65509 +DA:113,65503 +DA:114,65503 +DA:115,65503 +DA:116,65503 +DA:117,65503 +DA:118,65503 +DA:121,65503 +DA:122,65503 +DA:123,524024 +DA:124,458521 +DA:125,458521 +DA:126,458521 +DA:127,458521 +DA:128,65503 +DA:129,65503 +DA:130,6 +DA:131,6 +DA:132,6 +DA:133,6 +DA:135,65509 +DA:136,91199 +DA:140,65503 +DA:155,65503 +DA:158,65503 +DA:160,156702 +DA:161,91199 +DA:162,91199 +DA:163,91199 +DA:165,91199 +DA:167,820791 +DA:168,729592 +DA:169,729592 +DA:170,729592 +DA:172,91199 +DA:187,91199 +DA:190,455995 +DA:191,364796 +DA:192,6201532 +DA:193,5836736 +DA:194,5836736 +DA:195,1459184 +DA:196,1459184 +DA:197,1459184 +DA:198,1459184 +DA:199,1459184 +DA:200,4377552 +DA:201,4377552 +DA:204,4377552 +DA:205,4377552 +DA:206,4377552 +DA:207,4377552 +DA:208,4377552 +DA:209,4377552 +DA:210,4377552 +DA:211,5836736 +DA:212,5836736 +DA:213,5836736 +DA:214,5836736 +DA:215,5836736 +DA:216,5836736 +DA:217,5836736 +DA:218,5836736 +DA:220,5836736 +DA:221,5836736 +DA:222,5836736 +DA:223,5836736 +DA:224,5836736 +DA:225,5836736 +DA:226,5836736 +DA:227,5836736 +DA:228,5836736 +DA:229,364796 +DA:232,820791 +DA:233,729592 +DA:234,729592 +DA:235,729592 +DA:236,91199 +DA:237,65503 +DA:240,0 +DA:241,0 +DA:242,0 +DA:250,65503 +DA:251,65503 +DA:252,65503 +DA:255,0 +DA:257,0 +DA:258,0 +DA:268,0 +DA:270,0 +DA:271,0 +DA:272,0 +DA:273,0 +DA:276,0 +DA:281,0 +DA:282,0 +DA:284,0 +DA:285,0 +DA:286,0 +DA:287,0 +DA:289,0 +DA:292,0 +DA:294,0 +DA:295,0 +DA:297,0 +DA:298,0 +DA:301,0 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,0 +DA:309,0 +DA:310,0 +DA:311,0 +DA:312,0 +DA:313,0 +DA:314,0 +DA:315,0 +DA:318,0 +DA:319,0 +DA:320,0 +DA:321,0 +DA:322,0 +DA:323,0 +DA:324,0 +DA:327,0 +DA:328,0 +DA:329,0 +DA:330,0 +DA:331,0 +DA:332,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,0 +DA:339,0 +DA:340,0 +DA:341,0 +DA:342,0 +DA:343,0 +DA:344,0 +DA:345,0 +DA:346,0 +DA:349,0 +DA:350,0 +DA:351,0 +DA:352,0 +DA:353,0 +DA:354,0 +DA:355,0 +DA:356,0 +DA:359,0 +DA:360,0 +DA:361,0 +DA:362,0 +DA:363,0 +DA:364,0 +DA:365,0 +DA:366,0 +DA:369,0 +DA:370,0 +DA:371,0 +DA:372,0 +DA:373,0 +DA:374,0 +DA:375,0 +DA:376,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,0 +DA:385,0 +DA:386,0 +DA:389,0 +DA:390,0 +DA:391,0 +DA:392,0 +DA:393,0 +DA:394,0 +DA:395,0 +DA:396,0 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:404,0 +DA:405,0 +DA:406,0 +DA:409,0 +DA:410,0 +DA:411,0 +DA:412,0 +DA:413,0 +DA:414,0 +DA:415,0 +DA:416,0 +DA:419,0 +DA:420,0 +DA:421,0 +DA:422,0 +DA:423,0 +DA:424,0 +DA:425,0 +DA:426,0 +DA:429,0 +DA:430,0 +DA:431,0 +DA:432,0 +DA:433,0 +DA:434,0 +DA:435,0 +DA:438,0 +DA:439,0 +DA:440,0 +DA:441,0 +DA:442,0 +DA:443,0 +DA:444,0 +DA:447,0 +DA:448,0 +DA:449,0 +DA:450,0 +DA:453,0 +DA:454,0 +DA:455,0 +DA:457,0 +DA:458,0 +DA:459,0 +DA:460,0 +DA:463,0 +DA:464,0 +DA:467,0 +DA:471,6 +DA:472,6 +DA:473,6 +DA:476,2 +DA:477,2 +DA:478,2 +DA:479,2 +DA:481,2 +DA:482,2 +DA:483,2 +DA:484,2 +DA:486,2 +DA:487,2 +DA:488,2 +DA:489,2 +DA:490,2 +DA:491,2 +DA:492,2 +DA:493,2 +DA:494,2 +DA:495,2 +DA:496,2 +DA:497,2 +DA:499,2 +DA:500,0 +DA:501,0 +DA:502,0 +DA:503,2 +DA:504,2 +DA:505,2 +DA:506,2 +DA:507,2 +DA:714,65503 +DA:719,65503 +DA:720,65503 +DA:722,65503 +DA:725,589527 +DA:726,524024 +DA:727,524024 +DA:728,524024 +DA:729,524024 +DA:730,524024 +DA:731,524024 +DA:732,65503 +BRDA:76,0,0,65503 +BRDA:76,0,1,91199 +BRDA:81,0,0,25690 +BRDA:81,0,1,65509 +BRDA:90,0,0,3701 +BRDA:90,0,1,61808 +BRDA:99,0,0,65503 +BRDA:99,0,1,6 +BRDA:112,0,0,65503 +BRDA:112,0,1,6 +BRDA:123,0,0,458521 +BRDA:123,0,1,65503 +BRDA:160,0,0,91199 +BRDA:160,0,1,65503 +BRDA:167,0,0,729592 +BRDA:167,0,1,91199 +BRDA:190,0,0,364796 +BRDA:190,0,1,91199 +BRDA:192,0,0,5836736 +BRDA:192,0,1,364796 +BRDA:194,0,0,1459184 +BRDA:194,0,1,4377552 +BRDA:232,0,0,729592 +BRDA:232,0,1,91199 +BRDA:294,0,0,- +BRDA:294,0,1,- +BRDA:486,0,0,2 +BRDA:486,0,1,0 +BRDA:491,0,0,2 +BRDA:491,0,1,0 +BRDA:499,0,0,2 +BRDA:499,0,1,0 +BRDA:499,1,2,0 +BRDA:499,1,3,2 +BRDA:503,0,0,2 +BRDA:503,0,1,0 +BRDA:503,1,2,2 +BRDA:503,1,3,0 +BRDA:725,0,0,524024 +BRDA:725,0,1,65503 +BRF:40 +BRH:32 +LF:307 +LH:150 +end_of_record +SF:/home/builder/project/test/state/account.hpp +FN:82,_ZNK6evmone5state7Account8is_emptyEv +FNDA:2431069,_ZNK6evmone5state7Account8is_emptyEv +FNF:1 +FNH:1 +DA:82,2431069 +DA:83,2431069 +DA:84,2431069 +BRDA:83,0,0,2099578 +BRDA:83,0,1,331491 +BRDA:83,1,2,1042273 +BRDA:83,1,3,1057305 +BRDA:83,2,4,303295 +BRDA:83,2,5,738978 +BRF:6 +BRH:6 +LF:3 +LH:3 +end_of_record +SF:/home/builder/project/test/state/blob_schedule.hpp +FN:27,_ZN6evmone5state17get_blob_scheduleE13evmc_revision +FNDA:379919,_ZN6evmone5state17get_blob_scheduleE13evmc_revision +FNF:1 +FNH:1 +DA:27,379919 +DA:28,379919 +DA:29,259890 +DA:30,120029 +DA:31,379919 +BRDA:28,0,0,259890 +BRDA:28,0,1,120029 +BRF:2 +BRH:2 +LF:5 +LH:5 +end_of_record +SF:/home/builder/project/test/state/block.cpp +FN:17,_ZN6evmone5state13calc_base_feeEllm +FN:44,_ZN6evmone5state22max_blob_gas_per_blockE13evmc_revision +FN:50,_ZN6evmone5state22compute_blob_gas_priceE13evmc_revisionm +FN:81,_ZN6evmone5state20calc_excess_blob_gasE13evmc_revisionmmmRKN4intx4uintILj256EEE +FN:98,_ZN6evmone5state10rlp_encodeB5cxx11ERKNS0_10WithdrawalE +FN:54,block.cpp:_ZZN6evmone5state22compute_blob_gas_priceE13evmc_revisionmENK3$_0clEmmm +FNDA:73328,_ZN6evmone5state13calc_base_feeEllm +FNDA:123630,_ZN6evmone5state22max_blob_gas_per_blockE13evmc_revision +FNDA:190462,_ZN6evmone5state22compute_blob_gas_priceE13evmc_revisionm +FNDA:65827,_ZN6evmone5state20calc_excess_blob_gasE13evmc_revisionmmmRKN4intx4uintILj256EEE +FNDA:4026,_ZN6evmone5state10rlp_encodeB5cxx11ERKNS0_10WithdrawalE +FNDA:190462,block.cpp:_ZZN6evmone5state22compute_blob_gas_priceE13evmc_revisionmENK3$_0clEmmm +FNF:6 +FNH:6 +DA:17,73328 +DA:18,73328 +DA:21,73328 +DA:22,672 +DA:23,672 +DA:24,672 +DA:25,72656 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:34,72656 +DA:35,72656 +DA:36,72656 +DA:37,72656 +DA:38,72656 +DA:39,72656 +DA:40,72656 +DA:41,73328 +DA:44,123630 +DA:45,123630 +DA:46,123630 +DA:50,190462 +DA:53,190462 +DA:54,190462 +DA:55,190462 +DA:56,190462 +DA:57,190462 +DA:58,190462 +DA:59,486629 +DA:60,296647 +DA:61,296647 +DA:63,296647 +DA:64,296647 +DA:65,296167 +DA:66,480 +DA:67,480 +DA:68,296167 +DA:69,296167 +DA:70,189982 +DA:71,190462 +DA:73,190462 +DA:74,190462 +DA:75,190462 +DA:76,190462 +DA:81,65827 +DA:83,65827 +DA:85,65827 +DA:86,65827 +DA:87,65827 +DA:88,58201 +DA:90,7626 +DA:91,171 +DA:92,171 +DA:94,7455 +DA:95,7626 +DA:98,4026 +DA:99,4026 +DA:100,4026 +DA:101,4026 +BRDA:21,0,0,672 +BRDA:21,0,1,72656 +BRDA:25,0,0,0 +BRDA:25,0,1,72656 +BRDA:59,0,0,296647 +BRDA:59,0,1,189982 +BRDA:64,0,0,296167 +BRDA:64,0,1,480 +BRDA:87,0,0,58201 +BRDA:87,0,1,7626 +BRDA:90,0,0,171 +BRDA:90,0,1,7455 +BRDA:90,1,2,2786 +BRDA:90,1,3,4840 +BRDA:90,2,4,171 +BRDA:90,2,5,2615 +BRF:16 +BRH:15 +LF:81 +LH:73 +end_of_record +SF:/home/builder/project/test/state/block.hpp +FN:28,_ZNK6evmone5state10Withdrawal10get_amountEv +FNDA:4030,_ZNK6evmone5state10Withdrawal10get_amountEv +FNF:1 +FNH:1 +DA:28,4030 +DA:29,4030 +DA:30,4030 +BRF:0 +BRH:0 +LF:3 +LH:3 +end_of_record +SF:/home/builder/project/test/state/bloom_filter.cpp +FN:34,_ZN6evmone5state20compute_bloom_filterESt4spanIKNS0_3LogELm18446744073709551615EE +FN:47,_ZN6evmone5state20compute_bloom_filterESt4spanIKNS0_18TransactionReceiptELm18446744073709551615EE +FN:58,_ZN6evmone5state23bloom_filter_from_bytesERKSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:17,bloom_filter.cpp:_ZN6evmone5state12_GLOBAL__N_16add_toERNS0_11BloomFilterERKSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:136939,_ZN6evmone5state20compute_bloom_filterESt4spanIKNS0_3LogELm18446744073709551615EE +FNDA:79949,_ZN6evmone5state20compute_bloom_filterESt4spanIKNS0_18TransactionReceiptELm18446744073709551615EE +FNDA:145312,_ZN6evmone5state23bloom_filter_from_bytesERKSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:65049,bloom_filter.cpp:_ZN6evmone5state12_GLOBAL__N_16add_toERNS0_11BloomFilterERKSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNF:4 +FNH:4 +DA:17,65049 +DA:18,65049 +DA:21,65049 +DA:22,195147 +DA:23,195147 +DA:24,195147 +DA:25,195147 +DA:26,195147 +DA:27,195147 +DA:28,195147 +DA:29,65049 +DA:34,136939 +DA:35,136939 +DA:36,136939 +DA:37,27327 +DA:38,27327 +DA:39,27327 +DA:40,37722 +DA:41,27327 +DA:43,136939 +DA:44,136939 +DA:47,79949 +DA:48,79949 +DA:50,79949 +DA:51,81177 +DA:52,81177 +DA:54,79949 +DA:55,79949 +DA:58,145312 +DA:60,145312 +DA:61,145312 +DA:62,145312 +DA:63,145312 +BRDA:21,0,0,195147 +BRDA:21,0,1,65049 +BRDA:36,0,0,27327 +BRDA:36,0,1,136939 +BRDA:39,0,0,37722 +BRDA:39,0,1,27327 +BRDA:50,0,0,81177 +BRDA:50,0,1,79949 +BRF:8 +BRH:8 +LF:33 +LH:33 +end_of_record +SF:/home/builder/project/test/state/bloom_filter.hpp +FN:21,_ZNK6evmone5state11BloomFiltercvSt17basic_string_viewIhN4evmc11byte_traitsIhEEEEv +FNDA:360632,_ZNK6evmone5state11BloomFiltercvSt17basic_string_viewIhN4evmc11byte_traitsIhEEEEv +FNF:1 +FNH:1 +DA:21,360632 +BRF:0 +BRH:0 +LF:1 +LH:1 +end_of_record +SF:/home/builder/project/test/state/errors.hpp +FN:45,_ZZN6evmone5state15evmone_categoryEvENK8Category4nameEv +FN:48,_ZZN6evmone5state15evmone_categoryEvENK8Category7messageB5cxx11Ei +FN:42,_ZN6evmone5state15evmone_categoryEv +FN:115,_ZN6evmone5state15make_error_codeENS0_9ErrorCodeE +FNDA:0,_ZZN6evmone5state15evmone_categoryEvENK8Category4nameEv +FNDA:3562,_ZZN6evmone5state15evmone_categoryEvENK8Category7messageB5cxx11Ei +FNDA:6605,_ZN6evmone5state15evmone_categoryEv +FNDA:6605,_ZN6evmone5state15make_error_codeENS0_9ErrorCodeE +FNF:4 +FNH:3 +DA:42,6605 +DA:43,6605 +DA:44,6605 +DA:45,6605 +DA:47,6605 +DA:48,6605 +DA:49,3562 +DA:50,3562 +DA:51,0 +DA:52,0 +DA:53,2183 +DA:54,2183 +DA:55,4 +DA:56,4 +DA:57,1104 +DA:58,1104 +DA:59,6 +DA:60,6 +DA:61,12 +DA:62,12 +DA:63,2 +DA:64,2 +DA:65,5 +DA:66,5 +DA:67,14 +DA:68,14 +DA:69,6 +DA:70,6 +DA:71,4 +DA:72,4 +DA:73,37 +DA:74,37 +DA:75,11 +DA:76,11 +DA:77,3 +DA:78,3 +DA:79,6 +DA:80,6 +DA:81,27 +DA:82,27 +DA:83,123 +DA:84,123 +DA:85,2 +DA:86,2 +DA:87,2 +DA:88,2 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,11 +DA:96,11 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,3562 +DA:103,3562 +DA:104,6605 +DA:106,6605 +DA:107,6605 +DA:108,6605 +DA:115,6605 +DA:116,6605 +DA:117,6605 +BRDA:51,0,0,0 +BRDA:51,0,1,3562 +BRDA:53,0,0,2183 +BRDA:53,0,1,1379 +BRDA:55,0,0,4 +BRDA:55,0,1,3558 +BRDA:57,0,0,1104 +BRDA:57,0,1,2458 +BRDA:59,0,0,6 +BRDA:59,0,1,3556 +BRDA:61,0,0,12 +BRDA:61,0,1,3550 +BRDA:63,0,0,2 +BRDA:63,0,1,3560 +BRDA:65,0,0,5 +BRDA:65,0,1,3557 +BRDA:67,0,0,14 +BRDA:67,0,1,3548 +BRDA:69,0,0,6 +BRDA:69,0,1,3556 +BRDA:71,0,0,4 +BRDA:71,0,1,3558 +BRDA:73,0,0,37 +BRDA:73,0,1,3525 +BRDA:75,0,0,11 +BRDA:75,0,1,3551 +BRDA:77,0,0,3 +BRDA:77,0,1,3559 +BRDA:79,0,0,6 +BRDA:79,0,1,3556 +BRDA:81,0,0,27 +BRDA:81,0,1,3535 +BRDA:83,0,0,123 +BRDA:83,0,1,3439 +BRDA:85,0,0,2 +BRDA:85,0,1,3560 +BRDA:87,0,0,2 +BRDA:87,0,1,3560 +BRDA:89,0,0,0 +BRDA:89,0,1,3562 +BRDA:91,0,0,0 +BRDA:91,0,1,3562 +BRDA:93,0,0,0 +BRDA:93,0,1,3562 +BRDA:95,0,0,11 +BRDA:95,0,1,3551 +BRDA:97,0,0,0 +BRDA:97,0,1,3562 +BRDA:99,0,0,0 +BRDA:99,0,1,3562 +BRF:50 +BRH:44 +LF:124 +LH:111 +end_of_record +SF:/home/builder/project/test/state/ethash_difficulty.cpp +FN:76,_ZN6evmone5state20calculate_difficultyElblll13evmc_revision +FN:34,ethash_difficulty.cpp:_ZN6evmone5state12_GLOBAL__N_134calculate_difficulty_pre_byzantiumEllll13evmc_revision +FN:57,ethash_difficulty.cpp:_ZN6evmone5state12_GLOBAL__N_136calculate_difficulty_since_byzantiumElblll13evmc_revision +FN:14,ethash_difficulty.cpp:_ZN6evmone5state12_GLOBAL__N_114get_bomb_delayE13evmc_revision +FNDA:0,_ZN6evmone5state20calculate_difficultyElblll13evmc_revision +FNDA:0,ethash_difficulty.cpp:_ZN6evmone5state12_GLOBAL__N_134calculate_difficulty_pre_byzantiumEllll13evmc_revision +FNDA:0,ethash_difficulty.cpp:_ZN6evmone5state12_GLOBAL__N_136calculate_difficulty_since_byzantiumElblll13evmc_revision +FNDA:0,ethash_difficulty.cpp:_ZN6evmone5state12_GLOBAL__N_114get_bomb_delayE13evmc_revision +FNF:4 +FNH:0 +DA:14,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:21,0 +DA:22,0 +DA:23,0 +DA:24,0 +DA:25,0 +DA:26,0 +DA:27,0 +DA:28,0 +DA:29,0 +DA:30,0 +DA:34,0 +DA:36,0 +DA:37,0 +DA:39,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:51,0 +DA:52,0 +DA:57,0 +DA:58,0 +DA:59,0 +DA:60,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:76,0 +DA:78,0 +DA:80,0 +DA:81,0 +DA:83,0 +DA:84,0 +DA:85,0 +DA:86,0 +DA:87,0 +DA:88,0 +DA:90,0 +DA:91,0 +BRDA:17,0,0,- +BRDA:17,0,1,- +BRDA:19,0,0,- +BRDA:19,0,1,- +BRDA:21,0,0,- +BRDA:21,0,1,- +BRDA:22,0,0,- +BRDA:22,0,1,- +BRDA:23,0,0,- +BRDA:23,0,1,- +BRDA:25,0,0,- +BRDA:25,0,1,- +BRDA:27,0,0,- +BRDA:27,0,1,- +BRDA:41,0,0,- +BRDA:41,0,1,- +BRDA:42,0,0,- +BRDA:42,0,1,- +BRDA:46,0,0,- +BRDA:46,0,1,- +BRDA:48,0,0,- +BRDA:48,0,1,- +BRDA:62,0,0,- +BRDA:62,0,1,- +BRDA:63,0,0,- +BRDA:63,0,1,- +BRDA:80,0,0,- +BRDA:80,0,1,- +BRDA:84,0,0,- +BRDA:84,0,1,- +BRF:30 +BRH:0 +LF:55 +LH:0 +end_of_record +SF:/home/builder/project/test/state/hash_utils.hpp +FN:31,_ZN6evmone9keccak256ESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:42079923,_ZN6evmone9keccak256ESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNF:1 +FNH:1 +DA:31,42079923 +DA:32,42079923 +DA:33,42079923 +BRF:0 +BRH:0 +LF:3 +LH:3 +end_of_record +SF:/home/builder/project/test/state/host.cpp +FN:13,_ZNK6evmone5state4Host14account_existsERKN4evmc7addressE +FN:19,_ZNK6evmone5state4Host11get_storageERKN4evmc7addressERKNS2_7bytes32E +FN:25,_ZN6evmone5state4Host11set_storageERKN4evmc7addressERKNS2_7bytes32ES8_ +FN:72,_ZNK6evmone5state4Host11get_balanceERKN4evmc7addressE +FN:110,_ZNK6evmone5state4Host13get_code_sizeERKN4evmc7addressE +FN:116,_ZNK6evmone5state4Host13get_code_hashERKN4evmc7addressE +FN:131,_ZNK6evmone5state4Host9copy_codeERKN4evmc7addressEmPhm +FN:141,_ZN6evmone5state4Host12selfdestructERKN4evmc7addressES5_ +FN:180,_ZN6evmone5state22compute_create_addressERKN4evmc7addressEm +FN:216,_ZN6evmone5state23compute_create2_addressERKN4evmc7addressERKNS1_7bytes32ESt17basic_string_viewIhNS1_11byte_traitsIhEEE +FN:232,_ZN6evmone5state25compute_eofcreate_addressERKN4evmc7addressERKNS1_7bytes32E +FN:247,_ZN6evmone5state4Host15prepare_messageE12evmc_message +FN:294,_ZN6evmone5state4Host6createERK12evmc_message +FN:400,_ZN6evmone5state4Host15execute_messageERK12evmc_message +FN:446,_ZN6evmone5state4Host4callERK12evmc_message +FN:474,_ZNK6evmone5state4Host14get_tx_contextEv +FN:501,_ZNK6evmone5state4Host14get_block_hashEl +FN:507,_ZN6evmone5state4Host8emit_logERKN4evmc7addressEPKhmPKNS2_7bytes32Em +FN:512,_ZN6evmone5state4Host14access_accountERKN4evmc7addressE +FN:527,_ZN6evmone5state4Host14access_storageERKN4evmc7addressERKNS2_7bytes32E +FN:535,_ZNK6evmone5state4Host21get_transient_storageERKN4evmc7addressERKNS2_7bytes32E +FN:543,_ZN6evmone5state4Host21set_transient_storageERKN4evmc7addressERKNS2_7bytes32ES8_ +FN:83,host.cpp:_ZN6evmone5state12_GLOBAL__N_17extcodeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:90,host.cpp:_ZN6evmone5state12_GLOBAL__N_119is_create_collisionERKNS0_7AccountE +FNDA:104010,_ZNK6evmone5state4Host14account_existsERKN4evmc7addressE +FNDA:1014922,_ZNK6evmone5state4Host11get_storageERKN4evmc7addressERKNS2_7bytes32E +FNDA:4435632,_ZN6evmone5state4Host11set_storageERKN4evmc7addressERKNS2_7bytes32ES8_ +FNDA:122175,_ZNK6evmone5state4Host11get_balanceERKN4evmc7addressE +FNDA:470404,_ZNK6evmone5state4Host13get_code_sizeERKN4evmc7addressE +FNDA:3331,_ZNK6evmone5state4Host13get_code_hashERKN4evmc7addressE +FNDA:2447473,_ZNK6evmone5state4Host9copy_codeERKN4evmc7addressEmPhm +FNDA:7273,_ZN6evmone5state4Host12selfdestructERKN4evmc7addressES5_ +FNDA:60188,_ZN6evmone5state22compute_create_addressERKN4evmc7addressEm +FNDA:24774,_ZN6evmone5state23compute_create2_addressERKN4evmc7addressERKNS1_7bytes32ESt17basic_string_viewIhNS1_11byte_traitsIhEEE +FNDA:0,_ZN6evmone5state25compute_eofcreate_addressERKN4evmc7addressERKNS1_7bytes32E +FNDA:4304875,_ZN6evmone5state4Host15prepare_messageE12evmc_message +FNDA:84962,_ZN6evmone5state4Host6createERK12evmc_message +FNDA:4304779,_ZN6evmone5state4Host15execute_messageERK12evmc_message +FNDA:4304875,_ZN6evmone5state4Host4callERK12evmc_message +FNDA:168811,_ZNK6evmone5state4Host14get_tx_contextEv +FNDA:69647,_ZNK6evmone5state4Host14get_block_hashEl +FNDA:28883,_ZN6evmone5state4Host8emit_logERKN4evmc7addressEPKhmPKNS2_7bytes32Em +FNDA:4999027,_ZN6evmone5state4Host14access_accountERKN4evmc7addressE +FNDA:5415262,_ZN6evmone5state4Host14access_storageERKN4evmc7addressERKNS2_7bytes32E +FNDA:1890161,_ZNK6evmone5state4Host21get_transient_storageERKN4evmc7addressERKNS2_7bytes32E +FNDA:9079194,_ZN6evmone5state4Host21set_transient_storageERKN4evmc7addressERKNS2_7bytes32ES8_ +FNDA:2917877,host.cpp:_ZN6evmone5state12_GLOBAL__N_17extcodeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:80126,host.cpp:_ZN6evmone5state12_GLOBAL__N_119is_create_collisionERKNS0_7AccountE +FNF:24 +FNH:23 +DA:13,104010 +DA:14,104010 +DA:15,104010 +DA:16,104010 +DA:19,1014922 +DA:20,1014922 +DA:21,1014922 +DA:25,4435632 +DA:29,4435632 +DA:30,4435632 +DA:32,4435632 +DA:33,4435632 +DA:34,4435632 +DA:35,4435632 +DA:37,4435632 +DA:38,4435632 +DA:39,1281729 +DA:40,1281729 +DA:41,1192169 +DA:42,89560 +DA:43,42930 +DA:44,46630 +DA:45,46630 +DA:46,1281729 +DA:47,3153903 +DA:48,792076 +DA:49,792076 +DA:50,48 +DA:51,792028 +DA:52,234 +DA:53,792076 +DA:54,2361827 +DA:55,754243 +DA:56,754243 +DA:57,72 +DA:58,754171 +DA:59,754147 +DA:60,24 +DA:61,24 +DA:62,754243 +DA:65,4435632 +DA:66,34886 +DA:67,4435632 +DA:68,4435632 +DA:69,4435632 +DA:72,122175 +DA:73,122175 +DA:74,122175 +DA:75,122175 +DA:83,2917877 +DA:84,2917877 +DA:85,2917877 +DA:90,80126 +DA:95,80126 +DA:96,218 +DA:97,79908 +DA:98,162 +DA:99,79746 +DA:100,28 +DA:104,79746 +DA:105,79718 +DA:106,79746 +DA:110,470404 +DA:111,470404 +DA:112,470404 +DA:113,470404 +DA:116,3331 +DA:117,3331 +DA:118,3331 +DA:119,650 +DA:123,2681 +DA:124,0 +DA:126,2681 +DA:127,2681 +DA:131,2447473 +DA:132,2447473 +DA:133,2447473 +DA:134,2447473 +DA:135,2447473 +DA:136,2447473 +DA:137,2447473 +DA:138,2447473 +DA:141,7273 +DA:142,7273 +DA:143,19 +DA:144,7273 +DA:145,7273 +DA:146,7273 +DA:148,7273 +DA:149,7273 +DA:151,7273 +DA:152,2268 +DA:156,2268 +DA:157,2268 +DA:161,2268 +DA:162,2268 +DA:166,5005 +DA:167,5005 +DA:170,5005 +DA:171,4142 +DA:172,4142 +DA:173,4142 +DA:174,4142 +DA:175,4142 +DA:176,863 +DA:177,5005 +DA:180,60188 +DA:181,60188 +DA:182,60188 +DA:183,60188 +DA:184,60188 +DA:186,60188 +DA:187,60188 +DA:188,60188 +DA:189,60188 +DA:191,60188 +DA:192,54506 +DA:193,54506 +DA:194,54506 +DA:195,5682 +DA:196,5682 +DA:199,5682 +DA:200,5682 +DA:201,5682 +DA:202,5682 +DA:203,5682 +DA:205,60188 +DA:206,60188 +DA:208,60188 +DA:209,60188 +DA:210,60188 +DA:211,60188 +DA:212,60188 +DA:216,24774 +DA:217,24774 +DA:218,24774 +DA:219,24774 +DA:220,24774 +DA:221,24774 +DA:222,24774 +DA:223,24774 +DA:224,24774 +DA:225,24774 +DA:226,24774 +DA:227,24774 +DA:228,24774 +DA:229,24774 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:247,4304875 +DA:248,4304875 +DA:249,4304875 +DA:250,183410 +DA:251,183410 +DA:254,183410 +DA:255,96 +DA:257,183314 +DA:258,46375 +DA:259,46375 +DA:260,46375 +DA:261,46375 +DA:263,183314 +DA:264,84962 +DA:266,84962 +DA:267,84962 +DA:269,84962 +DA:270,84962 +DA:271,84962 +DA:272,60188 +DA:273,24774 +DA:274,24774 +DA:275,24774 +DA:276,24774 +DA:277,24774 +DA:278,0 +DA:279,0 +DA:281,0 +DA:282,0 +DA:283,0 +DA:286,84962 +DA:287,84962 +DA:288,183314 +DA:290,4304779 +DA:291,4304875 +DA:294,84962 +DA:295,84962 +DA:297,84962 +DA:298,84962 +DA:299,84962 +DA:300,4836 +DA:301,80126 +DA:302,408 +DA:303,84554 +DA:305,84554 +DA:306,84554 +DA:308,84554 +DA:309,83282 +DA:311,84554 +DA:313,84554 +DA:314,84554 +DA:315,84554 +DA:316,84554 +DA:317,84554 +DA:318,84554 +DA:319,84554 +DA:321,84554 +DA:322,84554 +DA:323,84554 +DA:325,84554 +DA:326,0 +DA:333,0 +DA:334,0 +DA:335,0 +DA:336,84554 +DA:337,84554 +DA:338,84554 +DA:339,84554 +DA:340,84554 +DA:342,84554 +DA:343,84554 +DA:344,3840 +DA:345,3840 +DA:346,3840 +DA:347,3840 +DA:349,80714 +DA:350,80714 +DA:352,80714 +DA:356,80714 +DA:358,80714 +DA:359,94 +DA:362,80620 +DA:363,80620 +DA:364,80620 +DA:365,300 +DA:366,300 +DA:367,0 +DA:368,300 +DA:369,300 +DA:371,80320 +DA:372,26047 +DA:373,26047 +DA:374,102 +DA:375,102 +DA:376,0 +DA:379,0 +DA:380,0 +DA:381,0 +DA:382,0 +DA:383,0 +DA:384,102 +DA:385,84 +DA:387,84 +DA:388,84 +DA:389,102 +DA:391,25963 +DA:392,25963 +DA:393,25963 +DA:394,25963 +DA:396,80236 +DA:397,80320 +DA:400,4304779 +DA:401,4304779 +DA:402,84962 +DA:404,4219817 +DA:405,4036655 +DA:406,4036655 +DA:407,4036655 +DA:408,5059 +DA:409,4036655 +DA:411,4219817 +DA:412,4036655 +DA:413,4036655 +DA:414,3910540 +DA:415,126115 +DA:416,126115 +DA:420,126115 +DA:424,126115 +DA:425,126115 +DA:426,126115 +DA:427,126115 +DA:428,126115 +DA:429,126115 +DA:430,126115 +DA:431,4036655 +DA:434,4219817 +DA:435,1638857 +DA:438,2580960 +DA:439,2580960 +DA:440,114785 +DA:442,2466175 +DA:443,2580960 +DA:446,4304875 +DA:447,4304875 +DA:448,4304875 +DA:449,96 +DA:451,4304779 +DA:452,4304779 +DA:454,4304779 +DA:456,4304779 +DA:457,2406362 +DA:458,2406362 +DA:459,2406362 +DA:460,2406362 +DA:463,2406362 +DA:464,2406362 +DA:467,2406362 +DA:468,395170 +DA:469,2406362 +DA:470,4304779 +DA:471,4304875 +DA:474,168811 +DA:477,168811 +DA:478,168811 +DA:479,168811 +DA:480,168811 +DA:482,168811 +DA:483,168811 +DA:484,168811 +DA:485,168811 +DA:486,168811 +DA:487,168811 +DA:488,168811 +DA:489,168811 +DA:490,168811 +DA:491,168811 +DA:492,168811 +DA:493,168811 +DA:494,168811 +DA:495,168811 +DA:496,168811 +DA:497,168811 +DA:498,168811 +DA:501,69647 +DA:502,69647 +DA:503,69647 +DA:507,28883 +DA:508,28883 +DA:509,28883 +DA:512,4999027 +DA:513,4999027 +DA:514,11614 +DA:516,4987413 +DA:518,4987413 +DA:519,4404030 +DA:521,583383 +DA:522,583383 +DA:523,583383 +DA:524,4987413 +DA:527,5415262 +DA:528,5415262 +DA:529,5415262 +DA:530,5415262 +DA:531,5415262 +DA:535,1890161 +DA:536,1890161 +DA:537,1890161 +DA:538,1890161 +DA:539,1890161 +DA:543,9079194 +DA:544,9079194 +DA:545,9079194 +DA:546,9079194 +DA:547,9079194 +BRDA:15,0,0,103940 +BRDA:15,0,1,70 +BRDA:15,1,2,10566 +BRDA:15,1,3,93374 +BRDA:15,2,4,91702 +BRDA:15,2,5,1672 +BRDA:38,0,0,2889313 +BRDA:38,0,1,1546319 +BRDA:38,1,2,1281729 +BRDA:38,1,3,1607584 +BRDA:40,0,0,1192169 +BRDA:40,0,1,89560 +BRDA:42,0,0,42930 +BRDA:42,0,1,46630 +BRDA:47,0,0,1546319 +BRDA:47,0,1,1607584 +BRDA:47,1,2,792076 +BRDA:47,1,3,754243 +BRDA:49,0,0,2532 +BRDA:49,0,1,789544 +BRDA:49,1,2,48 +BRDA:49,1,3,2484 +BRDA:51,0,0,789544 +BRDA:51,0,1,2484 +BRDA:51,1,2,234 +BRDA:51,1,3,789310 +BRDA:54,0,0,754243 +BRDA:54,0,1,1607584 +BRDA:54,1,2,754243 +BRDA:54,1,3,0 +BRDA:56,0,0,72 +BRDA:56,0,1,754171 +BRDA:58,0,0,754147 +BRDA:58,0,1,24 +BRDA:65,0,0,34886 +BRDA:65,0,1,4400746 +BRDA:74,0,0,122163 +BRDA:74,0,1,12 +BRDA:84,0,0,0 +BRDA:84,0,1,2917877 +BRDA:95,0,0,218 +BRDA:95,0,1,79908 +BRDA:97,0,0,162 +BRDA:97,0,1,79746 +BRDA:99,0,0,28 +BRDA:99,0,1,79718 +BRDA:118,0,0,4 +BRDA:118,0,1,3327 +BRDA:118,1,2,646 +BRDA:118,1,3,2681 +BRDA:123,0,0,0 +BRDA:123,0,1,2681 +BRDA:142,0,0,19 +BRDA:142,0,1,7254 +BRDA:151,0,0,6382 +BRDA:151,0,1,891 +BRDA:151,1,2,2268 +BRDA:151,1,3,4114 +BRDA:170,0,0,4142 +BRDA:170,0,1,863 +BRDA:191,0,0,54506 +BRDA:191,0,1,5682 +BRDA:193,0,0,13777 +BRDA:193,0,1,40729 +BRDA:248,0,0,136939 +BRDA:248,0,1,4167936 +BRDA:248,1,2,21655 +BRDA:248,1,3,4146281 +BRDA:248,2,4,24816 +BRDA:248,2,5,4121465 +BRDA:249,0,0,0 +BRDA:249,0,1,4121465 +BRDA:254,0,0,96 +BRDA:254,0,1,183314 +BRDA:257,0,0,46375 +BRDA:257,0,1,136939 +BRDA:263,0,0,60188 +BRDA:263,0,1,123126 +BRDA:263,1,2,24774 +BRDA:263,1,3,98352 +BRDA:263,2,4,0 +BRDA:263,2,5,98352 +BRDA:271,0,0,60188 +BRDA:271,0,1,24774 +BRDA:273,0,0,24774 +BRDA:273,0,1,0 +BRDA:299,0,0,4836 +BRDA:299,0,1,80126 +BRDA:301,0,0,408 +BRDA:301,0,1,79718 +BRDA:308,0,0,83282 +BRDA:308,0,1,1272 +BRDA:322,0,0,0 +BRDA:322,0,1,84554 +BRDA:325,0,0,0 +BRDA:325,0,1,84554 +BRDA:325,1,2,- +BRDA:325,1,3,- +BRDA:325,2,4,- +BRDA:325,2,5,- +BRDA:333,0,0,- +BRDA:333,0,1,- +BRDA:336,0,0,84554 +BRDA:336,0,1,0 +BRDA:343,0,0,3840 +BRDA:343,0,1,80714 +BRDA:358,0,0,79470 +BRDA:358,0,1,1244 +BRDA:358,1,2,94 +BRDA:358,1,3,79376 +BRDA:364,0,0,300 +BRDA:364,0,1,80320 +BRDA:366,0,0,0 +BRDA:366,0,1,300 +BRDA:371,0,0,26047 +BRDA:371,0,1,54273 +BRDA:373,0,0,102 +BRDA:373,0,1,25945 +BRDA:375,0,0,0 +BRDA:375,0,1,102 +BRDA:379,0,0,- +BRDA:379,0,1,- +BRDA:384,0,0,84 +BRDA:384,0,1,18 +BRDA:401,0,0,60188 +BRDA:401,0,1,4244591 +BRDA:401,1,2,24774 +BRDA:401,1,3,4219817 +BRDA:401,2,4,0 +BRDA:401,2,5,4219817 +BRDA:404,0,0,4036655 +BRDA:404,0,1,183162 +BRDA:407,0,0,5059 +BRDA:407,0,1,4031596 +BRDA:411,0,0,4036655 +BRDA:411,0,1,183162 +BRDA:413,0,0,3910540 +BRDA:413,0,1,126115 +BRDA:434,0,0,4214441 +BRDA:434,0,1,5376 +BRDA:434,1,2,1638857 +BRDA:434,1,3,2580960 +BRDA:434,2,4,1638857 +BRDA:434,2,5,2575584 +BRDA:439,0,0,114785 +BRDA:439,0,1,2466175 +BRDA:448,0,0,96 +BRDA:448,0,1,4304779 +BRDA:456,0,0,2406362 +BRDA:456,0,1,1898417 +BRDA:460,0,0,400714 +BRDA:460,0,1,2005648 +BRDA:460,1,2,395170 +BRDA:460,1,3,5544 +BRDA:467,0,0,395170 +BRDA:467,0,1,2011192 +BRDA:467,1,2,395170 +BRDA:467,1,3,0 +BRDA:513,0,0,11614 +BRDA:513,0,1,4987413 +BRDA:518,0,0,2291716 +BRDA:518,0,1,2695697 +BRDA:518,1,2,2112314 +BRDA:518,1,3,583383 +BRDA:538,0,0,1888547 +BRDA:538,0,1,1614 +BRF:166 +BRH:145 +LF:374 +LH:344 +end_of_record +SF:/home/builder/project/test/state/host.hpp +FN:61,_ZN6evmone5state4HostC2E13evmc_revisionRN4evmc2VMERNS0_5StateERKNS0_9BlockInfoERKNS0_11BlockHashesERKNS0_11TransactionE +FN:73,_ZN6evmone5state4Host9take_logsEv +FNDA:337919,_ZN6evmone5state4HostC2E13evmc_revisionRN4evmc2VMERNS0_5StateERKNS0_9BlockInfoERKNS0_11BlockHashesERKNS0_11TransactionE +FNDA:136939,_ZN6evmone5state4Host9take_logsEv +FNF:2 +FNH:2 +DA:61,337919 +DA:62,337919 +DA:63,337919 +DA:64,0 +DA:65,0 +DA:66,0 +DA:67,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,337919 +DA:73,136939 +BRDA:63,0,0,0 +BRDA:63,0,1,337919 +BRDA:65,0,0,- +BRDA:65,0,1,- +BRF:4 +BRH:1 +LF:12 +LH:5 +end_of_record +SF:/home/builder/project/test/state/mpt.cpp +FN:162,_ZNK6evmone5state7MPTNode6encodeB5cxx11Ev +FN:192,_ZN6evmone5state3MPTC2Ev +FN:193,_ZN6evmone5state3MPTD2Ev +FN:196,_ZN6evmone5state3MPT6insertESt17basic_string_viewIhN4evmc11byte_traitsIhEEEONSt7__cxx1112basic_stringIhS5_SaIhEEE +FN:207,_ZNK6evmone5state3MPT4hashEv +FN:163,mpt.cpp:_ZZNK6evmone5state7MPTNode6encodeB5cxx11EvENK3$_0clEONSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEE +FN:56,mpt.cpp:_ZNK6evmone5state12_GLOBAL__N_14Path5emptyEv +FN:61,mpt.cpp:_ZNK6evmone5state12_GLOBAL__N_14Path6encodeB5cxx11ENS1_4KindE +FN:44,mpt.cpp:_ZN6evmone5state12_GLOBAL__N_14PathC2ESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:107,mpt.cpp:_ZN6evmone5state7MPTNode6insertERKNS0_12_GLOBAL__N_14PathEONSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEE +FN:58,mpt.cpp:_ZNK6evmone5state12_GLOBAL__N_14Path3endEv +FN:37,mpt.cpp:_ZN6evmone5state12_GLOBAL__N_14PathC2EPKhS4_ +FN:57,mpt.cpp:_ZNK6evmone5state12_GLOBAL__N_14Path5beginEv +FN:99,mpt.cpp:_ZN6evmone5state7MPTNodeC2ERKNS0_12_GLOBAL__N_14PathEONSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEE +FN:87,mpt.cpp:_ZN6evmone5state7MPTNodeC2ERKNS0_12_GLOBAL__N_14PathEmOS1_mS6_ +FN:55,mpt.cpp:_ZN6evmone5state12_GLOBAL__N_14Path8capacityEv +FNDA:20572234,_ZNK6evmone5state7MPTNode6encodeB5cxx11Ev +FNDA:5565992,_ZN6evmone5state3MPTC2Ev +FNDA:5565992,_ZN6evmone5state3MPTD2Ev +FNDA:15155868,_ZN6evmone5state3MPT6insertESt17basic_string_viewIhN4evmc11byte_traitsIhEEEONSt7__cxx1112basic_stringIhS5_SaIhEEE +FNDA:5565992,_ZNK6evmone5state3MPT4hashEv +FNDA:18529853,mpt.cpp:_ZZNK6evmone5state7MPTNode6encodeB5cxx11EvENK3$_0clEONSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEE +FNDA:5416366,mpt.cpp:_ZNK6evmone5state12_GLOBAL__N_14Path5emptyEv +FNDA:20572234,mpt.cpp:_ZNK6evmone5state12_GLOBAL__N_14Path6encodeB5cxx11ENS1_4KindE +FNDA:15155868,mpt.cpp:_ZN6evmone5state12_GLOBAL__N_14PathC2ESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:23479483,mpt.cpp:_ZN6evmone5state7MPTNode6insertERKNS0_12_GLOBAL__N_14PathEONSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEE +FNDA:93967349,mpt.cpp:_ZNK6evmone5state12_GLOBAL__N_14Path3endEv +FNDA:34312215,mpt.cpp:_ZN6evmone5state12_GLOBAL__N_14PathC2EPKhS4_ +FNDA:52375332,mpt.cpp:_ZNK6evmone5state12_GLOBAL__N_14Path5beginEv +FNDA:15155868,mpt.cpp:_ZN6evmone5state7MPTNodeC2ERKNS0_12_GLOBAL__N_14PathEONSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEE +FNDA:5416366,mpt.cpp:_ZN6evmone5state7MPTNodeC2ERKNS0_12_GLOBAL__N_14PathEmOS1_mS6_ +FNDA:0,mpt.cpp:_ZN6evmone5state12_GLOBAL__N_14Path8capacityEv +FNF:16 +FNH:15 +DA:37,34312215 +DA:38,34312215 +DA:39,34312215 +DA:40,34312215 +DA:41,34312215 +DA:44,15155868 +DA:45,15155868 +DA:46,15155868 +DA:47,15155868 +DA:48,15155868 +DA:49,479902442 +DA:50,479902442 +DA:51,479902442 +DA:52,479902442 +DA:53,15155868 +DA:55,0 +DA:56,5416366 +DA:57,52375332 +DA:58,93967349 +DA:61,20572234 +DA:62,20572234 +DA:63,5207912 +DA:65,15364322 +DA:66,15364322 +DA:67,15364322 +DA:69,15364322 +DA:70,477577035 +DA:71,462212713 +DA:72,15364322 +DA:73,20572234 +DA:87,5416366 +DA:88,5416366 +DA:89,5416366 +DA:90,5416366 +DA:91,5416366 +DA:93,5416366 +DA:94,5416366 +DA:95,5416366 +DA:99,15155868 +DA:107,23479483 +DA:131,23479483 +DA:138,23479483 +DA:139,23479483 +DA:141,23479483 +DA:142,18063117 +DA:143,18063117 +DA:144,10574450 +DA:145,7488667 +DA:146,7488667 +DA:147,18063117 +DA:148,5416366 +DA:149,5416366 +DA:150,5416366 +DA:151,5416366 +DA:152,5416366 +DA:153,5416366 +DA:154,5416366 +DA:155,5416366 +DA:156,5416366 +DA:157,5416366 +DA:158,23479483 +DA:162,20572234 +DA:163,20572234 +DA:164,18529853 +DA:165,18529853 +DA:167,20572234 +DA:168,20572234 +DA:169,20572234 +DA:170,15155868 +DA:171,15155868 +DA:172,15155868 +DA:173,15155868 +DA:174,0 +DA:175,5416366 +DA:176,5416366 +DA:177,5416366 +DA:179,5416366 +DA:180,86661856 +DA:181,5416366 +DA:183,5416366 +DA:184,208454 +DA:185,5416366 +DA:186,0 +DA:187,20572234 +DA:188,20572234 +DA:189,20572234 +DA:192,5565992 +DA:193,5565992 +DA:196,15155868 +DA:197,15155868 +DA:198,15155868 +DA:200,15155868 +DA:201,2250835 +DA:202,12905033 +DA:203,12905033 +DA:204,15155868 +DA:207,5565992 +DA:208,5565992 +DA:209,3315157 +DA:210,2250835 +DA:211,5565992 +BRDA:48,0,0,479902442 +BRDA:48,0,1,15155868 +BRDA:62,0,0,5416366 +BRDA:62,0,1,15155868 +BRDA:62,1,2,5207912 +BRDA:62,1,3,208454 +BRDA:65,0,0,15155868 +BRDA:65,0,1,208454 +BRDA:67,0,0,6209796 +BRDA:67,0,1,9154526 +BRDA:70,0,0,462212713 +BRDA:70,0,1,15364322 +BRDA:141,0,0,18112534 +BRDA:141,0,1,5366949 +BRDA:141,1,2,18063117 +BRDA:141,1,3,49417 +BRDA:143,0,0,10574450 +BRDA:143,0,1,7488667 +BRDA:164,0,0,3210 +BRDA:164,0,1,18526643 +BRDA:168,0,0,20572234 +BRDA:168,0,1,0 +BRDA:170,0,0,15155868 +BRDA:170,0,1,5416366 +BRDA:175,0,0,5416366 +BRDA:175,0,1,15155868 +BRDA:179,0,0,86661856 +BRDA:179,0,1,5416366 +BRDA:180,0,0,18321399 +BRDA:180,0,1,68340457 +BRDA:183,0,0,208454 +BRDA:183,0,1,5207912 +BRDA:200,0,0,2250835 +BRDA:200,0,1,12905033 +BRDA:208,0,0,3315157 +BRDA:208,0,1,2250835 +BRF:36 +BRH:35 +LF:103 +LH:100 +end_of_record +SF:/home/builder/project/test/state/mpt_hash.cpp +FN:41,_ZN6evmone5state8mpt_hashINS0_11TransactionEEEN4evmc7bytes32ESt4spanIKT_Lm18446744073709551615EE +FN:41,_ZN6evmone5state8mpt_hashINS0_18TransactionReceiptEEEN4evmc7bytes32ESt4spanIKT_Lm18446744073709551615EE +FN:41,_ZN6evmone5state8mpt_hashINS0_10WithdrawalEEEN4evmc7bytes32ESt4spanIKT_Lm18446744073709551615EE +FN:29,_ZN6evmone5state8mpt_hashERKNS_4test9TestStateE +FN:17,mpt_hash.cpp:_ZN6evmone5state12_GLOBAL__N_18mpt_hashERKSt3mapIN4evmc7bytes32ES4_St4lessIS4_ESaISt4pairIKS4_S4_EEE +FNDA:76274,_ZN6evmone5state8mpt_hashINS0_11TransactionEEEN4evmc7bytes32ESt4spanIKT_Lm18446744073709551615EE +FNDA:76274,_ZN6evmone5state8mpt_hashINS0_18TransactionReceiptEEEN4evmc7bytes32ESt4spanIKT_Lm18446744073709551615EE +FNDA:64430,_ZN6evmone5state8mpt_hashINS0_10WithdrawalEEEN4evmc7bytes32ESt4spanIKT_Lm18446744073709551615EE +FNDA:264844,_ZN6evmone5state8mpt_hashERKNS_4test9TestStateE +FNDA:5084170,mpt_hash.cpp:_ZN6evmone5state12_GLOBAL__N_18mpt_hashERKSt3mapIN4evmc7bytes32ES4_St4lessIS4_ESaISt4pairIKS4_S4_EEE +FNF:3 +FNH:3 +DA:17,5084170 +DA:18,5084170 +DA:19,5084170 +DA:20,9907576 +DA:21,9907576 +DA:22,9907576 +DA:23,9907576 +DA:24,5084170 +DA:25,5084170 +DA:29,264844 +DA:30,264844 +DA:31,264844 +DA:32,5084170 +DA:33,5084170 +DA:34,5084170 +DA:35,5084170 +DA:36,264844 +DA:37,264844 +DA:41,216978 +DA:42,216978 +DA:43,381100 +DA:44,164122 +DA:46,216978 +DA:47,216978 +BRDA:19,0,0,9907576 +BRDA:19,0,1,5084170 +BRDA:21,0,0,9907576 +BRDA:21,0,1,0 +BRDA:31,0,0,5084170 +BRDA:31,0,1,264844 +BRDA:43,0,0,80048 +BRDA:43,0,1,76274 +BRDA:43,1,2,80048 +BRDA:43,1,3,76274 +BRDA:43,2,4,4026 +BRDA:43,2,5,64430 +BRF:8 +BRH:7 +LF:24 +LH:24 +end_of_record +SF:/home/builder/project/test/state/mpt_hash.hpp +FN:33,_ZN6evmone5state8mpt_hashISt5arrayINS0_11TransactionELm1EEEEN4evmc7bytes32ERKT_Qsr3stdE16is_convertible_vIS7_St4spanIKNS7_10value_typeELm18446744073709551615EEE +FN:33,_ZN6evmone5state8mpt_hashISt5arrayINS0_18TransactionReceiptELm2EEEEN4evmc7bytes32ERKT_Qsr3stdE16is_convertible_vIS7_St4spanIKNS7_10value_typeELm18446744073709551615EEE +FN:33,_ZN6evmone5state8mpt_hashISt5arrayINS0_18TransactionReceiptELm3EEEEN4evmc7bytes32ERKT_Qsr3stdE16is_convertible_vIS7_St4spanIKNS7_10value_typeELm18446744073709551615EEE +FN:33,_ZN6evmone5state8mpt_hashISt6vectorINS0_10WithdrawalESaIS3_EEEEN4evmc7bytes32ERKT_Qsr3stdE16is_convertible_vIS8_St4spanIKNS8_10value_typeELm18446744073709551615EEE +FN:33,_ZN6evmone5state8mpt_hashISt6vectorINS0_11TransactionESaIS3_EEEEN4evmc7bytes32ERKT_Qsr3stdE16is_convertible_vIS8_St4spanIKNS8_10value_typeELm18446744073709551615EEE +FN:33,_ZN6evmone5state8mpt_hashISt6vectorINS0_18TransactionReceiptESaIS3_EEEEN4evmc7bytes32ERKT_Qsr3stdE16is_convertible_vIS8_St4spanIKNS8_10value_typeELm18446744073709551615EEE +FNDA:0,_ZN6evmone5state8mpt_hashISt5arrayINS0_11TransactionELm1EEEEN4evmc7bytes32ERKT_Qsr3stdE16is_convertible_vIS7_St4spanIKNS7_10value_typeELm18446744073709551615EEE +FNDA:0,_ZN6evmone5state8mpt_hashISt5arrayINS0_18TransactionReceiptELm2EEEEN4evmc7bytes32ERKT_Qsr3stdE16is_convertible_vIS7_St4spanIKNS7_10value_typeELm18446744073709551615EEE +FNDA:0,_ZN6evmone5state8mpt_hashISt5arrayINS0_18TransactionReceiptELm3EEEEN4evmc7bytes32ERKT_Qsr3stdE16is_convertible_vIS7_St4spanIKNS7_10value_typeELm18446744073709551615EEE +FNDA:64430,_ZN6evmone5state8mpt_hashISt6vectorINS0_10WithdrawalESaIS3_EEEEN4evmc7bytes32ERKT_Qsr3stdE16is_convertible_vIS8_St4spanIKNS8_10value_typeELm18446744073709551615EEE +FNDA:76274,_ZN6evmone5state8mpt_hashISt6vectorINS0_11TransactionESaIS3_EEEEN4evmc7bytes32ERKT_Qsr3stdE16is_convertible_vIS8_St4spanIKNS8_10value_typeELm18446744073709551615EEE +FNDA:76274,_ZN6evmone5state8mpt_hashISt6vectorINS0_18TransactionReceiptESaIS3_EEEEN4evmc7bytes32ERKT_Qsr3stdE16is_convertible_vIS8_St4spanIKNS8_10value_typeELm18446744073709551615EEE +FNF:1 +FNH:1 +DA:33,216978 +DA:34,216978 +DA:35,216978 +BRF:0 +BRH:0 +LF:3 +LH:3 +end_of_record +SF:/home/builder/project/test/state/precompiles.cpp +FN:61,_ZN6evmone5state17ecrecover_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:66,_ZN6evmone5state14sha256_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:71,_ZN6evmone5state17ripemd160_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:76,_ZN6evmone5state16identity_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:81,_ZN6evmone5state13ecadd_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:86,_ZN6evmone5state13ecmul_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:91,_ZN6evmone5state17ecpairing_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:99,_ZN6evmone5state16blake2bf_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:105,_ZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:200,_ZN6evmone5state24point_evaluation_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:206,_ZN6evmone5state19bls12_g1add_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:212,_ZN6evmone5state19bls12_g1msm_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:234,_ZN6evmone5state19bls12_g2add_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:240,_ZN6evmone5state19bls12_g2msm_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:262,_ZN6evmone5state27bls12_pairing_check_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:278,_ZN6evmone5state26bls12_map_fp_to_g1_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:284,_ZN6evmone5state27bls12_map_fp2_to_g2_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:296,_ZN6evmone5state17ecrecover_executeEPKhmPhm +FN:327,_ZN6evmone5state14sha256_executeEPKhmPhm +FN:336,_ZN6evmone5state17ripemd160_executeEPKhmPhm +FN:402,_ZN6evmone5state14expmod_executeEPKhmPhm +FN:436,_ZN6evmone5state13ecadd_executeEPKhmPhm +FN:463,_ZN6evmone5state13ecmul_executeEPKhmPhm +FN:490,_ZN6evmone5state17ecpairing_executeEPKhmPhm +FN:526,_ZN6evmone5state16identity_executeEPKhmPhm +FN:534,_ZN6evmone5state16blake2bf_executeEPKhmPhm +FN:566,_ZN6evmone5state24point_evaluation_executeEPKhmPhm +FN:589,_ZN6evmone5state19bls12_g1add_executeEPKhmPhm +FN:603,_ZN6evmone5state19bls12_g1msm_executeEPKhmPhm +FN:617,_ZN6evmone5state19bls12_g2add_executeEPKhmPhm +FN:631,_ZN6evmone5state19bls12_g2msm_executeEPKhmPhm +FN:645,_ZN6evmone5state27bls12_pairing_check_executeEPKhmPhm +FN:659,_ZN6evmone5state26bls12_map_fp_to_g1_executeEPKhmPhm +FN:673,_ZN6evmone5state27bls12_map_fp2_to_g2_executeEPKhmPhm +FN:758,_ZN6evmone5state13is_precompileE13evmc_revisionRKN4evmc7addressE +FN:774,_ZN6evmone5state15call_precompileE13evmc_revisionRK12evmc_message +FN:55,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_119cost_per_input_wordILi60ELi12EEElm +FN:49,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_19num_wordsEm +FN:55,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_119cost_per_input_wordILi600ELi120EEElm +FN:55,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_119cost_per_input_wordILi15ELi3EEElm +FN:155,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_1clEv +FN:128,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_2clEj +FN:135,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_3clEj +FN:139,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_4clEj +FN:108,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_0clEmj +FN:347,precompiles.cpp:_ZN6evmone5stateL18expmod_parse_inputEPKhmPhm +FN:376,precompiles.cpp:_ZZN6evmone5stateL18expmod_parse_inputEPKhmPhmENK3$_0clEh +FN:750,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_115to_lookup_indexERKN4evmc7addressE +FN:290,precompiles.cpp:_ZN6evmone5stateL18p256verify_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:687,precompiles.cpp:_ZN6evmone5stateL18p256verify_executeEPKhmPhm +FN:804,precompiles.cpp:_ZZN6evmone5state15call_precompileE13evmc_revisionRK12evmc_messageENK3$_1clEPK11evmc_result +FNDA:402202,_ZN6evmone5state17ecrecover_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:20455,_ZN6evmone5state14sha256_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:394736,_ZN6evmone5state17ripemd160_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:792124,_ZN6evmone5state16identity_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:2938,_ZN6evmone5state13ecadd_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:6452,_ZN6evmone5state13ecmul_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:2098,_ZN6evmone5state17ecpairing_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:2128,_ZN6evmone5state16blake2bf_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:4228,_ZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:1314,_ZN6evmone5state24point_evaluation_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:532,_ZN6evmone5state19bls12_g1add_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:3424,_ZN6evmone5state19bls12_g1msm_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:556,_ZN6evmone5state19bls12_g2add_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:3448,_ZN6evmone5state19bls12_g2msm_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:844,_ZN6evmone5state27bls12_pairing_check_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:328,_ZN6evmone5state26bls12_map_fp_to_g1_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:316,_ZN6evmone5state27bls12_map_fp2_to_g2_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:2048,_ZN6evmone5state17ecrecover_executeEPKhmPhm +FNDA:20427,_ZN6evmone5state14sha256_executeEPKhmPhm +FNDA:568,_ZN6evmone5state17ripemd160_executeEPKhmPhm +FNDA:3986,_ZN6evmone5state14expmod_executeEPKhmPhm +FNDA:2928,_ZN6evmone5state13ecadd_executeEPKhmPhm +FNDA:6442,_ZN6evmone5state13ecmul_executeEPKhmPhm +FNDA:1740,_ZN6evmone5state17ecpairing_executeEPKhmPhm +FNDA:4646,_ZN6evmone5state16identity_executeEPKhmPhm +FNDA:1168,_ZN6evmone5state16blake2bf_executeEPKhmPhm +FNDA:1220,_ZN6evmone5state24point_evaluation_executeEPKhmPhm +FNDA:520,_ZN6evmone5state19bls12_g1add_executeEPKhmPhm +FNDA:1584,_ZN6evmone5state19bls12_g1msm_executeEPKhmPhm +FNDA:544,_ZN6evmone5state19bls12_g2add_executeEPKhmPhm +FNDA:1608,_ZN6evmone5state19bls12_g2msm_executeEPKhmPhm +FNDA:412,_ZN6evmone5state27bls12_pairing_check_executeEPKhmPhm +FNDA:316,_ZN6evmone5state26bls12_map_fp_to_g1_executeEPKhmPhm +FNDA:304,_ZN6evmone5state27bls12_map_fp2_to_g2_executeEPKhmPhm +FNDA:7349122,_ZN6evmone5state13is_precompileE13evmc_revisionRKN4evmc7addressE +FNDA:1638857,_ZN6evmone5state15call_precompileE13evmc_revisionRK12evmc_message +FNDA:20455,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_119cost_per_input_wordILi60ELi12EEElm +FNDA:1207315,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_19num_wordsEm +FNDA:394736,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_119cost_per_input_wordILi600ELi120EEElm +FNDA:792124,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_119cost_per_input_wordILi15ELi3EEElm +FNDA:4228,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_1clEv +FNDA:528,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_2clEj +FNDA:3374,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_3clEj +FNDA:90,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_4clEj +FNDA:3992,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_0clEmj +FNDA:3986,precompiles.cpp:_ZN6evmone5stateL18expmod_parse_inputEPKhmPhm +FNDA:34192,precompiles.cpp:_ZZN6evmone5stateL18expmod_parse_inputEPKhmPhmENK3$_0clEh +FNDA:5507040,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_115to_lookup_indexERKN4evmc7addressE +FNDA:734,precompiles.cpp:_ZN6evmone5stateL18p256verify_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:724,precompiles.cpp:_ZN6evmone5stateL18p256verify_executeEPKhmPhm +FNDA:51185,precompiles.cpp:_ZZN6evmone5state15call_precompileE13evmc_revisionRK12evmc_messageENK3$_1clEPK11evmc_result +FNF:49 +FNH:49 +DA:49,1207315 +DA:50,1207315 +DA:51,1207315 +DA:55,1207315 +DA:56,1207315 +DA:57,1207315 +DA:61,402202 +DA:62,402202 +DA:63,402202 +DA:66,20455 +DA:67,20455 +DA:68,20455 +DA:71,394736 +DA:72,394736 +DA:73,394736 +DA:76,792124 +DA:77,792124 +DA:78,792124 +DA:81,2938 +DA:82,2938 +DA:83,2938 +DA:86,6452 +DA:87,6452 +DA:88,6452 +DA:91,2098 +DA:92,2098 +DA:93,2098 +DA:94,2098 +DA:95,2098 +DA:96,2098 +DA:99,2128 +DA:101,2128 +DA:102,2128 +DA:105,4228 +DA:106,4228 +DA:108,4228 +DA:109,3992 +DA:110,3992 +DA:111,3992 +DA:112,3434 +DA:113,3992 +DA:115,3992 +DA:116,3992 +DA:117,3992 +DA:118,2523 +DA:119,2523 +DA:120,3992 +DA:122,3992 +DA:123,3992 +DA:124,3992 +DA:125,3992 +DA:126,3992 +DA:128,4228 +DA:130,528 +DA:131,528 +DA:132,528 +DA:133,528 +DA:134,528 +DA:135,4228 +DA:136,3374 +DA:137,3374 +DA:138,3374 +DA:139,4228 +DA:140,90 +DA:141,90 +DA:142,90 +DA:143,0 +DA:144,0 +DA:146,0 +DA:147,0 +DA:149,4228 +DA:150,4228 +DA:151,4228 +DA:152,4228 +DA:153,4228 +DA:154,4228 +DA:155,4228 +DA:156,4228 +DA:157,594 +DA:158,3634 +DA:159,3538 +DA:160,96 +DA:161,96 +DA:162,4228 +DA:164,4228 +DA:165,4228 +DA:167,4228 +DA:169,4228 +DA:170,4228 +DA:171,4228 +DA:175,4228 +DA:176,4228 +DA:177,4228 +DA:178,158 +DA:180,4070 +DA:181,78 +DA:183,78 +DA:184,32 +DA:185,46 +DA:186,78 +DA:188,3992 +DA:189,3992 +DA:190,3992 +DA:192,3992 +DA:193,3992 +DA:194,3992 +DA:195,3992 +DA:196,3992 +DA:197,4070 +DA:200,1314 +DA:201,1314 +DA:202,1314 +DA:203,1314 +DA:206,532 +DA:207,532 +DA:208,532 +DA:209,532 +DA:212,3424 +DA:213,3424 +DA:214,3424 +DA:215,3424 +DA:216,3424 +DA:217,3424 +DA:218,3424 +DA:219,3424 +DA:220,3424 +DA:221,3424 +DA:223,3424 +DA:224,1316 +DA:226,2108 +DA:227,2108 +DA:228,2108 +DA:229,2108 +DA:230,2108 +DA:231,3424 +DA:234,556 +DA:235,556 +DA:236,556 +DA:237,556 +DA:240,3448 +DA:241,3448 +DA:242,3448 +DA:243,3448 +DA:244,3448 +DA:245,3448 +DA:246,3448 +DA:247,3448 +DA:248,3448 +DA:249,3448 +DA:251,3448 +DA:252,1316 +DA:254,2132 +DA:255,2132 +DA:256,2132 +DA:257,2132 +DA:258,2132 +DA:259,3448 +DA:262,844 +DA:263,844 +DA:265,844 +DA:266,344 +DA:268,500 +DA:270,500 +DA:271,500 +DA:272,500 +DA:273,500 +DA:274,500 +DA:275,844 +DA:278,328 +DA:279,328 +DA:280,328 +DA:281,328 +DA:284,316 +DA:285,316 +DA:286,316 +DA:287,316 +DA:290,734 +DA:291,734 +DA:292,734 +DA:296,2048 +DA:297,2048 +DA:299,2048 +DA:300,2048 +DA:301,1718 +DA:303,2048 +DA:304,2048 +DA:306,2048 +DA:307,2048 +DA:308,1096 +DA:309,952 +DA:311,952 +DA:312,952 +DA:314,952 +DA:315,952 +DA:316,676 +DA:317,676 +DA:318,676 +DA:319,676 +DA:320,676 +DA:321,276 +DA:322,276 +DA:323,952 +DA:327,20427 +DA:328,20427 +DA:329,20427 +DA:330,20427 +DA:331,20427 +DA:332,20427 +DA:336,568 +DA:337,568 +DA:338,568 +DA:339,568 +DA:340,568 +DA:341,568 +DA:342,568 +DA:347,3986 +DA:348,3986 +DA:349,3986 +DA:350,3986 +DA:353,3986 +DA:356,3986 +DA:357,524 +DA:358,524 +DA:359,524 +DA:360,524 +DA:362,3462 +DA:363,3462 +DA:364,3462 +DA:366,3462 +DA:367,3462 +DA:368,3462 +DA:369,3462 +DA:370,3462 +DA:376,34192 +DA:377,552 +DA:379,552 +DA:380,552 +DA:381,552 +DA:383,2910 +DA:384,2910 +DA:385,100 +DA:389,100 +DA:390,100 +DA:391,100 +DA:393,2910 +DA:394,2910 +DA:395,2910 +DA:397,2910 +DA:398,3462 +DA:402,3986 +DA:403,3986 +DA:404,3986 +DA:405,1076 +DA:407,2910 +DA:408,2909 +DA:409,2909 +DA:410,2909 +DA:411,2909 +DA:416,1 +DA:417,1 +DA:418,1 +DA:419,2910 +DA:436,2928 +DA:437,2928 +DA:439,2928 +DA:440,2928 +DA:441,2632 +DA:443,2928 +DA:445,2928 +DA:447,2928 +DA:448,2928 +DA:450,2928 +DA:451,2596 +DA:452,2596 +DA:453,2596 +DA:454,2596 +DA:455,2596 +DA:456,2596 +DA:457,332 +DA:458,332 +DA:459,2928 +DA:463,6442 +DA:464,6442 +DA:466,6442 +DA:467,6442 +DA:468,6146 +DA:470,6442 +DA:472,6442 +DA:474,6442 +DA:475,6442 +DA:477,6442 +DA:478,4604 +DA:479,4604 +DA:480,4604 +DA:481,4604 +DA:482,4604 +DA:483,4604 +DA:484,1838 +DA:485,1838 +DA:486,6442 +DA:490,1740 +DA:491,1740 +DA:492,1740 +DA:493,1740 +DA:495,1740 +DA:496,142 +DA:498,1598 +DA:499,1598 +DA:500,4442 +DA:501,2844 +DA:502,2844 +DA:503,2844 +DA:504,2844 +DA:505,2844 +DA:506,2844 +DA:507,2844 +DA:508,2844 +DA:509,2844 +DA:510,2844 +DA:511,2844 +DA:512,2844 +DA:513,2844 +DA:515,1598 +DA:516,1598 +DA:517,798 +DA:519,800 +DA:520,800 +DA:521,800 +DA:522,1598 +DA:526,4646 +DA:527,4646 +DA:528,4646 +DA:529,4646 +DA:530,4646 +DA:534,1168 +DA:535,1168 +DA:536,1168 +DA:537,1168 +DA:538,1168 +DA:540,1168 +DA:541,1168 +DA:543,1168 +DA:544,1168 +DA:545,1168 +DA:547,1168 +DA:548,1168 +DA:549,1168 +DA:551,1168 +DA:552,1168 +DA:553,1168 +DA:555,1168 +DA:556,1168 +DA:557,144 +DA:559,1024 +DA:560,1024 +DA:561,1024 +DA:562,1168 +DA:566,1220 +DA:567,1220 +DA:568,1220 +DA:569,314 +DA:571,906 +DA:572,906 +DA:573,906 +DA:574,906 +DA:575,906 +DA:577,906 +DA:578,486 +DA:582,420 +DA:583,420 +DA:584,420 +DA:585,906 +DA:589,520 +DA:590,520 +DA:591,196 +DA:593,520 +DA:595,324 +DA:596,144 +DA:598,180 +DA:599,324 +DA:603,1584 +DA:604,1584 +DA:605,0 +DA:607,1584 +DA:609,1584 +DA:610,220 +DA:612,1364 +DA:613,1584 +DA:617,544 +DA:618,544 +DA:619,196 +DA:621,544 +DA:623,348 +DA:624,176 +DA:626,172 +DA:627,348 +DA:631,1608 +DA:632,1608 +DA:633,0 +DA:635,1608 +DA:637,1608 +DA:638,240 +DA:640,1368 +DA:641,1608 +DA:645,412 +DA:646,412 +DA:647,0 +DA:649,412 +DA:651,412 +DA:652,204 +DA:654,208 +DA:655,412 +DA:659,316 +DA:660,316 +DA:661,200 +DA:663,316 +DA:665,116 +DA:666,36 +DA:668,80 +DA:669,116 +DA:673,304 +DA:674,304 +DA:675,200 +DA:677,304 +DA:679,104 +DA:680,56 +DA:682,48 +DA:683,104 +DA:687,724 +DA:688,724 +DA:690,724 +DA:691,14 +DA:693,710 +DA:694,710 +DA:695,710 +DA:696,710 +DA:697,710 +DA:698,710 +DA:700,710 +DA:701,258 +DA:704,452 +DA:705,452 +DA:706,452 +DA:707,710 +DA:750,5507040 +DA:751,5507040 +DA:752,5507040 +DA:753,5507040 +DA:754,5507040 +DA:758,7349122 +DA:759,7349122 +DA:760,7349122 +DA:761,7349122 +DA:762,7349122 +DA:763,7349122 +DA:764,7349122 +DA:765,7349122 +DA:766,7349122 +DA:768,7349122 +DA:769,3480939 +DA:770,3868183 +DA:771,7349122 +DA:774,1638857 +DA:775,1638857 +DA:776,1638857 +DA:777,1638857 +DA:778,1638857 +DA:779,1638857 +DA:780,1638857 +DA:781,1638857 +DA:782,1638857 +DA:783,1638857 +DA:784,1638857 +DA:785,1638857 +DA:787,1638857 +DA:789,1638857 +DA:791,1638857 +DA:792,1638857 +DA:793,1638857 +DA:794,1638857 +DA:795,1587672 +DA:799,51185 +DA:800,51185 +DA:801,51185 +DA:802,51185 +DA:803,51185 +DA:804,51185 +DA:805,51185 +DA:806,1638857 +BRDA:82,0,0,2938 +BRDA:82,0,1,0 +BRDA:87,0,0,6452 +BRDA:87,0,1,0 +BRDA:92,0,0,2098 +BRDA:92,0,1,0 +BRDA:93,0,0,2098 +BRDA:93,0,1,0 +BRDA:101,0,0,1280 +BRDA:101,0,1,848 +BRDA:111,0,0,3434 +BRDA:111,0,1,558 +BRDA:117,0,0,2523 +BRDA:117,0,1,1469 +BRDA:124,0,0,3464 +BRDA:124,0,1,528 +BRDA:132,0,0,386 +BRDA:132,0,1,142 +BRDA:141,0,0,90 +BRDA:141,0,1,0 +BRDA:143,0,0,- +BRDA:143,0,1,- +BRDA:156,0,0,594 +BRDA:156,0,1,3634 +BRDA:158,0,0,3538 +BRDA:158,0,1,96 +BRDA:176,0,0,3634 +BRDA:176,0,1,594 +BRDA:177,0,0,104 +BRDA:177,0,1,4124 +BRDA:177,1,2,158 +BRDA:177,1,3,4070 +BRDA:177,2,4,54 +BRDA:177,2,5,4070 +BRDA:180,0,0,78 +BRDA:180,0,1,3992 +BRDA:183,0,0,32 +BRDA:183,0,1,46 +BRDA:183,1,2,64 +BRDA:183,1,3,14 +BRDA:183,2,4,32 +BRDA:183,2,5,32 +BRDA:183,3,6,32 +BRDA:183,3,7,0 +BRDA:223,0,0,120 +BRDA:223,0,1,3304 +BRDA:223,1,2,1196 +BRDA:223,1,3,2108 +BRDA:251,0,0,120 +BRDA:251,0,1,3328 +BRDA:251,1,2,1196 +BRDA:251,1,3,2132 +BRDA:265,0,0,112 +BRDA:265,0,1,732 +BRDA:265,1,2,232 +BRDA:265,1,3,500 +BRDA:300,0,0,1718 +BRDA:300,0,1,330 +BRDA:307,0,0,1424 +BRDA:307,0,1,624 +BRDA:307,1,2,1096 +BRDA:307,1,3,952 +BRDA:307,2,4,1096 +BRDA:307,2,5,328 +BRDA:315,0,0,676 +BRDA:315,0,1,276 +BRDA:356,0,0,524 +BRDA:356,0,1,3462 +BRDA:376,0,0,552 +BRDA:376,0,1,2910 +BRDA:384,0,0,100 +BRDA:384,0,1,2810 +BRDA:395,0,0,100 +BRDA:395,0,1,2810 +BRDA:404,0,0,1076 +BRDA:404,0,1,2910 +BRDA:407,0,0,2909 +BRDA:407,0,1,1 +BRDA:440,0,0,2632 +BRDA:440,0,1,296 +BRDA:450,0,0,2668 +BRDA:450,0,1,260 +BRDA:450,1,2,2596 +BRDA:450,1,3,72 +BRDA:467,0,0,6146 +BRDA:467,0,1,296 +BRDA:477,0,0,4604 +BRDA:477,0,1,1838 +BRDA:495,0,0,142 +BRDA:495,0,1,1598 +BRDA:500,0,0,2844 +BRDA:500,0,1,1598 +BRDA:516,0,0,798 +BRDA:516,0,1,800 +BRDA:520,0,0,722 +BRDA:520,0,1,78 +BRDA:556,0,0,896 +BRDA:556,0,1,272 +BRDA:556,1,2,144 +BRDA:556,1,3,752 +BRDA:568,0,0,314 +BRDA:568,0,1,906 +BRDA:577,0,0,486 +BRDA:577,0,1,420 +BRDA:590,0,0,196 +BRDA:590,0,1,324 +BRDA:595,0,0,144 +BRDA:595,0,1,180 +BRDA:604,0,0,0 +BRDA:604,0,1,1584 +BRDA:609,0,0,220 +BRDA:609,0,1,1364 +BRDA:618,0,0,196 +BRDA:618,0,1,348 +BRDA:623,0,0,176 +BRDA:623,0,1,172 +BRDA:632,0,0,0 +BRDA:632,0,1,1608 +BRDA:637,0,0,240 +BRDA:637,0,1,1368 +BRDA:646,0,0,0 +BRDA:646,0,1,412 +BRDA:651,0,0,204 +BRDA:651,0,1,208 +BRDA:660,0,0,200 +BRDA:660,0,1,116 +BRDA:665,0,0,36 +BRDA:665,0,1,80 +BRDA:674,0,0,200 +BRDA:674,0,1,104 +BRDA:679,0,0,56 +BRDA:679,0,1,48 +BRDA:690,0,0,14 +BRDA:690,0,1,710 +BRDA:700,0,0,258 +BRDA:700,0,1,452 +BRDA:768,0,0,3480939 +BRDA:768,0,1,3868183 +BRDA:794,0,0,1587672 +BRDA:794,0,1,51185 +BRDA:802,0,0,45263 +BRDA:802,0,1,5922 +BRF:142 +BRH:131 +LF:529 +LH:522 +end_of_record +SF:/home/builder/project/test/state/precompiles_stubs.cpp +FN:63,_ZN6evmone5state11expmod_stubESt4spanIKhLm18446744073709551615EES3_S3_Ph +FN:79,precompiles_stubs.cpp:_ZZN6evmone5state11expmod_stubESt4spanIKhLm18446744073709551615EES3_S3_PhENK3$_0clB5cxx11Ev +FN:36,precompiles_stubs.cpp:_ZN6evmone5state12_GLOBAL__N_120expmod_lookup_resultB5cxx11ESt17basic_string_viewIhN4evmc11byte_traitsIhEEES6_S6_ +FNDA:1,_ZN6evmone5state11expmod_stubESt4spanIKhLm18446744073709551615EES3_S3_Ph +FNDA:1,precompiles_stubs.cpp:_ZZN6evmone5state11expmod_stubESt4spanIKhLm18446744073709551615EES3_S3_PhENK3$_0clB5cxx11Ev +FNDA:0,precompiles_stubs.cpp:_ZN6evmone5state12_GLOBAL__N_120expmod_lookup_resultB5cxx11ESt17basic_string_viewIhN4evmc11byte_traitsIhEEES6_S6_ +FNF:3 +FNH:2 +DA:36,0 +DA:37,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:43,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:69,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:79,1 +DA:81,1 +DA:82,0 +DA:85,1 +DA:86,1 +DA:89,0 +DA:90,0 +DA:92,0 +DA:93,0 +DA:96,1 +DA:97,1 +DA:98,1 +BRDA:51,0,0,- +BRDA:51,0,1,- +BRDA:81,0,0,1 +BRDA:81,0,1,0 +BRDA:81,1,2,0 +BRDA:81,1,3,1 +BRDA:85,0,0,1 +BRDA:85,0,1,0 +BRDA:89,0,0,- +BRDA:89,0,1,- +BRDA:89,1,2,- +BRDA:89,1,3,- +BRDA:89,2,4,- +BRDA:89,2,5,- +BRF:14 +BRH:3 +LF:47 +LH:25 +end_of_record +SF:/home/builder/project/test/state/requests.cpp +FN:11,_ZN6evmone5state23calculate_requests_hashESt4spanIKNS0_8RequestsELm18446744073709551615EE +FN:33,_ZN6evmone5state24collect_deposit_requestsESt4spanIKNS0_18TransactionReceiptELm18446744073709551615EE +FNDA:43386,_ZN6evmone5state23calculate_requests_hashESt4spanIKNS0_8RequestsELm18446744073709551615EE +FNDA:45464,_ZN6evmone5state24collect_deposit_requestsESt4spanIKNS0_18TransactionReceiptELm18446744073709551615EE +FNF:2 +FNH:2 +DA:11,43386 +DA:12,43386 +DA:13,43386 +DA:15,43386 +DA:16,130158 +DA:17,130158 +DA:18,129374 +DA:20,784 +DA:21,784 +DA:22,784 +DA:23,784 +DA:24,784 +DA:26,43386 +DA:27,43386 +DA:28,43386 +DA:29,43386 +DA:30,43386 +DA:33,45464 +DA:35,45464 +DA:36,45464 +DA:37,47763 +DA:38,47763 +DA:39,9128 +DA:44,9128 +DA:45,7468 +DA:46,1660 +DA:47,4 +DA:51,1656 +DA:52,4 +DA:68,1652 +DA:69,1652 +DA:72,1652 +DA:73,1652 +DA:75,1652 +DA:76,1652 +DA:79,1652 +DA:80,1652 +DA:82,1652 +DA:83,1652 +DA:86,1652 +DA:88,1652 +DA:89,1652 +DA:90,1652 +DA:91,1652 +DA:92,1652 +DA:93,1652 +DA:94,47763 +DA:95,45460 +DA:96,45464 +BRDA:15,0,0,130158 +BRDA:15,0,1,43386 +BRDA:17,0,0,129374 +BRDA:17,0,1,784 +BRDA:36,0,0,47763 +BRDA:36,0,1,45460 +BRDA:38,0,0,9128 +BRDA:38,0,1,47759 +BRDA:44,0,0,7468 +BRDA:44,0,1,1660 +BRDA:46,0,0,0 +BRDA:46,0,1,1660 +BRDA:46,1,2,4 +BRDA:46,1,3,1656 +BRDA:51,0,0,4 +BRDA:51,0,1,1652 +BRF:16 +BRH:15 +LF:49 +LH:49 +end_of_record +SF:/home/builder/project/test/state/requests.hpp +FN:56,_ZNK6evmone5state8Requests4typeEv +FN:59,_ZNK6evmone5state8Requests4dataEv +FN:49,_ZN6evmone5state8RequestsC2ENS1_4TypeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:62,_ZN6evmone5state8Requests6appendESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:0,_ZNK6evmone5state8Requests4typeEv +FNDA:130158,_ZNK6evmone5state8Requests4dataEv +FNDA:136360,_ZN6evmone5state8RequestsC2ENS1_4TypeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:8260,_ZN6evmone5state8Requests6appendESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNF:4 +FNH:3 +DA:49,136360 +DA:50,136360 +DA:51,136360 +DA:52,136360 +DA:53,136360 +DA:56,0 +DA:59,130158 +DA:62,8260 +BRF:0 +BRH:0 +LF:8 +LH:7 +end_of_record +SF:/home/builder/project/test/state/rlp.hpp +FN:40,_ZN6evmone3rlp8internal9wrap_listERKNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEE +FN:49,_ZN6evmone3rlp4trimESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:61,_ZN6evmone3rlp6encodeB5cxx11ESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:70,_ZN6evmone3rlp6encodeB5cxx11Em +FN:77,_ZN6evmone3rlp6encodeB5cxx11ERKN4intx4uintILj256EEE +FN:24,_ZN6evmone3rlp8internal13encode_lengthILh192ELh247EEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEEm +FN:24,_ZN6evmone3rlp8internal13encode_lengthILh128ELh183EEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEEm +FN:98,_ZN6evmone3rlp12encode_tupleIJmN4intx4uintILj256EEEN4evmc7bytes32ES6_EEENSt7__cxx1112basic_stringIhNS5_11byte_traitsIhEESaIhEEEDpRKT_ +FN:98,_ZN6evmone3rlp12encode_tupleIJNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEES8_EEES8_DpRKT_ +FN:98,_ZN6evmone3rlp12encode_tupleIJNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEENS4_7bytes32EEEES8_DpRKT_ +FN:98,_ZN6evmone3rlp12encode_tupleIJN4evmc7addressEmEEENSt7__cxx1112basic_stringIhNS2_11byte_traitsIhEESaIhEEEDpRKT_ +FN:85,_ZN6evmone3rlp6encodeImEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISA_EE +FN:117,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKmSt6vectorImSaImEEEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SI_ +FN:91,_ZN6evmone3rlp6encodeImLm3EEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERAT0__KT_ +FN:117,_ZN6evmone3rlp8internal16encode_containerIPKmEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SC_ +FN:85,_ZN6evmone3rlp6encodeIN4intx4uintILj256EEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISD_EE +FN:117,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKN4intx4uintILj256EEESt6vectorIS7_SaIS7_EEEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SL_ +FN:56,_ZN6evmone3rlp6encodeI12CustomStructEEDTcl10rlp_encodeclsr3stdE7declvalIT_EEEERKS3_ +FN:98,_ZN6evmone3rlp12encode_tupleIJmNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEEEEES8_DpRKT_ +FN:85,_ZN6evmone3rlp6encodeI12CustomStructEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISB_EE +FN:117,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPK12CustomStructSt6vectorIS5_SaIS5_EEEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SJ_ +FN:56,_ZN6evmone3rlp6encodeINS_5state11TransactionEEEDTcl10rlp_encodeclsr3stdE7declvalIT_EEEERKS4_ +FN:98,_ZN6evmone3rlp12encode_tupleIJmmN4evmc7addressEmEEENSt7__cxx1112basic_stringIhNS2_11byte_traitsIhEESaIhEEEDpRKT_ +FN:56,_ZN6evmone3rlp6encodeINS_5state18TransactionReceiptEEEDTcl10rlp_encodeclsr3stdE7declvalIT_EEEERKS4_ +FN:56,_ZN6evmone3rlp6encodeINS_5state10WithdrawalEEEDTcl10rlp_encodeclsr3stdE7declvalIT_EEEERKS4_ +FN:98,_ZN6evmone3rlp12encode_tupleIJN4evmc7addressESt6vectorINS2_7bytes32ESaIS5_EENSt7__cxx1112basic_stringIhNS2_11byte_traitsIhEESaIhEEEEEESD_DpRKT_ +FN:85,_ZN6evmone3rlp6encodeIN4evmc7bytes32EEENSt7__cxx1112basic_stringIhNS2_11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISB_EE +FN:117,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKN4evmc7bytes32ESt6vectorIS6_SaIS6_EEEEEENSt7__cxx1112basic_stringIhNS5_11byte_traitsIhEESaIhEEET_SJ_ +FN:98,_ZN6evmone3rlp12encode_tupleIJmN4intx4uintILj256EEEmSt17basic_string_viewIhN4evmc11byte_traitsIhEEES4_NSt7__cxx1112basic_stringIhS8_SaIhEEEhS4_S4_EEESD_DpRKT_ +FN:98,_ZN6evmone3rlp12encode_tupleIJmmN4intx4uintILj256EEEmSt17basic_string_viewIhN4evmc11byte_traitsIhEEES4_NSt7__cxx1112basic_stringIhS8_SaIhEEESt6vectorISt4pairINS6_7addressESE_INS6_7bytes32ESaISH_EEESaISK_EEhS4_S4_EEESD_DpRKT_ +FN:85,_ZN6evmone3rlp6encodeISt4pairIN4evmc7addressESt6vectorINS3_7bytes32ESaIS6_EEEEENSt7__cxx1112basic_stringIhNS3_11byte_traitsIhEESaIhEEERKS5_IT_SaISG_EE +FN:117,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKSt4pairIN4evmc7addressESt6vectorINS6_7bytes32ESaIS9_EEES8_ISC_SaISC_EEEEEENSt7__cxx1112basic_stringIhNS6_11byte_traitsIhEESaIhEEET_SO_ +FN:105,_ZN6evmone3rlp6encodeIN4evmc7addressESt6vectorINS2_7bytes32ESaIS5_EEEENSt7__cxx1112basic_stringIhNS2_11byte_traitsIhEESaIhEEERKSt4pairIT_T0_E +FN:98,_ZN6evmone3rlp12encode_tupleIJN4evmc7addressESt6vectorINS2_7bytes32ESaIS5_EEEEENSt7__cxx1112basic_stringIhNS2_11byte_traitsIhEESaIhEEEDpRKT_ +FN:98,_ZN6evmone3rlp12encode_tupleIJmmN4intx4uintILj256EEES4_mSt17basic_string_viewIhN4evmc11byte_traitsIhEEES4_NSt7__cxx1112basic_stringIhS8_SaIhEEESt6vectorISt4pairINS6_7addressESE_INS6_7bytes32ESaISH_EEESaISK_EEhS4_S4_EEESD_DpRKT_ +FN:98,_ZN6evmone3rlp12encode_tupleIJmmN4intx4uintILj256EEES4_mSt17basic_string_viewIhN4evmc11byte_traitsIhEEES4_NSt7__cxx1112basic_stringIhS8_SaIhEEESt6vectorISt4pairINS6_7addressESE_INS6_7bytes32ESaISH_EEESaISK_EES4_SJ_hS4_S4_EEESD_DpRKT_ +FN:98,_ZN6evmone3rlp12encode_tupleIJmmN4intx4uintILj256EEES4_mSt17basic_string_viewIhN4evmc11byte_traitsIhEEES4_NSt7__cxx1112basic_stringIhS8_SaIhEEESt6vectorISt4pairINS6_7addressESE_INS6_7bytes32ESaISH_EEESaISK_EESE_INS_5state13AuthorizationESaISO_EEhS4_S4_EEESD_DpRKT_ +FN:85,_ZN6evmone3rlp6encodeINS_5state13AuthorizationEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISC_EE +FN:117,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKNS_5state13AuthorizationESt6vectorIS6_SaIS6_EEEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SK_ +FN:56,_ZN6evmone3rlp6encodeINS_5state13AuthorizationEEEDTcl10rlp_encodeclsr3stdE7declvalIT_EEEERKS4_ +FN:98,_ZN6evmone3rlp12encode_tupleIJmmN4intx4uintILj256EEES4_mSt17basic_string_viewIhN4evmc11byte_traitsIhEEES4_NSt7__cxx1112basic_stringIhS8_SaIhEEESt6vectorISt4pairINS6_7addressESE_INS6_7bytes32ESaISH_EEESaISK_EESE_ISD_SaISD_EEhS4_S4_EEESD_DpRKT_ +FN:85,_ZN6evmone3rlp6encodeINSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEEEES8_RKSt6vectorIT_SaISA_EE +FN:117,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEESt6vectorISB_SaISB_EEEEEESB_T_SI_ +FN:98,_ZN6evmone3rlp12encode_tupleIJN4evmc7bytes32EmSt17basic_string_viewIhNS2_11byte_traitsIhEEESt6vectorINS_5state3LogESaISA_EEEEENSt7__cxx1112basic_stringIhS6_SaIhEEEDpRKT_ +FN:85,_ZN6evmone3rlp6encodeINS_5state3LogEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISC_EE +FN:117,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKNS_5state3LogESt6vectorIS6_SaIS6_EEEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SK_ +FN:56,_ZN6evmone3rlp6encodeINS_5state3LogEEEDTcl10rlp_encodeclsr3stdE7declvalIT_EEEERKS4_ +FN:98,_ZN6evmone3rlp12encode_tupleIJbmSt17basic_string_viewIhN4evmc11byte_traitsIhEEESt6vectorINS_5state3LogESaIS9_EEEEENSt7__cxx1112basic_stringIhS5_SaIhEEEDpRKT_ +FN:98,_ZN6evmone3rlp12encode_tupleIJN4intx4uintILj256EEEN4evmc7addressEmS4_S4_S4_EEENSt7__cxx1112basic_stringIhNS5_11byte_traitsIhEESaIhEEEDpRKT_ +FN:85,_ZN6evmone3rlp6encodeINS_5state11TransactionEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISC_EE +FN:117,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKNS_5state11TransactionESt6vectorIS6_SaIS6_EEEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SK_ +FNDA:26692515,_ZN6evmone3rlp8internal9wrap_listERKNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEE +FNDA:21857154,_ZN6evmone3rlp4trimESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:81939060,_ZN6evmone3rlp6encodeB5cxx11ESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:5987792,_ZN6evmone3rlp6encodeB5cxx11Em +FNDA:5961786,_ZN6evmone3rlp6encodeB5cxx11ERKN4intx4uintILj256EEE +FNDA:26692515,_ZN6evmone3rlp8internal13encode_lengthILh192ELh247EEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEEm +FNDA:66701431,_ZN6evmone3rlp8internal13encode_lengthILh128ELh183EEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEEm +FNDA:5084170,_ZN6evmone3rlp12encode_tupleIJmN4intx4uintILj256EEEN4evmc7bytes32ES6_EEENSt7__cxx1112basic_stringIhNS5_11byte_traitsIhEESaIhEEEDpRKT_ +FNDA:0,_ZN6evmone3rlp12encode_tupleIJNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEES8_EEES8_DpRKT_ +FNDA:0,_ZN6evmone3rlp12encode_tupleIJNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEENS4_7bytes32EEEES8_DpRKT_ +FNDA:0,_ZN6evmone3rlp12encode_tupleIJN4evmc7addressEmEEENSt7__cxx1112basic_stringIhNS2_11byte_traitsIhEESaIhEEEDpRKT_ +FNDA:0,_ZN6evmone3rlp6encodeImEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISA_EE +FNDA:0,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKmSt6vectorImSaImEEEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SI_ +FNDA:0,_ZN6evmone3rlp6encodeImLm3EEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERAT0__KT_ +FNDA:0,_ZN6evmone3rlp8internal16encode_containerIPKmEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SC_ +FNDA:0,_ZN6evmone3rlp6encodeIN4intx4uintILj256EEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISD_EE +FNDA:0,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKN4intx4uintILj256EEESt6vectorIS7_SaIS7_EEEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SL_ +FNDA:0,_ZN6evmone3rlp6encodeI12CustomStructEEDTcl10rlp_encodeclsr3stdE7declvalIT_EEEERKS3_ +FNDA:0,_ZN6evmone3rlp12encode_tupleIJmNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEEEEES8_DpRKT_ +FNDA:0,_ZN6evmone3rlp6encodeI12CustomStructEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISB_EE +FNDA:0,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPK12CustomStructSt6vectorIS5_SaIS5_EEEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SJ_ +FNDA:164787,_ZN6evmone3rlp6encodeINS_5state11TransactionEEEDTcl10rlp_encodeclsr3stdE7declvalIT_EEEERKS4_ +FNDA:4026,_ZN6evmone3rlp12encode_tupleIJmmN4evmc7addressEmEEENSt7__cxx1112basic_stringIhNS2_11byte_traitsIhEESaIhEEEDpRKT_ +FNDA:80048,_ZN6evmone3rlp6encodeINS_5state18TransactionReceiptEEEDTcl10rlp_encodeclsr3stdE7declvalIT_EEEERKS4_ +FNDA:4026,_ZN6evmone3rlp6encodeINS_5state10WithdrawalEEEDTcl10rlp_encodeclsr3stdE7declvalIT_EEEERKS4_ +FNDA:27323,_ZN6evmone3rlp12encode_tupleIJN4evmc7addressESt6vectorINS2_7bytes32ESaIS5_EENSt7__cxx1112basic_stringIhNS2_11byte_traitsIhEESaIhEEEEEESD_DpRKT_ +FNDA:190707,_ZN6evmone3rlp6encodeIN4evmc7bytes32EEENSt7__cxx1112basic_stringIhNS2_11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISB_EE +FNDA:190707,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKN4evmc7bytes32ESt6vectorIS6_SaIS6_EEEEEENSt7__cxx1112basic_stringIhNS5_11byte_traitsIhEESaIhEEET_SJ_ +FNDA:133880,_ZN6evmone3rlp12encode_tupleIJmN4intx4uintILj256EEEmSt17basic_string_viewIhN4evmc11byte_traitsIhEEES4_NSt7__cxx1112basic_stringIhS8_SaIhEEEhS4_S4_EEESD_DpRKT_ +FNDA:5075,_ZN6evmone3rlp12encode_tupleIJmmN4intx4uintILj256EEEmSt17basic_string_viewIhN4evmc11byte_traitsIhEEES4_NSt7__cxx1112basic_stringIhS8_SaIhEEESt6vectorISt4pairINS6_7addressESE_INS6_7bytes32ESaISH_EEESaISK_EEhS4_S4_EEESD_DpRKT_ +FNDA:30907,_ZN6evmone3rlp6encodeISt4pairIN4evmc7addressESt6vectorINS3_7bytes32ESaIS6_EEEEENSt7__cxx1112basic_stringIhNS3_11byte_traitsIhEESaIhEEERKS5_IT_SaISG_EE +FNDA:30907,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKSt4pairIN4evmc7addressESt6vectorINS6_7bytes32ESaIS9_EEES8_ISC_SaISC_EEEEEENSt7__cxx1112basic_stringIhNS6_11byte_traitsIhEESaIhEEET_SO_ +FNDA:144888,_ZN6evmone3rlp6encodeIN4evmc7addressESt6vectorINS2_7bytes32ESaIS5_EEEENSt7__cxx1112basic_stringIhNS2_11byte_traitsIhEESaIhEEERKSt4pairIT_T0_E +FNDA:144888,_ZN6evmone3rlp12encode_tupleIJN4evmc7addressESt6vectorINS2_7bytes32ESaIS5_EEEEENSt7__cxx1112basic_stringIhNS2_11byte_traitsIhEESaIhEEEDpRKT_ +FNDA:4753,_ZN6evmone3rlp12encode_tupleIJmmN4intx4uintILj256EEES4_mSt17basic_string_viewIhN4evmc11byte_traitsIhEEES4_NSt7__cxx1112basic_stringIhS8_SaIhEEESt6vectorISt4pairINS6_7addressESE_INS6_7bytes32ESaISH_EEESaISK_EEhS4_S4_EEESD_DpRKT_ +FNDA:18496,_ZN6evmone3rlp12encode_tupleIJmmN4intx4uintILj256EEES4_mSt17basic_string_viewIhN4evmc11byte_traitsIhEEES4_NSt7__cxx1112basic_stringIhS8_SaIhEEESt6vectorISt4pairINS6_7addressESE_INS6_7bytes32ESaISH_EEESaISK_EES4_SJ_hS4_S4_EEESD_DpRKT_ +FNDA:2583,_ZN6evmone3rlp12encode_tupleIJmmN4intx4uintILj256EEES4_mSt17basic_string_viewIhN4evmc11byte_traitsIhEEES4_NSt7__cxx1112basic_stringIhS8_SaIhEEESt6vectorISt4pairINS6_7addressESE_INS6_7bytes32ESaISH_EEESaISK_EESE_INS_5state13AuthorizationESaISO_EEhS4_S4_EEESD_DpRKT_ +FNDA:2583,_ZN6evmone3rlp6encodeINS_5state13AuthorizationEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISC_EE +FNDA:2583,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKNS_5state13AuthorizationESt6vectorIS6_SaIS6_EEEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SK_ +FNDA:43535,_ZN6evmone3rlp6encodeINS_5state13AuthorizationEEEDTcl10rlp_encodeclsr3stdE7declvalIT_EEEERKS4_ +FNDA:0,_ZN6evmone3rlp12encode_tupleIJmmN4intx4uintILj256EEES4_mSt17basic_string_viewIhN4evmc11byte_traitsIhEEES4_NSt7__cxx1112basic_stringIhS8_SaIhEEESt6vectorISt4pairINS6_7addressESE_INS6_7bytes32ESaISH_EEESaISK_EESE_ISD_SaISD_EEhS4_S4_EEESD_DpRKT_ +FNDA:0,_ZN6evmone3rlp6encodeINSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEEEES8_RKSt6vectorIT_SaISA_EE +FNDA:0,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEESt6vectorISB_SaISB_EEEEEESB_T_SI_ +FNDA:1477,_ZN6evmone3rlp12encode_tupleIJN4evmc7bytes32EmSt17basic_string_viewIhNS2_11byte_traitsIhEEESt6vectorINS_5state3LogESaISA_EEEEENSt7__cxx1112basic_stringIhS6_SaIhEEEDpRKT_ +FNDA:138853,_ZN6evmone3rlp6encodeINS_5state3LogEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISC_EE +FNDA:138853,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKNS_5state3LogESt6vectorIS6_SaIS6_EEEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SK_ +FNDA:27323,_ZN6evmone3rlp6encodeINS_5state3LogEEEDTcl10rlp_encodeclsr3stdE7declvalIT_EEEERKS4_ +FNDA:78571,_ZN6evmone3rlp12encode_tupleIJbmSt17basic_string_viewIhN4evmc11byte_traitsIhEEESt6vectorINS_5state3LogESaIS9_EEEEENSt7__cxx1112basic_stringIhS5_SaIhEEEDpRKT_ +FNDA:43535,_ZN6evmone3rlp12encode_tupleIJN4intx4uintILj256EEEN4evmc7addressEmS4_S4_S4_EEENSt7__cxx1112basic_stringIhNS5_11byte_traitsIhEESaIhEEEDpRKT_ +FNDA:0,_ZN6evmone3rlp6encodeINS_5state11TransactionEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEERKSt6vectorIT_SaISC_EE +FNDA:0,_ZN6evmone3rlp8internal16encode_containerIN9__gnu_cxx17__normal_iteratorIPKNS_5state11TransactionESt6vectorIS6_SaIS6_EEEEEENSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEET_SK_ +FNF:12 +FNH:11 +DA:24,93393946 +DA:25,93393946 +DA:26,93393946 +DA:27,93393946 +DA:29,93393946 +DA:30,67589737 +DA:31,25804209 +DA:32,24874072 +DA:33,930137 +DA:34,929759 +DA:35,378 +DA:36,378 +DA:37,93393946 +DA:40,26692515 +DA:41,26692515 +DA:42,26692515 +DA:49,21857154 +DA:50,21857154 +DA:51,21857154 +DA:52,21857154 +DA:56,319719 +DA:57,319719 +DA:58,319719 +DA:61,81939060 +DA:62,81939060 +DA:63,81939060 +DA:64,15237629 +DA:66,66701431 +DA:67,81939060 +DA:70,5987792 +DA:71,5987792 +DA:72,5987792 +DA:73,5987792 +DA:74,5987792 +DA:77,5961786 +DA:78,5961786 +DA:79,5961786 +DA:80,5961786 +DA:81,5961786 +DA:85,363050 +DA:86,363050 +DA:87,363050 +DA:91,0 +DA:92,0 +DA:93,0 +DA:98,5548777 +DA:99,5548777 +DA:100,5548777 +DA:105,144888 +DA:106,144888 +DA:107,144888 +DA:117,363050 +DA:118,363050 +DA:119,787335 +DA:120,424285 +DA:121,363050 +DA:122,363050 +BRDA:29,0,0,6308228 +BRDA:29,0,1,20384287 +BRDA:29,1,2,61281509 +BRDA:29,1,3,5419922 +BRDA:31,0,0,19660371 +BRDA:31,0,1,723916 +BRDA:31,1,2,5213701 +BRDA:31,1,3,206221 +BRDA:33,0,0,723653 +BRDA:33,0,1,263 +BRDA:33,1,2,206106 +BRDA:33,1,3,115 +BRDA:63,0,0,15409821 +BRDA:63,0,1,66529239 +BRDA:63,1,2,15237629 +BRDA:63,1,3,172192 +BRDA:119,0,0,- +BRDA:119,0,1,- +BRDA:119,1,2,27323 +BRDA:119,1,3,138853 +BRDA:119,2,4,- +BRDA:119,2,5,- +BRDA:119,3,6,43535 +BRDA:119,3,7,2583 +BRDA:119,4,8,144888 +BRDA:119,4,9,30907 +BRDA:119,5,10,208539 +BRDA:119,5,11,190707 +BRDA:119,6,12,- +BRDA:119,6,13,- +BRDA:119,7,14,- +BRDA:119,7,15,- +BRDA:119,8,16,- +BRDA:119,8,17,- +BRDA:119,9,18,- +BRDA:119,9,19,- +BRF:12 +BRH:12 +LF:57 +LH:54 +end_of_record +SF:/home/builder/project/test/state/state.cpp +FN:212,_ZNK6evmone5state5State10build_diffE13evmc_revision +FN:252,_ZN6evmone5state5State6insertERKN4evmc7addressENS0_7AccountE +FN:259,_ZN6evmone5state5State4findERKN4evmc7addressE +FN:273,_ZN6evmone5state5State3getERKN4evmc7addressE +FN:280,_ZN6evmone5state5State13get_or_insertERKN4evmc7addressENS0_7AccountE +FN:287,_ZN6evmone5state5State8get_codeERKN4evmc7addressE +FN:299,_ZN6evmone5state5State5touchERKN4evmc7addressE +FN:310,_ZN6evmone5state5State11get_storageERKN4evmc7addressERKNS2_7bytes32E +FN:323,_ZN6evmone5state5State22journal_balance_changeERKN4evmc7addressERKN4intx4uintILj256EEE +FN:329,_ZN6evmone5state5State22journal_storage_changeERKN4evmc7addressERKNS2_7bytes32ERKNS0_12StorageValueE +FN:335,_ZN6evmone5state5State32journal_transient_storage_changeERKN4evmc7addressERKNS2_7bytes32ES8_ +FN:340,_ZN6evmone5state5State18journal_bump_nonceERKN4evmc7addressE +FN:345,_ZN6evmone5state5State14journal_createERKN4evmc7addressEb +FN:350,_ZN6evmone5state5State16journal_destructERKN4evmc7addressE +FN:355,_ZN6evmone5state5State22journal_access_accountERKN4evmc7addressE +FN:360,_ZN6evmone5state5State8rollbackEm +FN:432,_ZN6evmone5state20validate_transactionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11TransactionE13evmc_revisionll +FN:561,_ZN6evmone5state8finalizeERKNS0_9StateViewE13evmc_revisionRKN4evmc7addressESt8optionalImESt4spanIKNS0_5OmmerELm18446744073709551615EESB_IKNS0_10WithdrawalELm18446744073709551615EE +FN:588,_ZN6evmone5state10transitionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11BlockHashesERKNS0_11TransactionE13evmc_revisionRN4evmc2VMERKNS0_21TransactionPropertiesE +FN:364,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalBalanceChangeEEEDaRKT_ +FN:364,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_14JournalTouchedEEEDaRKT_ +FN:364,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalStorageChangeEEEDaRKT_ +FN:364,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_16JournalNonceBumpEEEDaRKT_ +FN:364,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_13JournalCreateEEEDaRKT_ +FN:364,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_29JournalTransientStorageChangeEEEDaRKT_ +FN:364,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_15JournalDestructEEEDaRKT_ +FN:364,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalAccessAccountEEEDaRKT_ +FN:449,state.cpp:_ZZN6evmone5state20validate_transactionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11TransactionE13evmc_revisionllENK3$_0clIN4evmc7bytes32EEEDaRKT_ +FN:472,state.cpp:_ZZN6evmone5state20validate_transactionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11TransactionE13evmc_revisionllENK3$_1clERKNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEE +FN:474,state.cpp:_ZZN6evmone5state20validate_transactionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11TransactionE13evmc_revisionllENK3$_2clERKNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEE +FN:71,state.cpp:_ZN6evmone5state12_GLOBAL__N_125compute_tx_intrinsic_costE13evmc_revisionRKNS0_11TransactionE +FN:36,state.cpp:_ZN6evmone5state12_GLOBAL__N_122compute_tx_data_tokensE13evmc_revisionSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:45,state.cpp:_ZN6evmone5state12_GLOBAL__N_126compute_tx_initcode_tokensE13evmc_revisionSt4spanIKNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEELm18446744073709551615EE +FN:53,state.cpp:_ZN6evmone5state12_GLOBAL__N_124compute_access_list_costERKSt6vectorISt4pairIN4evmc7addressES2_INS4_7bytes32ESaIS6_EEESaIS9_EE +FN:31,state.cpp:_ZN6evmone5state12_GLOBAL__N_19num_wordsEm +FN:108,state.cpp:_ZN6evmone5state12_GLOBAL__N_126process_authorization_listERNS0_5StateEmRKSt6vectorINS0_13AuthorizationESaIS5_EE +FN:190,state.cpp:_ZN6evmone5state12_GLOBAL__N_113build_messageERKNS0_11TransactionEl +FNDA:435571,_ZNK6evmone5state5State10build_diffE13evmc_revision +FNDA:1121639,_ZN6evmone5state5State6insertERKN4evmc7addressENS0_7AccountE +FNDA:54839836,_ZN6evmone5state5State4findERKN4evmc7addressE +FNDA:32751753,_ZN6evmone5state5State3getERKN4evmc7addressE +FNDA:9810947,_ZN6evmone5state5State13get_or_insertERKN4evmc7addressENS0_7AccountE +FNDA:5512368,_ZN6evmone5state5State8get_codeERKN4evmc7addressE +FNDA:4522900,_ZN6evmone5state5State5touchERKN4evmc7addressE +FNDA:10936142,_ZN6evmone5state5State11get_storageERKN4evmc7addressERKNS2_7bytes32E +FNDA:435884,_ZN6evmone5state5State22journal_balance_changeERKN4evmc7addressERKN4intx4uintILj256EEE +FNDA:5450148,_ZN6evmone5state5State22journal_storage_changeERKN4evmc7addressERKNS2_7bytes32ERKNS0_12StorageValueE +FNDA:9079194,_ZN6evmone5state5State32journal_transient_storage_changeERKN4evmc7addressERKNS2_7bytes32ES8_ +FNDA:46375,_ZN6evmone5state5State18journal_bump_nonceERKN4evmc7addressE +FNDA:89632,_ZN6evmone5state5State14journal_createERKN4evmc7addressEb +FNDA:4142,_ZN6evmone5state5State16journal_destructERKN4evmc7addressE +FNDA:583383,_ZN6evmone5state5State22journal_access_accountERKN4evmc7addressE +FNDA:2406362,_ZN6evmone5state5State8rollbackEm +FNDA:143544,_ZN6evmone5state20validate_transactionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11TransactionE13evmc_revisionll +FNDA:138754,_ZN6evmone5state8finalizeERKNS0_9StateViewE13evmc_revisionRKN4evmc7addressESt8optionalImESt4spanIKNS0_5OmmerELm18446744073709551615EESB_IKNS0_10WithdrawalELm18446744073709551615EE +FNDA:136939,_ZN6evmone5state10transitionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11BlockHashesERKNS0_11TransactionE13evmc_revisionRN4evmc2VMERKNS0_21TransactionPropertiesE +FNDA:32070,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalBalanceChangeEEEDaRKT_ +FNDA:0,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_14JournalTouchedEEEDaRKT_ +FNDA:1189061,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalStorageChangeEEEDaRKT_ +FNDA:6080,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_16JournalNonceBumpEEEDaRKT_ +FNDA:10011,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_13JournalCreateEEEDaRKT_ +FNDA:9067478,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_29JournalTransientStorageChangeEEEDaRKT_ +FNDA:72,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_15JournalDestructEEEDaRKT_ +FNDA:14260,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalAccessAccountEEEDaRKT_ +FNDA:41656,state.cpp:_ZZN6evmone5state20validate_transactionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11TransactionE13evmc_revisionllENK3$_0clIN4evmc7bytes32EEEDaRKT_ +FNDA:0,state.cpp:_ZZN6evmone5state20validate_transactionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11TransactionE13evmc_revisionllENK3$_1clERKNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEE +FNDA:0,state.cpp:_ZZN6evmone5state20validate_transactionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11TransactionE13evmc_revisionllENK3$_2clERKNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEE +FNDA:141305,state.cpp:_ZN6evmone5state12_GLOBAL__N_125compute_tx_intrinsic_costE13evmc_revisionRKNS0_11TransactionE +FNDA:141305,state.cpp:_ZN6evmone5state12_GLOBAL__N_122compute_tx_data_tokensE13evmc_revisionSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:141305,state.cpp:_ZN6evmone5state12_GLOBAL__N_126compute_tx_initcode_tokensE13evmc_revisionSt4spanIKNSt7__cxx1112basic_stringIhN4evmc11byte_traitsIhEESaIhEEELm18446744073709551615EE +FNDA:141305,state.cpp:_ZN6evmone5state12_GLOBAL__N_124compute_access_list_costERKSt6vectorISt4pairIN4evmc7addressES2_INS4_7bytes32ESaIS6_EEESaIS9_EE +FNDA:38815,state.cpp:_ZN6evmone5state12_GLOBAL__N_19num_wordsEm +FNDA:136939,state.cpp:_ZN6evmone5state12_GLOBAL__N_126process_authorization_listERNS0_5StateEmRKSt6vectorINS0_13AuthorizationESaIS5_EE +FNDA:136939,state.cpp:_ZN6evmone5state12_GLOBAL__N_113build_messageERKNS0_11TransactionEl +FNF:30 +FNH:28 +DA:31,38815 +DA:32,38815 +DA:33,38815 +DA:36,141305 +DA:37,141305 +DA:38,141305 +DA:40,141305 +DA:41,141305 +DA:42,141305 +DA:45,141305 +DA:46,141305 +DA:47,141305 +DA:48,0 +DA:49,141305 +DA:50,141305 +DA:53,141305 +DA:54,141305 +DA:55,141305 +DA:57,141305 +DA:58,141305 +DA:59,164915 +DA:60,141305 +DA:61,141305 +DA:71,141305 +DA:72,141305 +DA:73,141305 +DA:74,141305 +DA:75,141305 +DA:76,141305 +DA:78,141305 +DA:80,141305 +DA:82,141305 +DA:83,141305 +DA:84,141305 +DA:85,141305 +DA:86,141305 +DA:88,141305 +DA:90,141305 +DA:91,141305 +DA:93,141305 +DA:94,141305 +DA:96,141305 +DA:97,141305 +DA:100,141305 +DA:101,141305 +DA:103,141305 +DA:104,141305 +DA:108,136939 +DA:109,136939 +DA:110,136939 +DA:111,37724 +DA:113,37724 +DA:114,56 +DA:117,37668 +DA:118,8 +DA:122,37660 +DA:123,68 +DA:126,37592 +DA:127,12 +DA:131,37580 +DA:134,37580 +DA:137,37580 +DA:138,37580 +DA:139,64 +DA:143,37516 +DA:144,5522 +DA:152,31994 +DA:153,16016 +DA:154,16016 +DA:155,16016 +DA:156,16016 +DA:157,16016 +DA:161,31994 +DA:162,128 +DA:163,128 +DA:164,44 +DA:165,44 +DA:166,44 +DA:167,44 +DA:168,44 +DA:169,128 +DA:171,31866 +DA:172,31866 +DA:173,31866 +DA:174,31866 +DA:175,26570 +DA:177,26570 +DA:178,26570 +DA:179,26570 +DA:180,26570 +DA:181,31866 +DA:184,31994 +DA:185,31994 +DA:186,136939 +DA:187,136939 +DA:190,136939 +DA:191,136939 +DA:193,136939 +DA:194,136939 +DA:195,136939 +DA:196,136939 +DA:197,136939 +DA:198,136939 +DA:199,136939 +DA:200,136939 +DA:201,136939 +DA:202,136939 +DA:203,136939 +DA:204,136939 +DA:205,136939 +DA:206,136939 +DA:207,136939 +DA:208,136939 +DA:212,435571 +DA:213,435571 +DA:214,435571 +DA:215,1121384 +DA:216,1121384 +DA:217,4070 +DA:220,4070 +DA:221,4070 +DA:222,4070 +DA:223,1117314 +DA:224,284999 +DA:225,284999 +DA:226,277961 +DA:227,284999 +DA:228,284999 +DA:235,832315 +DA:239,832315 +DA:240,47469 +DA:242,832315 +DA:243,1784184 +DA:244,1784184 +DA:245,490754 +DA:246,1784184 +DA:247,832315 +DA:248,435571 +DA:249,435571 +DA:252,1121639 +DA:253,1121639 +DA:254,1121639 +DA:255,1121639 +DA:256,1121639 +DA:259,54839836 +DA:262,54839836 +DA:263,51707313 +DA:264,3132523 +DA:265,712983 +DA:266,712983 +DA:267,712983 +DA:268,712983 +DA:269,2419540 +DA:270,3132523 +DA:273,32751753 +DA:274,32751753 +DA:275,32751753 +DA:276,32751753 +DA:277,32751753 +DA:280,9810947 +DA:281,9810947 +DA:282,9407127 +DA:283,403820 +DA:284,9810947 +DA:287,5512368 +DA:288,5512368 +DA:289,5512368 +DA:290,72 +DA:291,5512296 +DA:292,1469650 +DA:293,4042646 +DA:294,262325 +DA:295,4042646 +DA:296,5512296 +DA:299,4522900 +DA:300,4522900 +DA:301,4522900 +DA:302,0 +DA:303,0 +DA:304,0 +DA:305,0 +DA:306,4522900 +DA:307,4522900 +DA:310,10936142 +DA:312,10936142 +DA:313,10936142 +DA:314,10936142 +DA:315,1856314 +DA:316,1856314 +DA:317,1856314 +DA:318,1856314 +DA:319,10936142 +DA:320,10936142 +DA:323,435884 +DA:324,435884 +DA:325,435884 +DA:329,5450148 +DA:330,5450148 +DA:331,5450148 +DA:335,9079194 +DA:336,9079194 +DA:337,9079194 +DA:340,46375 +DA:341,46375 +DA:342,46375 +DA:345,89632 +DA:346,89632 +DA:347,89632 +DA:350,4142 +DA:351,4142 +DA:352,4142 +DA:355,583383 +DA:356,583383 +DA:357,583383 +DA:360,2406362 +DA:361,12725394 +DA:362,10319032 +DA:363,10319032 +DA:364,10319032 +DA:365,10319032 +DA:367,6080 +DA:368,6080 +DA:371,0 +DA:372,0 +DA:375,72 +DA:376,72 +DA:379,14260 +DA:380,14260 +DA:383,10011 +DA:384,10011 +DA:385,9768 +DA:387,9768 +DA:388,9768 +DA:389,9768 +DA:390,9768 +DA:391,9768 +DA:392,243 +DA:393,243 +DA:398,243 +DA:399,243 +DA:402,1189061 +DA:403,1189061 +DA:404,1189061 +DA:405,1189061 +DA:408,9067478 +DA:409,9067478 +DA:410,9067478 +DA:413,32070 +DA:414,32070 +DA:421,10319032 +DA:422,10319032 +DA:423,10319032 +DA:424,10319032 +DA:425,2406362 +DA:432,143544 +DA:433,143544 +DA:434,143544 +DA:435,13187 +DA:436,13187 +DA:437,4 +DA:438,13183 +DA:439,6 +DA:440,13177 +DA:441,12 +DA:442,13165 +DA:443,11 +DA:445,13165 +DA:446,13154 +DA:447,12 +DA:449,41656 +DA:450,42 +DA:451,13100 +DA:452,119 +DA:453,12981 +DA:455,12981 +DA:456,2598 +DA:457,4 +DA:458,2594 +DA:459,4 +DA:460,2590 +DA:461,4 +DA:462,2586 +DA:464,2586 +DA:465,0 +DA:466,0 +DA:467,0 +DA:468,0 +DA:469,0 +DA:470,0 +DA:471,0 +DA:472,0 +DA:473,0 +DA:474,0 +DA:475,0 +DA:476,0 +DA:478,127759 +DA:479,143544 +DA:481,143326 +DA:482,143326 +DA:483,0 +DA:484,2586 +DA:485,15567 +DA:486,20473 +DA:487,20473 +DA:488,0 +DA:490,20473 +DA:491,10 +DA:492,20463 +DA:494,26703 +DA:495,26703 +DA:496,0 +DA:497,26703 +DA:499,143316 +DA:500,143326 +DA:502,143326 +DA:504,143316 +DA:505,21 +DA:507,143295 +DA:508,7 +DA:510,143288 +DA:511,28 +DA:515,143260 +DA:516,143260 +DA:518,143260 +DA:519,143260 +DA:520,74 +DA:522,143186 +DA:523,12 +DA:525,143174 +DA:526,12 +DA:528,143162 +DA:529,2 +DA:532,143160 +DA:533,22 +DA:538,143138 +DA:539,143138 +DA:541,143138 +DA:542,12961 +DA:543,12961 +DA:545,12961 +DA:546,12961 +DA:547,143138 +DA:548,1833 +DA:550,141305 +DA:551,141305 +DA:552,4366 +DA:554,136939 +DA:555,136939 +DA:556,141305 +DA:561,138754 +DA:562,138754 +DA:564,138754 +DA:565,68948 +DA:566,68948 +DA:567,68948 +DA:568,68948 +DA:569,68948 +DA:571,68948 +DA:572,68948 +DA:573,0 +DA:574,0 +DA:575,0 +DA:576,0 +DA:577,68948 +DA:579,138754 +DA:580,4030 +DA:582,138754 +DA:583,138754 +DA:588,136939 +DA:589,136939 +DA:591,136939 +DA:592,136939 +DA:593,136939 +DA:595,136939 +DA:596,136939 +DA:598,136939 +DA:599,136939 +DA:600,136939 +DA:601,136939 +DA:602,136939 +DA:603,136939 +DA:605,136939 +DA:606,136939 +DA:608,136939 +DA:610,136939 +DA:611,11614 +DA:614,11614 +DA:615,11614 +DA:616,11614 +DA:617,11614 +DA:618,11614 +DA:619,11614 +DA:621,136939 +DA:623,136939 +DA:624,136939 +DA:625,98352 +DA:626,136939 +DA:627,114025 +DA:628,114025 +DA:629,114025 +DA:630,70326 +DA:631,114025 +DA:635,136939 +DA:636,121859 +DA:638,136939 +DA:639,136939 +DA:640,98352 +DA:641,98352 +DA:642,532 +DA:643,532 +DA:644,532 +DA:645,532 +DA:646,532 +DA:647,98352 +DA:649,136939 +DA:651,136939 +DA:653,136939 +DA:654,136939 +DA:655,136939 +DA:656,136939 +DA:657,136939 +DA:660,136939 +DA:662,136939 +DA:663,136939 +DA:666,136939 +DA:667,136939 +DA:670,136939 +DA:672,136939 +DA:673,136939 +BRDA:40,0,0,136453 +BRDA:40,0,1,4852 +BRDA:47,0,0,0 +BRDA:47,0,1,141305 +BRDA:58,0,0,164915 +BRDA:58,0,1,141305 +BRDA:80,0,0,38827 +BRDA:80,0,1,102478 +BRDA:80,1,2,38824 +BRDA:80,1,3,3 +BRDA:94,0,0,38827 +BRDA:94,0,1,102478 +BRDA:94,1,2,38815 +BRDA:94,1,3,12 +BRDA:101,0,0,85490 +BRDA:101,0,1,55815 +BRDA:110,0,0,37724 +BRDA:110,0,1,136939 +BRDA:113,0,0,56 +BRDA:113,0,1,37668 +BRDA:113,1,2,196 +BRDA:113,1,3,37528 +BRDA:113,2,4,56 +BRDA:113,2,5,140 +BRDA:117,0,0,8 +BRDA:117,0,1,37660 +BRDA:122,0,0,68 +BRDA:122,0,1,37592 +BRDA:126,0,0,12 +BRDA:126,0,1,37580 +BRDA:137,0,0,10850 +BRDA:137,0,1,26730 +BRDA:138,0,0,64 +BRDA:138,0,1,10786 +BRDA:143,0,0,5522 +BRDA:143,0,1,31994 +BRDA:152,0,0,16016 +BRDA:152,0,1,15978 +BRDA:161,0,0,128 +BRDA:161,0,1,31866 +BRDA:163,0,0,44 +BRDA:163,0,1,84 +BRDA:174,0,0,26570 +BRDA:174,0,1,5296 +BRDA:191,0,0,98352 +BRDA:191,0,1,38587 +BRDA:194,0,0,98352 +BRDA:194,0,1,38587 +BRDA:214,0,0,1121384 +BRDA:214,0,1,435571 +BRDA:216,0,0,4070 +BRDA:216,0,1,1117314 +BRDA:223,0,0,400196 +BRDA:223,0,1,717118 +BRDA:223,1,2,399562 +BRDA:223,1,3,634 +BRDA:223,2,4,284999 +BRDA:223,2,5,114563 +BRDA:225,0,0,277961 +BRDA:225,0,1,7038 +BRDA:239,0,0,47469 +BRDA:239,0,1,784846 +BRDA:242,0,0,1784184 +BRDA:242,0,1,832315 +BRDA:244,0,0,490754 +BRDA:244,0,1,1293430 +BRDA:262,0,0,51707313 +BRDA:262,0,1,3132523 +BRDA:264,0,0,712983 +BRDA:264,0,1,2419540 +BRDA:281,0,0,9407127 +BRDA:281,0,1,403820 +BRDA:289,0,0,72 +BRDA:289,0,1,5512296 +BRDA:291,0,0,1469650 +BRDA:291,0,1,4042646 +BRDA:293,0,0,262325 +BRDA:293,0,1,3780321 +BRDA:301,0,0,1902812 +BRDA:301,0,1,2620088 +BRDA:301,1,2,0 +BRDA:301,1,3,1902812 +BRDA:314,0,0,1856314 +BRDA:314,0,1,9079828 +BRDA:361,0,0,10319032 +BRDA:361,0,1,2406362 +BRDA:384,0,0,9768 +BRDA:384,0,1,243 +BRDA:435,0,0,13187 +BRDA:435,0,1,130357 +BRDA:436,0,0,4 +BRDA:436,0,1,13183 +BRDA:438,0,0,6 +BRDA:438,0,1,13177 +BRDA:440,0,0,12 +BRDA:440,0,1,13165 +BRDA:442,0,0,5086 +BRDA:442,0,1,8079 +BRDA:442,1,2,11 +BRDA:442,1,3,5075 +BRDA:446,0,0,12 +BRDA:446,0,1,13142 +BRDA:449,0,0,42 +BRDA:449,0,1,13100 +BRDA:451,0,0,119 +BRDA:451,0,1,12981 +BRDA:455,0,0,2598 +BRDA:455,0,1,140946 +BRDA:456,0,0,4 +BRDA:456,0,1,2594 +BRDA:458,0,0,4 +BRDA:458,0,1,2590 +BRDA:460,0,0,4 +BRDA:460,0,1,2586 +BRDA:464,0,0,0 +BRDA:464,0,1,143544 +BRDA:465,0,0,- +BRDA:465,0,1,- +BRDA:467,0,0,- +BRDA:467,0,1,- +BRDA:469,0,0,- +BRDA:469,0,1,- +BRDA:471,0,0,- +BRDA:471,0,1,- +BRDA:474,0,0,- +BRDA:474,0,1,- +BRDA:478,0,0,127759 +BRDA:478,0,1,15785 +BRDA:481,0,0,143326 +BRDA:481,0,1,0 +BRDA:483,0,0,0 +BRDA:483,0,1,143326 +BRDA:484,0,0,2586 +BRDA:484,0,1,140740 +BRDA:485,0,0,12981 +BRDA:485,0,1,130345 +BRDA:486,0,0,4906 +BRDA:486,0,1,138420 +BRDA:487,0,0,0 +BRDA:487,0,1,20473 +BRDA:490,0,0,10 +BRDA:490,0,1,20463 +BRDA:494,0,0,6240 +BRDA:494,0,1,137086 +BRDA:495,0,0,0 +BRDA:495,0,1,26703 +BRDA:499,0,0,116613 +BRDA:499,0,1,26713 +BRDA:504,0,0,43728 +BRDA:504,0,1,99588 +BRDA:504,1,2,21 +BRDA:504,1,3,43707 +BRDA:507,0,0,7 +BRDA:507,0,1,143288 +BRDA:510,0,0,28 +BRDA:510,0,1,143260 +BRDA:518,0,0,120 +BRDA:518,0,1,143140 +BRDA:518,1,2,74 +BRDA:518,1,3,143186 +BRDA:519,0,0,74 +BRDA:519,0,1,46 +BRDA:522,0,0,12 +BRDA:522,0,1,143174 +BRDA:525,0,0,12 +BRDA:525,0,1,143162 +BRDA:528,0,0,2 +BRDA:528,0,1,143160 +BRDA:532,0,0,126748 +BRDA:532,0,1,16412 +BRDA:532,1,2,39077 +BRDA:532,1,3,87671 +BRDA:532,2,4,22 +BRDA:532,2,5,39055 +BRDA:541,0,0,12961 +BRDA:541,0,1,130177 +BRDA:547,0,0,1833 +BRDA:547,0,1,141305 +BRDA:551,0,0,4366 +BRDA:551,0,1,136939 +BRDA:564,0,0,68948 +BRDA:564,0,1,69806 +BRDA:572,0,0,0 +BRDA:572,0,1,68948 +BRDA:579,0,0,4030 +BRDA:579,0,1,138754 +BRDA:598,0,0,127595 +BRDA:598,0,1,9344 +BRDA:610,0,0,11614 +BRDA:610,0,1,125325 +BRDA:624,0,0,98352 +BRDA:624,0,1,38587 +BRDA:626,0,0,114025 +BRDA:626,0,1,136939 +BRDA:629,0,0,70326 +BRDA:629,0,1,114025 +BRDA:635,0,0,121859 +BRDA:635,0,1,15080 +BRDA:639,0,0,98352 +BRDA:639,0,1,38587 +BRDA:641,0,0,532 +BRDA:641,0,1,97820 +BRDA:653,0,0,127595 +BRDA:653,0,1,9344 +BRF:204 +BRH:186 +LF:465 +LH:439 +end_of_record +SF:/home/builder/project/test/state/state.hpp +FN:77,_ZN6evmone5state5StateC2ERKNS0_9StateViewE +FN:103,_ZNK6evmone5state5State10checkpointEv +FNDA:435587,_ZN6evmone5state5StateC2ERKNS0_9StateViewE +FNDA:4304779,_ZNK6evmone5state5State10checkpointEv +FNF:2 +FNH:2 +DA:77,435587 +DA:103,4304779 +BRF:0 +BRH:0 +LF:2 +LH:2 +end_of_record +SF:/home/builder/project/test/state/state_view.hpp +FN:28,_ZN6evmone5state9StateViewD2Ev +FN:39,_ZN6evmone5state11BlockHashesD2Ev +FNDA:1457907,_ZN6evmone5state9StateViewD2Ev +FNDA:321588,_ZN6evmone5state11BlockHashesD2Ev +FNF:2 +FNH:2 +DA:28,1457907 +DA:39,321588 +BRF:0 +BRH:0 +LF:2 +LH:2 +end_of_record +SF:/home/builder/project/test/state/system_contracts.cpp +FN:87,_ZN6evmone5state23system_call_block_startERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11BlockHashesE13evmc_revisionRN4evmc2VME +FN:111,_ZN6evmone5state21system_call_block_endERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11BlockHashesE13evmc_revisionRN4evmc2VME +FN:36,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_1clERKNS0_9BlockInfoERKNS0_11BlockHashesE +FN:40,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_2clERKNS0_9BlockInfoERKNS0_11BlockHashesE +FN:69,system_contracts.cpp:_ZN6evmone5state12_GLOBAL__N_119execute_system_callERNS0_5StateERKNS0_9BlockInfoERKNS0_11BlockHashesE13evmc_revisionRN4evmc2VMERKNSB_7addressESt17basic_string_viewIhNSB_11byte_traitsIhEEESK_ +FN:59,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_0clINS1_21StorageSystemContractES4_EEDaRKT_RKT0_ +FN:59,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_0clINS1_22RequestsSystemContractES4_EEDaRKT_RKT0_ +FNDA:79949,_ZN6evmone5state23system_call_block_startERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11BlockHashesE13evmc_revisionRN4evmc2VME +FNDA:79945,_ZN6evmone5state21system_call_block_endERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11BlockHashesE13evmc_revisionRN4evmc2VME +FNDA:64614,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_1clERKNS0_9BlockInfoERKNS0_11BlockHashesE +FNDA:45458,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_2clERKNS0_9BlockInfoERKNS0_11BlockHashesE +FNDA:200980,system_contracts.cpp:_ZN6evmone5state12_GLOBAL__N_119execute_system_callERNS0_5StateERKNS0_9BlockInfoERKNS0_11BlockHashesE13evmc_revisionRN4evmc2VMERKNSB_7addressESt17basic_string_viewIhNSB_11byte_traitsIhEEESK_ +FNDA:0,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_0clINS1_21StorageSystemContractES4_EEDaRKT_RKT0_ +FNDA:0,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_0clINS1_22RequestsSystemContractES4_EEDaRKT_RKT0_ +FNF:6 +FNH:5 +DA:36,64614 +DA:37,64614 +DA:38,64614 +DA:40,45458 +DA:41,45458 +DA:42,45458 +DA:59,0 +DA:69,200980 +DA:70,200980 +DA:71,200980 +DA:72,200980 +DA:73,200980 +DA:74,200980 +DA:75,200980 +DA:76,200980 +DA:77,200980 +DA:79,200980 +DA:80,200980 +DA:81,200980 +DA:82,200980 +DA:87,79949 +DA:88,79949 +DA:89,79949 +DA:90,144565 +DA:91,144565 +DA:92,34485 +DA:96,110080 +DA:97,110080 +DA:98,8 +DA:100,110072 +DA:101,110072 +DA:102,110072 +DA:103,110072 +DA:104,110072 +DA:106,79949 +DA:107,79949 +DA:111,79945 +DA:112,79945 +DA:113,79945 +DA:114,79945 +DA:115,125397 +DA:116,125397 +DA:117,34485 +DA:119,90912 +DA:120,90912 +DA:121,4 +DA:123,90908 +DA:124,90908 +DA:125,12 +DA:126,90896 +DA:127,90896 +DA:128,79929 +DA:129,79945 +BRDA:89,0,0,144565 +BRDA:89,0,1,45464 +BRDA:91,0,0,34485 +BRDA:91,0,1,110080 +BRDA:97,0,0,8 +BRDA:97,0,1,110072 +BRDA:114,0,0,125397 +BRDA:114,0,1,45444 +BRDA:116,0,0,34485 +BRDA:116,0,1,90912 +BRDA:120,0,0,4 +BRDA:120,0,1,90908 +BRDA:124,0,0,12 +BRDA:124,0,1,90896 +BRF:14 +BRH:14 +LF:53 +LH:52 +end_of_record +SF:/home/builder/project/test/state/test_state.cpp +FN:11,_ZNK6evmone4test9TestState11get_accountERKN4evmc7addressE +FN:22,_ZNK6evmone4test9TestState16get_account_codeB5cxx11ERKN4evmc7addressE +FN:31,_ZN6evmone4test9TestState5applyERKNS_5state9StateDiffE +FN:53,_ZNK6evmone4test9TestState11get_storageERKN4evmc7addressERKNS2_7bytes32E +FN:63,_ZNK6evmone4test15TestBlockHashes14get_block_hashEl +FN:77,_ZN6evmone4test10transitionERNS0_9TestStateERKNS_5state9BlockInfoERKNS3_11BlockHashesERKNS3_11TransactionE13evmc_revisionRN4evmc2VMEll +FN:92,_ZN6evmone4test8finalizeERNS0_9TestStateE13evmc_revisionRKN4evmc7addressESt8optionalImESt4spanIKNS_5state5OmmerELm18446744073709551615EESA_IKNSB_10WithdrawalELm18446744073709551615EE +FN:99,_ZN6evmone4test23system_call_block_startERNS0_9TestStateERKNS_5state9BlockInfoERKNS3_11BlockHashesE13evmc_revisionRN4evmc2VME +FN:107,_ZN6evmone4test21system_call_block_endERNS0_9TestStateERKNS_5state9BlockInfoERKNS3_11BlockHashesE13evmc_revisionRN4evmc2VME +FNDA:3275783,_ZNK6evmone4test9TestState11get_accountERKN4evmc7addressE +FNDA:463437,_ZNK6evmone4test9TestState16get_account_codeB5cxx11ERKN4evmc7addressE +FNDA:435571,_ZN6evmone4test9TestState5applyERKNS_5state9StateDiffE +FNDA:1856314,_ZNK6evmone4test9TestState11get_storageERKN4evmc7addressERKNS2_7bytes32E +FNDA:115105,_ZNK6evmone4test15TestBlockHashes14get_block_hashEl +FNDA:143544,_ZN6evmone4test10transitionERNS0_9TestStateERKNS_5state9BlockInfoERKNS3_11BlockHashesERKNS3_11TransactionE13evmc_revisionRN4evmc2VMEll +FNDA:138754,_ZN6evmone4test8finalizeERNS0_9TestStateE13evmc_revisionRKN4evmc7addressESt8optionalImESt4spanIKNS_5state5OmmerELm18446744073709551615EESA_IKNSB_10WithdrawalELm18446744073709551615EE +FNDA:79949,_ZN6evmone4test23system_call_block_startERNS0_9TestStateERKNS_5state9BlockInfoERKNS3_11BlockHashesE13evmc_revisionRN4evmc2VME +FNDA:79945,_ZN6evmone4test21system_call_block_endERNS0_9TestStateERKNS_5state9BlockInfoERKNS3_11BlockHashesE13evmc_revisionRN4evmc2VME +FNF:9 +FNH:9 +DA:11,3275783 +DA:12,3275783 +DA:13,3275783 +DA:14,2420116 +DA:16,855667 +DA:18,855667 +DA:19,3275783 +DA:22,463437 +DA:23,463437 +DA:24,463437 +DA:25,7 +DA:27,463430 +DA:28,463437 +DA:31,435571 +DA:32,435571 +DA:33,832315 +DA:34,832315 +DA:35,832315 +DA:36,832315 +DA:37,832315 +DA:38,47469 +DA:39,832315 +DA:40,490754 +DA:41,490754 +DA:42,448250 +DA:43,42504 +DA:44,42504 +DA:45,490754 +DA:46,832315 +DA:48,435571 +DA:49,282031 +DA:50,435571 +DA:53,1856314 +DA:54,1856314 +DA:55,1856314 +DA:56,290437 +DA:57,1565877 +DA:58,1565877 +DA:59,1565877 +DA:60,1856314 +DA:63,115105 +DA:64,115105 +DA:65,115105 +DA:69,0 +DA:70,0 +DA:71,115105 +DA:77,143544 +DA:78,143544 +DA:79,143544 +DA:80,143544 +DA:81,6605 +DA:83,136939 +DA:84,136939 +DA:85,136939 +DA:86,136939 +DA:87,143544 +DA:92,138754 +DA:93,138754 +DA:94,138754 +DA:95,138754 +DA:99,79949 +DA:100,79949 +DA:101,79949 +DA:102,79949 +DA:107,79945 +DA:108,79945 +DA:109,79945 +DA:110,16 +DA:111,79929 +DA:112,79929 +DA:113,79945 +BRDA:13,0,0,2420116 +BRDA:13,0,1,855667 +BRDA:24,0,0,7 +BRDA:24,0,1,463430 +BRDA:32,0,0,832315 +BRDA:32,0,1,435571 +BRDA:37,0,0,47469 +BRDA:37,0,1,784846 +BRDA:39,0,0,490754 +BRDA:39,0,1,832315 +BRDA:41,0,0,448250 +BRDA:41,0,1,42504 +BRDA:48,0,0,282031 +BRDA:48,0,1,435571 +BRDA:55,0,0,290437 +BRDA:55,0,1,1565877 +BRDA:59,0,0,141373 +BRDA:59,0,1,1424504 +BRDA:64,0,0,115105 +BRDA:64,0,1,0 +BRDA:80,0,0,6605 +BRDA:80,0,1,136939 +BRDA:109,0,0,16 +BRDA:109,0,1,79929 +BRF:24 +BRH:23 +LF:71 +LH:69 +end_of_record +SF:/home/builder/project/test/state/test_state.hpp +FN:63,_ZN6evmone4test9TestState6insertERKN4evmc7addressEONS0_11TestAccountE +FN:70,_ZN6evmone4test9TestState3getERKN4evmc7addressE +FN:41,_ZNK6evmone4test11TestAccounteqERKS1_ +FNDA:0,_ZN6evmone4test9TestState6insertERKN4evmc7addressEONS0_11TestAccountE +FNDA:0,_ZN6evmone4test9TestState3getERKN4evmc7addressE +FNDA:0,_ZNK6evmone4test11TestAccounteqERKS1_ +FNF:3 +FNH:0 +DA:41,0 +DA:63,0 +DA:70,0 +BRF:0 +BRH:0 +LF:3 +LH:0 +end_of_record +SF:/home/builder/project/test/state/transaction.cpp +FN:13,_ZN6evmone5state10rlp_encodeB5cxx11ERKNS0_3LogE +FN:18,_ZN6evmone5state10rlp_encodeB5cxx11ERKNS0_11TransactionE +FN:86,_ZN6evmone5state10rlp_encodeB5cxx11ERKNS0_18TransactionReceiptE +FN:108,_ZN6evmone5state10rlp_encodeB5cxx11ERKNS0_13AuthorizationE +FNDA:27323,_ZN6evmone5state10rlp_encodeB5cxx11ERKNS0_3LogE +FNDA:164787,_ZN6evmone5state10rlp_encodeB5cxx11ERKNS0_11TransactionE +FNDA:80048,_ZN6evmone5state10rlp_encodeB5cxx11ERKNS0_18TransactionReceiptE +FNDA:43535,_ZN6evmone5state10rlp_encodeB5cxx11ERKNS0_13AuthorizationE +FNF:4 +FNH:4 +DA:13,27323 +DA:14,27323 +DA:15,27323 +DA:18,164787 +DA:20,164787 +DA:23,164787 +DA:24,133880 +DA:26,133880 +DA:27,133880 +DA:28,133880 +DA:29,30907 +DA:30,5075 +DA:33,5075 +DA:34,5075 +DA:35,5075 +DA:36,5075 +DA:37,5075 +DA:38,5075 +DA:39,25832 +DA:40,4753 +DA:44,4753 +DA:45,4753 +DA:46,4753 +DA:47,4753 +DA:48,4753 +DA:49,4753 +DA:50,21079 +DA:51,18496 +DA:55,18496 +DA:56,18496 +DA:57,18496 +DA:58,18496 +DA:59,18496 +DA:60,18496 +DA:61,2583 +DA:62,2583 +DA:66,2583 +DA:67,2583 +DA:68,2583 +DA:69,2583 +DA:70,2583 +DA:71,2583 +DA:72,0 +DA:73,0 +DA:77,0 +DA:78,0 +DA:79,0 +DA:80,0 +DA:81,0 +DA:82,0 +DA:83,164787 +DA:86,80048 +DA:87,80048 +DA:88,1477 +DA:89,1477 +DA:91,1477 +DA:92,1477 +DA:93,1477 +DA:94,1477 +DA:95,78571 +DA:96,78571 +DA:97,78571 +DA:98,65367 +DA:99,78571 +DA:101,78571 +DA:102,78571 +DA:103,78571 +DA:104,78571 +DA:105,80048 +DA:108,43535 +DA:109,43535 +DA:110,43535 +DA:111,43535 +BRDA:23,0,0,133880 +BRDA:23,0,1,30907 +BRDA:27,0,0,95571 +BRDA:27,0,1,38309 +BRDA:29,0,0,5075 +BRDA:29,0,1,25832 +BRDA:36,0,0,4655 +BRDA:36,0,1,420 +BRDA:39,0,0,4753 +BRDA:39,0,1,21079 +BRDA:47,0,0,4559 +BRDA:47,0,1,194 +BRDA:50,0,0,18496 +BRDA:50,0,1,2583 +BRDA:58,0,0,18493 +BRDA:58,0,1,3 +BRDA:61,0,0,2583 +BRDA:61,0,1,0 +BRDA:69,0,0,2581 +BRDA:69,0,1,2 +BRDA:80,0,0,- +BRDA:80,0,1,- +BRDA:87,0,0,1477 +BRDA:87,0,1,78571 +BRDA:97,0,0,65367 +BRDA:97,0,1,13204 +BRF:26 +BRH:23 +LF:73 +LH:65 +end_of_record +SF:/home/builder/project/test/state/transaction.hpp +FN:68,_ZNK6evmone5state11Transaction13blob_gas_usedEv +FNDA:118852,_ZNK6evmone5state11Transaction13blob_gas_usedEv +FNF:1 +FNH:1 +DA:68,118852 +BRF:0 +BRH:0 +LF:1 +LH:1 +end_of_record diff --git a/reports/coverage_eest_osaka/html/control.js b/reports/coverage_eest_osaka/html/control.js new file mode 100644 index 0000000000..5897b005c8 --- /dev/null +++ b/reports/coverage_eest_osaka/html/control.js @@ -0,0 +1,99 @@ + +function next_uncovered(selector, reverse, scroll_selector) { + function visit_element(element) { + element.classList.add("seen"); + element.classList.add("selected"); + + if (!scroll_selector) { + scroll_selector = "tr:has(.selected) td.line-number" + } + + const scroll_to = document.querySelector(scroll_selector); + if (scroll_to) { + scroll_to.scrollIntoView({behavior: "smooth", block: "center", inline: "end"}); + } + } + + function select_one() { + if (!reverse) { + const previously_selected = document.querySelector(".selected"); + + if (previously_selected) { + previously_selected.classList.remove("selected"); + } + + return document.querySelector(selector + ":not(.seen)"); + } else { + const previously_selected = document.querySelector(".selected"); + + if (previously_selected) { + previously_selected.classList.remove("selected"); + previously_selected.classList.remove("seen"); + } + + const nodes = document.querySelectorAll(selector + ".seen"); + if (nodes) { + const last = nodes[nodes.length - 1]; // last + return last; + } else { + return undefined; + } + } + } + + function reset_all() { + if (!reverse) { + const all_seen = document.querySelectorAll(selector + ".seen"); + + if (all_seen) { + all_seen.forEach(e => e.classList.remove("seen")); + } + } else { + const all_seen = document.querySelectorAll(selector + ":not(.seen)"); + + if (all_seen) { + all_seen.forEach(e => e.classList.add("seen")); + } + } + + } + + const uncovered = select_one(); + + if (uncovered) { + visit_element(uncovered); + } else { + reset_all(); + + const uncovered = select_one(); + + if (uncovered) { + visit_element(uncovered); + } + } +} + +function next_line(reverse) { + next_uncovered("td.uncovered-line", reverse) +} + +function next_region(reverse) { + next_uncovered("span.red.region", reverse); +} + +function next_branch(reverse) { + next_uncovered("span.red.branch", reverse); +} + +document.addEventListener("keypress", function(event) { + const reverse = event.shiftKey; + if (event.code == "KeyL") { + next_line(reverse); + } + if (event.code == "KeyB") { + next_branch(reverse); + } + if (event.code == "KeyR") { + next_region(reverse); + } +}); diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/include/evmmax/evmmax.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/include/evmmax/evmmax.hpp.html new file mode 100644 index 0000000000..10788bc6c3 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/include/evmmax/evmmax.hpp.html @@ -0,0 +1,40 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/include/evmmax/evmmax.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <intx/intx.hpp>
7
8
namespace evmmax
9
{
10
11
/// The modular arithmetic operations for EVMMAX (EVM Modular Arithmetic Extensions).
12
template <typename UintT>
13
class ModArith
14
{
15
public:
16
    const UintT mod;  ///< The modulus.
17
18
private:
19
    const UintT m_r_squared;  ///< R² % mod.
20
21
    /// The modulus inversion, i.e. the number N' such that mod⋅N' = 2⁶⁴-1.
22
    const uint64_t m_mod_inv;
23
24
    /// Compute the modulus inverse for Montgomery multiplication, i.e. N': mod⋅N' = 2⁶⁴-1.
25
    ///
26
    /// @param mod0  The least significant word of the modulus.
27
    static constexpr uint64_t compute_mod_inv(uint64_t mod0) noexcept
28
3.50k
    {
29
        // TODO: Find what is this algorithm and why it works.
30
3.50k
        uint64_t base = 0 - mod0;
31
3.50k
        uint64_t result = 1;
32
227k
        for (auto i = 0; i < 64; 
++i224k
)
33
224k
        {
34
224k
            result *= base;
35
224k
            base *= base;
36
224k
        }
37
3.50k
        return result;
38
3.50k
    }
evmmax::ModArith<intx::uint<256u>>::compute_mod_inv(unsigned long)
Line
Count
Source
28
2.09k
    {
29
        // TODO: Find what is this algorithm and why it works.
30
2.09k
        uint64_t base = 0 - mod0;
31
2.09k
        uint64_t result = 1;
32
136k
        for (auto i = 0; i < 64; 
++i134k
)
33
134k
        {
34
134k
            result *= base;
35
134k
            base *= base;
36
134k
        }
37
2.09k
        return result;
38
2.09k
    }
Unexecuted instantiation: evmmax::ModArith<intx::uint<384u>>::compute_mod_inv(unsigned long)
evmmax::ModArith<intx::uint<128u>>::compute_mod_inv(unsigned long)
Line
Count
Source
28
590
    {
29
        // TODO: Find what is this algorithm and why it works.
30
590
        uint64_t base = 0 - mod0;
31
590
        uint64_t result = 1;
32
38.3k
        for (auto i = 0; i < 64; 
++i37.7k
)
33
37.7k
        {
34
37.7k
            result *= base;
35
37.7k
            base *= base;
36
37.7k
        }
37
590
        return result;
38
590
    }
evmmax::ModArith<intx::uint<512u>>::compute_mod_inv(unsigned long)
Line
Count
Source
28
551
    {
29
        // TODO: Find what is this algorithm and why it works.
30
551
        uint64_t base = 0 - mod0;
31
551
        uint64_t result = 1;
32
35.8k
        for (auto i = 0; i < 64; 
++i35.2k
)
33
35.2k
        {
34
35.2k
            result *= base;
35
35.2k
            base *= base;
36
35.2k
        }
37
551
        return result;
38
551
    }
evmmax::ModArith<intx::uint<1024u>>::compute_mod_inv(unsigned long)
Line
Count
Source
28
42
    {
29
        // TODO: Find what is this algorithm and why it works.
30
42
        uint64_t base = 0 - mod0;
31
42
        uint64_t result = 1;
32
2.73k
        for (auto i = 0; i < 64; 
++i2.68k
)
33
2.68k
        {
34
2.68k
            result *= base;
35
2.68k
            base *= base;
36
2.68k
        }
37
42
        return result;
38
42
    }
evmmax::ModArith<intx::uint<2048u>>::compute_mod_inv(unsigned long)
Line
Count
Source
28
70
    {
29
        // TODO: Find what is this algorithm and why it works.
30
70
        uint64_t base = 0 - mod0;
31
70
        uint64_t result = 1;
32
4.55k
        for (auto i = 0; i < 64; 
++i4.48k
)
33
4.48k
        {
34
4.48k
            result *= base;
35
4.48k
            base *= base;
36
4.48k
        }
37
70
        return result;
38
70
    }
evmmax::ModArith<intx::uint<8192u>>::compute_mod_inv(unsigned long)
Line
Count
Source
28
156
    {
29
        // TODO: Find what is this algorithm and why it works.
30
156
        uint64_t base = 0 - mod0;
31
156
        uint64_t result = 1;
32
10.1k
        for (auto i = 0; i < 64; 
++i9.98k
)
33
9.98k
        {
34
9.98k
            result *= base;
35
9.98k
            base *= base;
36
9.98k
        }
37
156
        return result;
38
156
    }
39
40
    /// Compute R² % mod.
41
    static constexpr UintT compute_r_squared(const UintT& mod) noexcept
42
3.50k
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
3.50k
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
3.50k
        return intx::udivrem(r2, mod).rem;
47
3.50k
    }
evmmax::ModArith<intx::uint<256u>>::compute_r_squared(intx::uint<256u> const&)
Line
Count
Source
42
2.09k
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
2.09k
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
2.09k
        return intx::udivrem(r2, mod).rem;
47
2.09k
    }
Unexecuted instantiation: evmmax::ModArith<intx::uint<384u>>::compute_r_squared(intx::uint<384u> const&)
evmmax::ModArith<intx::uint<128u>>::compute_r_squared(intx::uint<128u> const&)
Line
Count
Source
42
590
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
590
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
590
        return intx::udivrem(r2, mod).rem;
47
590
    }
evmmax::ModArith<intx::uint<512u>>::compute_r_squared(intx::uint<512u> const&)
Line
Count
Source
42
551
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
551
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
551
        return intx::udivrem(r2, mod).rem;
47
551
    }
evmmax::ModArith<intx::uint<1024u>>::compute_r_squared(intx::uint<1024u> const&)
Line
Count
Source
42
42
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
42
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
42
        return intx::udivrem(r2, mod).rem;
47
42
    }
evmmax::ModArith<intx::uint<2048u>>::compute_r_squared(intx::uint<2048u> const&)
Line
Count
Source
42
70
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
70
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
70
        return intx::udivrem(r2, mod).rem;
47
70
    }
evmmax::ModArith<intx::uint<8192u>>::compute_r_squared(intx::uint<8192u> const&)
Line
Count
Source
42
156
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
156
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
156
        return intx::udivrem(r2, mod).rem;
47
156
    }
48
49
    static constexpr std::pair<uint64_t, uint64_t> addmul(
50
        uint64_t t, uint64_t a, uint64_t b, uint64_t c) noexcept
51
1.47G
    {
52
1.47G
        const auto p = intx::umul(a, b) + t + c;
53
1.47G
        return {p[1], p[0]};
54
1.47G
    }
evmmax::ModArith<intx::uint<256u>>::addmul(unsigned long, unsigned long, unsigned long, unsigned long)
Line
Count
Source
51
1.30G
    {
52
1.30G
        const auto p = intx::umul(a, b) + t + c;
53
1.30G
        return {p[1], p[0]};
54
1.30G
    }
Unexecuted instantiation: evmmax::ModArith<intx::uint<384u>>::addmul(unsigned long, unsigned long, unsigned long, unsigned long)
evmmax::ModArith<intx::uint<128u>>::addmul(unsigned long, unsigned long, unsigned long, unsigned long)
Line
Count
Source
51
2.07M
    {
52
2.07M
        const auto p = intx::umul(a, b) + t + c;
53
2.07M
        return {p[1], p[0]};
54
2.07M
    }
evmmax::ModArith<intx::uint<512u>>::addmul(unsigned long, unsigned long, unsigned long, unsigned long)
Line
Count
Source
51
9.50M
    {
52
9.50M
        const auto p = intx::umul(a, b) + t + c;
53
9.50M
        return {p[1], p[0]};
54
9.50M
    }
evmmax::ModArith<intx::uint<1024u>>::addmul(unsigned long, unsigned long, unsigned long, unsigned long)
Line
Count
Source
51
387k
    {
52
387k
        const auto p = intx::umul(a, b) + t + c;
53
387k
        return {p[1], p[0]};
54
387k
    }
evmmax::ModArith<intx::uint<2048u>>::addmul(unsigned long, unsigned long, unsigned long, unsigned long)
Line
Count
Source
51
91.0M
    {
52
91.0M
        const auto p = intx::umul(a, b) + t + c;
53
91.0M
        return {p[1], p[0]};
54
91.0M
    }
evmmax::ModArith<intx::uint<8192u>>::addmul(unsigned long, unsigned long, unsigned long, unsigned long)
Line
Count
Source
51
69.4M
    {
52
69.4M
        const auto p = intx::umul(a, b) + t + c;
53
69.4M
        return {p[1], p[0]};
54
69.4M
    }
55
56
public:
57
    constexpr explicit ModArith(const UintT& modulus) noexcept
58
3.50k
      : mod{modulus},
59
3.50k
        m_r_squared{compute_r_squared(modulus)},
60
3.50k
        m_mod_inv{compute_mod_inv(modulus[0])}
61
3.50k
    {}
evmmax::ModArith<intx::uint<256u>>::ModArith(intx::uint<256u> const&)
Line
Count
Source
58
2.09k
      : mod{modulus},
59
2.09k
        m_r_squared{compute_r_squared(modulus)},
60
2.09k
        m_mod_inv{compute_mod_inv(modulus[0])}
61
2.09k
    {}
Unexecuted instantiation: evmmax::ModArith<intx::uint<384u>>::ModArith(intx::uint<384u> const&)
evmmax::ModArith<intx::uint<128u>>::ModArith(intx::uint<128u> const&)
Line
Count
Source
58
590
      : mod{modulus},
59
590
        m_r_squared{compute_r_squared(modulus)},
60
590
        m_mod_inv{compute_mod_inv(modulus[0])}
61
590
    {}
evmmax::ModArith<intx::uint<512u>>::ModArith(intx::uint<512u> const&)
Line
Count
Source
58
551
      : mod{modulus},
59
551
        m_r_squared{compute_r_squared(modulus)},
60
551
        m_mod_inv{compute_mod_inv(modulus[0])}
61
551
    {}
evmmax::ModArith<intx::uint<1024u>>::ModArith(intx::uint<1024u> const&)
Line
Count
Source
58
42
      : mod{modulus},
59
42
        m_r_squared{compute_r_squared(modulus)},
60
42
        m_mod_inv{compute_mod_inv(modulus[0])}
61
42
    {}
evmmax::ModArith<intx::uint<2048u>>::ModArith(intx::uint<2048u> const&)
Line
Count
Source
58
70
      : mod{modulus},
59
70
        m_r_squared{compute_r_squared(modulus)},
60
70
        m_mod_inv{compute_mod_inv(modulus[0])}
61
70
    {}
evmmax::ModArith<intx::uint<8192u>>::ModArith(intx::uint<8192u> const&)
Line
Count
Source
58
156
      : mod{modulus},
59
156
        m_r_squared{compute_r_squared(modulus)},
60
156
        m_mod_inv{compute_mod_inv(modulus[0])}
61
156
    {}
62
63
    /// Converts a value to Montgomery form.
64
    ///
65
    /// This is done by using Montgomery multiplication mul(x, R²)
66
    /// what gives aR²R⁻¹ % mod = aR % mod.
67
57.3k
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
evmmax::ModArith<intx::uint<256u>>::to_mont(intx::uint<256u> const&) const
Line
Count
Source
67
54.5k
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
Unexecuted instantiation: evmmax::ModArith<intx::uint<384u>>::to_mont(intx::uint<384u> const&) const
evmmax::ModArith<intx::uint<128u>>::to_mont(intx::uint<128u> const&) const
Line
Count
Source
67
1.18k
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
evmmax::ModArith<intx::uint<512u>>::to_mont(intx::uint<512u> const&) const
Line
Count
Source
67
1.10k
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
evmmax::ModArith<intx::uint<1024u>>::to_mont(intx::uint<1024u> const&) const
Line
Count
Source
67
84
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
evmmax::ModArith<intx::uint<2048u>>::to_mont(intx::uint<2048u> const&) const
Line
Count
Source
67
140
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
evmmax::ModArith<intx::uint<8192u>>::to_mont(intx::uint<8192u> const&) const
Line
Count
Source
67
312
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
68
69
    /// Converts a value in Montgomery form back to normal value.
70
    ///
71
    /// Given the x is the Montgomery form x = aR, the conversion is done by using
72
    /// Montgomery multiplication mul(x, 1) what gives aRR⁻¹ % mod = a % mod.
73
21.7k
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
evmmax::ModArith<intx::uint<256u>>::from_mont(intx::uint<256u> const&) const
Line
Count
Source
73
20.3k
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
Unexecuted instantiation: evmmax::ModArith<intx::uint<384u>>::from_mont(intx::uint<384u> const&) const
evmmax::ModArith<intx::uint<128u>>::from_mont(intx::uint<128u> const&) const
Line
Count
Source
73
590
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
evmmax::ModArith<intx::uint<512u>>::from_mont(intx::uint<512u> const&) const
Line
Count
Source
73
551
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
evmmax::ModArith<intx::uint<1024u>>::from_mont(intx::uint<1024u> const&) const
Line
Count
Source
73
42
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
evmmax::ModArith<intx::uint<2048u>>::from_mont(intx::uint<2048u> const&) const
Line
Count
Source
73
70
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
evmmax::ModArith<intx::uint<8192u>>::from_mont(intx::uint<8192u> const&) const
Line
Count
Source
73
156
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
74
75
    /// Performs a Montgomery modular multiplication.
76
    ///
77
    /// Inputs must be in Montgomery form: x = aR, y = bR.
78
    /// This computes Montgomery multiplication xyR⁻¹ % mod what gives aRbRR⁻¹ % mod = abR % mod.
79
    /// The result (abR) is in Montgomery form.
80
    constexpr UintT mul(const UintT& x, const UintT& y) const noexcept
81
41.0M
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
41.0M
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
41.0M
        intx::uint<UintT::num_bits + 64> t;
90
206M
        for (size_t i = 0; i != S; 
++i165M
)
91
165M
        {
92
165M
            uint64_t c = 0;
93
165M
#pragma GCC unroll 8
94
902M
            for (size_t j = 0; j != S; 
++j737M
)
95
737M
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
165M
            auto tmp = intx::addc(t[S], c);
97
165M
            t[S] = tmp.value;
98
165M
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
165M
            const auto m = t[0] * m_mod_inv;
101
165M
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
165M
#pragma GCC unroll 8
103
737M
            for (size_t j = 1; j != S; 
++j571M
)
104
571M
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
165M
            tmp = intx::addc(t[S], c);
106
165M
            t[S - 1] = tmp.value;
107
165M
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
165M
        }
109
110
41.0M
        if (t >= mod)
111
3.42M
            t -= mod;
112
113
41.0M
        return static_cast<UintT>(t);
114
41.0M
    }
evmmax::ModArith<intx::uint<256u>>::mul(intx::uint<256u> const&, intx::uint<256u> const&) const
Line
Count
Source
81
40.6M
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
40.6M
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
40.6M
        intx::uint<UintT::num_bits + 64> t;
90
203M
        for (size_t i = 0; i != S; 
++i162M
)
91
162M
        {
92
162M
            uint64_t c = 0;
93
162M
#pragma GCC unroll 8
94
813M
            for (size_t j = 0; j != S; 
++j650M
)
95
650M
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
162M
            auto tmp = intx::addc(t[S], c);
97
162M
            t[S] = tmp.value;
98
162M
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
162M
            const auto m = t[0] * m_mod_inv;
101
162M
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
162M
#pragma GCC unroll 8
103
650M
            for (size_t j = 1; j != S; 
++j488M
)
104
488M
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
162M
            tmp = intx::addc(t[S], c);
106
162M
            t[S - 1] = tmp.value;
107
162M
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
162M
        }
109
110
40.6M
        if (t >= mod)
111
3.42M
            t -= mod;
112
113
40.6M
        return static_cast<UintT>(t);
114
40.6M
    }
Unexecuted instantiation: evmmax::ModArith<intx::uint<384u>>::mul(intx::uint<384u> const&, intx::uint<384u> const&) const
evmmax::ModArith<intx::uint<128u>>::mul(intx::uint<128u> const&, intx::uint<128u> const&) const
Line
Count
Source
81
259k
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
259k
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
259k
        intx::uint<UintT::num_bits + 64> t;
90
779k
        for (size_t i = 0; i != S; 
++i519k
)
91
519k
        {
92
519k
            uint64_t c = 0;
93
519k
#pragma GCC unroll 8
94
1.55M
            for (size_t j = 0; j != S; 
++j1.03M
)
95
1.03M
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
519k
            auto tmp = intx::addc(t[S], c);
97
519k
            t[S] = tmp.value;
98
519k
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
519k
            const auto m = t[0] * m_mod_inv;
101
519k
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
519k
#pragma GCC unroll 8
103
1.03M
            for (size_t j = 1; j != S; 
++j519k
)
104
519k
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
519k
            tmp = intx::addc(t[S], c);
106
519k
            t[S - 1] = tmp.value;
107
519k
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
519k
        }
109
110
259k
        if (t >= mod)
111
210
            t -= mod;
112
113
259k
        return static_cast<UintT>(t);
114
259k
    }
evmmax::ModArith<intx::uint<512u>>::mul(intx::uint<512u> const&, intx::uint<512u> const&) const
Line
Count
Source
81
74.2k
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
74.2k
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
74.2k
        intx::uint<UintT::num_bits + 64> t;
90
668k
        for (size_t i = 0; i != S; 
++i594k
)
91
594k
        {
92
594k
            uint64_t c = 0;
93
594k
#pragma GCC unroll 8
94
5.34M
            for (size_t j = 0; j != S; 
++j4.75M
)
95
4.75M
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
594k
            auto tmp = intx::addc(t[S], c);
97
594k
            t[S] = tmp.value;
98
594k
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
594k
            const auto m = t[0] * m_mod_inv;
101
594k
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
594k
#pragma GCC unroll 8
103
4.75M
            for (size_t j = 1; j != S; 
++j4.15M
)
104
4.15M
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
594k
            tmp = intx::addc(t[S], c);
106
594k
            t[S - 1] = tmp.value;
107
594k
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
594k
        }
109
110
74.2k
        if (t >= mod)
111
280
            t -= mod;
112
113
74.2k
        return static_cast<UintT>(t);
114
74.2k
    }
evmmax::ModArith<intx::uint<1024u>>::mul(intx::uint<1024u> const&, intx::uint<1024u> const&) const
Line
Count
Source
81
756
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
756
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
756
        intx::uint<UintT::num_bits + 64> t;
90
12.8k
        for (size_t i = 0; i != S; 
++i12.0k
)
91
12.0k
        {
92
12.0k
            uint64_t c = 0;
93
12.0k
#pragma GCC unroll 8
94
205k
            for (size_t j = 0; j != S; 
++j193k
)
95
193k
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
12.0k
            auto tmp = intx::addc(t[S], c);
97
12.0k
            t[S] = tmp.value;
98
12.0k
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
12.0k
            const auto m = t[0] * m_mod_inv;
101
12.0k
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
12.0k
#pragma GCC unroll 8
103
193k
            for (size_t j = 1; j != S; 
++j181k
)
104
181k
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
12.0k
            tmp = intx::addc(t[S], c);
106
12.0k
            t[S - 1] = tmp.value;
107
12.0k
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
12.0k
        }
109
110
756
        if (t >= mod)
111
140
            t -= mod;
112
113
756
        return static_cast<UintT>(t);
114
756
    }
evmmax::ModArith<intx::uint<2048u>>::mul(intx::uint<2048u> const&, intx::uint<2048u> const&) const
Line
Count
Source
81
44.4k
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
44.4k
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
44.4k
        intx::uint<UintT::num_bits + 64> t;
90
1.46M
        for (size_t i = 0; i != S; 
++i1.42M
)
91
1.42M
        {
92
1.42M
            uint64_t c = 0;
93
1.42M
#pragma GCC unroll 8
94
46.9M
            for (size_t j = 0; j != S; 
++j45.5M
)
95
45.5M
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
1.42M
            auto tmp = intx::addc(t[S], c);
97
1.42M
            t[S] = tmp.value;
98
1.42M
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
1.42M
            const auto m = t[0] * m_mod_inv;
101
1.42M
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
1.42M
#pragma GCC unroll 8
103
45.5M
            for (size_t j = 1; j != S; 
++j44.1M
)
104
44.1M
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
1.42M
            tmp = intx::addc(t[S], c);
106
1.42M
            t[S - 1] = tmp.value;
107
1.42M
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
1.42M
        }
109
110
44.4k
        if (t >= mod)
111
322
            t -= mod;
112
113
44.4k
        return static_cast<UintT>(t);
114
44.4k
    }
evmmax::ModArith<intx::uint<8192u>>::mul(intx::uint<8192u> const&, intx::uint<8192u> const&) const
Line
Count
Source
81
2.12k
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
2.12k
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
2.12k
        intx::uint<UintT::num_bits + 64> t;
90
273k
        for (size_t i = 0; i != S; 
++i271k
)
91
271k
        {
92
271k
            uint64_t c = 0;
93
271k
#pragma GCC unroll 8
94
35.0M
            for (size_t j = 0; j != S; 
++j34.7M
)
95
34.7M
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
271k
            auto tmp = intx::addc(t[S], c);
97
271k
            t[S] = tmp.value;
98
271k
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
271k
            const auto m = t[0] * m_mod_inv;
101
271k
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
271k
#pragma GCC unroll 8
103
34.7M
            for (size_t j = 1; j != S; 
++j34.4M
)
104
34.4M
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
271k
            tmp = intx::addc(t[S], c);
106
271k
            t[S - 1] = tmp.value;
107
271k
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
271k
        }
109
110
2.12k
        if (t >= mod)
111
72
            t -= mod;
112
113
2.12k
        return static_cast<UintT>(t);
114
2.12k
    }
115
116
    /// Performs a modular addition. It is required that x < mod and y < mod, but x and y may be
117
    /// but are not required to be in Montgomery form.
118
    constexpr UintT add(const UintT& x, const UintT& y) const noexcept
119
38.5M
    {
120
38.5M
        const auto s = addc(x, y);  // TODO: cannot overflow if modulus is sparse (e.g. 255 bits).
121
38.5M
        const auto d = subc(s.value, mod);
122
38.5M
        return (!s.carry && 
d.carry33.6M
) ?
s.value20.7M
:
d.value17.8M
;
  MC/DC Decision Region (122:17) to (122:36)
+
+  Number of Conditions: 2
+     Condition C1 --> (122:17)
+     Condition C2 --> (122:29)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (122:17) to (122:36)
+
+  Number of Conditions: 2
+     Condition C1 --> (122:17)
+     Condition C2 --> (122:29)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
123
38.5M
    }
evmmax::ModArith<intx::uint<256u>>::add(intx::uint<256u> const&, intx::uint<256u> const&) const
Line
Count
Source
119
38.5M
    {
120
38.5M
        const auto s = addc(x, y);  // TODO: cannot overflow if modulus is sparse (e.g. 255 bits).
121
38.5M
        const auto d = subc(s.value, mod);
122
38.5M
        return (!s.carry && 
d.carry33.6M
) ?
s.value20.7M
:
d.value17.8M
;
  MC/DC Decision Region (122:17) to (122:36)
+
+  Number of Conditions: 2
+     Condition C1 --> (122:17)
+     Condition C2 --> (122:29)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
123
38.5M
    }
Unexecuted instantiation: evmmax::ModArith<intx::uint<384u>>::add(intx::uint<384u> const&, intx::uint<384u> const&) const
124
125
    /// Performs a modular subtraction. It is required that x < mod and y < mod, but x and y may be
126
    /// but are not required to be in Montgomery form.
127
    constexpr UintT sub(const UintT& x, const UintT& y) const noexcept
128
23.9M
    {
129
23.9M
        const auto d = subc(x, y);
130
23.9M
        const auto s = d.value + mod;
131
23.9M
        return (d.carry) ? 
s11.2M
:
d.value12.7M
;
132
23.9M
    }
evmmax::ModArith<intx::uint<256u>>::sub(intx::uint<256u> const&, intx::uint<256u> const&) const
Line
Count
Source
128
23.9M
    {
129
23.9M
        const auto d = subc(x, y);
130
23.9M
        const auto s = d.value + mod;
131
23.9M
        return (d.carry) ? 
s11.2M
:
d.value12.7M
;
132
23.9M
    }
Unexecuted instantiation: evmmax::ModArith<intx::uint<384u>>::sub(intx::uint<384u> const&, intx::uint<384u> const&) const
133
134
    /// Compute the modular inversion of the x in Montgomery form. The result is in Montgomery form.
135
    /// If x is not invertible, the result is 0.
136
    constexpr UintT inv(const UintT& x) const noexcept
137
8.46k
    {
138
8.46k
        assert((mod & 1) == 1);
139
8.46k
        assert(mod >= 3);
140
141
        // Precompute inverse of 2 modulo mod: inv2 * 2 % mod == 1.
142
        // The 1/2 is inexact division which can be fixed by adding "0" to the numerator
143
        // and making it even: (mod + 1) / 2. To avoid potential overflow of (1 + mod)
144
        // we rewrite it further to (mod - 1 + 2) / 2 = (mod - 1) / 2 + 1 = ⌊mod / 2⌋ + 1.
145
8.46k
        const auto inv2 = (mod >> 1) + 1;
146
147
        // Use extended binary Euclidean algorithm. This evolves variables a and b until a is 0.
148
        // Then GCD(x, mod) is in b. If GCD(x, mod) == 1 then the inversion exists and is in v.
149
        // This follows the classic algorithm (Algorithm 1) presented in
150
        // "Optimized Binary GCD for Modular Inversion".
151
        // https://eprint.iacr.org/2020/972.pdf#algorithm.1
152
        // TODO: The same paper has additional optimizations that could be applied.
153
8.46k
        UintT a = x;
154
8.46k
        UintT b = mod;
155
156
        // Bézout's coefficients are originally initialized to 1 and 0. But because the input x
157
        // is in Montgomery form XR the algorithm would compute X⁻¹R⁻¹. To get the expected X⁻¹R,
158
        // we need to multiply the result by R². We can achieve the same effect "for free"
159
        // by initializing u to R² instead of 1.
160
8.46k
        UintT u = m_r_squared;
161
8.46k
        UintT v = 0;
162
163
2.06M
        while (a != 0)
164
2.05M
        {
165
2.05M
            if ((a & 1) != 0)
166
1.11M
            {
167
                // if a is odd update it to a - b.
168
1.11M
                if (const auto [d, less] = subc(a, b); less)
169
588k
                {
170
                    // swap a and b in case a < b.
171
588k
                    b = a;
172
588k
                    a = -d;
173
174
588k
                    using namespace std;
175
588k
                    swap(u, v);
176
588k
                }
177
531k
                else
178
531k
                {
179
531k
                    a = d;
180
531k
                }
181
1.11M
                u = sub(u, v);
182
1.11M
            }
183
184
            // Compute a / 2 % mod, a is even so division is exact and can be computed as ⌊a / 2⌋.
185
2.05M
            a >>= 1;
186
187
            // Compute u / 2 % mod. If u is even this can be computed as ⌊u / 2⌋.
188
            // Otherwise, (u - 1 + 1) / 2 = ⌊u / 2⌋ + (1 / 2 % mod).
189
2.05M
            const auto u_odd = (u & 1) != 0;
190
2.05M
            u >>= 1;
191
2.05M
            if (u_odd)
192
1.02M
                u += inv2;  // if u is odd add back ½ % mod.
193
2.05M
        }
194
195
8.46k
        if (b != 1)
196
2.57k
            return 0;  // not invertible
197
5.88k
        return v;
198
8.46k
    }
evmmax::ModArith<intx::uint<256u>>::inv(intx::uint<256u> const&) const
Line
Count
Source
137
8.46k
    {
138
8.46k
        assert((mod & 1) == 1);
139
8.46k
        assert(mod >= 3);
140
141
        // Precompute inverse of 2 modulo mod: inv2 * 2 % mod == 1.
142
        // The 1/2 is inexact division which can be fixed by adding "0" to the numerator
143
        // and making it even: (mod + 1) / 2. To avoid potential overflow of (1 + mod)
144
        // we rewrite it further to (mod - 1 + 2) / 2 = (mod - 1) / 2 + 1 = ⌊mod / 2⌋ + 1.
145
8.46k
        const auto inv2 = (mod >> 1) + 1;
146
147
        // Use extended binary Euclidean algorithm. This evolves variables a and b until a is 0.
148
        // Then GCD(x, mod) is in b. If GCD(x, mod) == 1 then the inversion exists and is in v.
149
        // This follows the classic algorithm (Algorithm 1) presented in
150
        // "Optimized Binary GCD for Modular Inversion".
151
        // https://eprint.iacr.org/2020/972.pdf#algorithm.1
152
        // TODO: The same paper has additional optimizations that could be applied.
153
8.46k
        UintT a = x;
154
8.46k
        UintT b = mod;
155
156
        // Bézout's coefficients are originally initialized to 1 and 0. But because the input x
157
        // is in Montgomery form XR the algorithm would compute X⁻¹R⁻¹. To get the expected X⁻¹R,
158
        // we need to multiply the result by R². We can achieve the same effect "for free"
159
        // by initializing u to R² instead of 1.
160
8.46k
        UintT u = m_r_squared;
161
8.46k
        UintT v = 0;
162
163
2.06M
        while (a != 0)
164
2.05M
        {
165
2.05M
            if ((a & 1) != 0)
166
1.11M
            {
167
                // if a is odd update it to a - b.
168
1.11M
                if (const auto [d, less] = subc(a, b); less)
169
588k
                {
170
                    // swap a and b in case a < b.
171
588k
                    b = a;
172
588k
                    a = -d;
173
174
588k
                    using namespace std;
175
588k
                    swap(u, v);
176
588k
                }
177
531k
                else
178
531k
                {
179
531k
                    a = d;
180
531k
                }
181
1.11M
                u = sub(u, v);
182
1.11M
            }
183
184
            // Compute a / 2 % mod, a is even so division is exact and can be computed as ⌊a / 2⌋.
185
2.05M
            a >>= 1;
186
187
            // Compute u / 2 % mod. If u is even this can be computed as ⌊u / 2⌋.
188
            // Otherwise, (u - 1 + 1) / 2 = ⌊u / 2⌋ + (1 / 2 % mod).
189
2.05M
            const auto u_odd = (u & 1) != 0;
190
2.05M
            u >>= 1;
191
2.05M
            if (u_odd)
192
1.02M
                u += inv2;  // if u is odd add back ½ % mod.
193
2.05M
        }
194
195
8.46k
        if (b != 1)
196
2.57k
            return 0;  // not invertible
197
5.88k
        return v;
198
8.46k
    }
Unexecuted instantiation: evmmax::ModArith<intx::uint<384u>>::inv(intx::uint<384u> const&) const
199
};
200
}  // namespace evmmax
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline.hpp.html new file mode 100644 index 0000000000..de0206bbaa --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone/baseline.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2020 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include "eof.hpp"
7
#include <evmc/evmc.h>
8
#include <evmc/utils.h>
9
#include <memory>
10
11
namespace evmone
12
{
13
using evmc::bytes_view;
14
class ExecutionState;
15
class VM;
16
17
/// A span type for a bitset.
18
struct BitsetSpan
19
{
20
    using word_type = uint64_t;
21
    static constexpr size_t WORD_BITS = sizeof(word_type) * 8;
22
23
    word_type* m_array = nullptr;
24
25
2.75M
    explicit BitsetSpan(word_type* array) noexcept : m_array{array} {}
26
27
    [[nodiscard]] bool test(size_t index) const noexcept
28
6.96M
    {
29
6.96M
        const auto [word, bit_mask] = get_ref(index);
30
6.96M
        return (word & bit_mask) != 0;
31
6.96M
    }
32
33
    void set(size_t index) const noexcept
34
88.4M
    {
35
88.4M
        const auto& [word, bit_mask] = get_ref(index);
36
88.4M
        word |= bit_mask;
37
88.4M
    }
38
39
private:
40
    struct Ref
41
    {
42
        word_type& word_ref;
43
        word_type bit_mask;
44
    };
45
46
    [[nodiscard, gnu::always_inline, msvc::forceinline]] Ref get_ref(size_t index) const noexcept
47
95.4M
    {
48
95.4M
        const auto word_index = index / WORD_BITS;
49
95.4M
        const auto bit_index = index % WORD_BITS;
50
95.4M
        const auto bit_mask = word_type{1} << bit_index;
51
95.4M
        return {m_array[word_index], bit_mask};
52
95.4M
    }
53
};
54
55
namespace baseline
56
{
57
class CodeAnalysis
58
{
59
private:
60
    bytes_view m_raw_code;         ///< Unmodified full code.
61
    bytes_view m_executable_code;  ///< Executable code section.
62
    EOF1Header m_eof_header;       ///< The EOF header.
63
64
    /// Padded code for faster legacy code execution.
65
    /// If not nullptr the executable_code must point to it.
66
    std::unique_ptr<uint8_t[]> m_padded_code;
67
68
    BitsetSpan m_jumpdest_bitset{nullptr};
69
70
public:
71
    /// Constructor for legacy code.
72
    CodeAnalysis(std::unique_ptr<uint8_t[]> padded_code, size_t code_size, BitsetSpan map)
73
2.75M
      : m_raw_code{padded_code.get(), code_size},
74
2.75M
        m_executable_code{padded_code.get(), code_size},
75
2.75M
        m_padded_code{std::move(padded_code)},
76
2.75M
        m_jumpdest_bitset{map}
77
2.75M
    {}
78
79
    /// Constructor for EOF.
80
    CodeAnalysis(bytes_view container, bytes_view executable_code, EOF1Header header)
81
0
      : m_raw_code{container}, m_executable_code(executable_code), m_eof_header{std::move(header)}
82
0
    {}
83
84
    /// The raw code as stored in accounts or passes as initcode. For EOF this is full container.
85
2.75M
    [[nodiscard]] bytes_view raw_code() const noexcept { return m_raw_code; }
86
87
    /// The pre-processed executable code. This is where interpreter should start execution.
88
15.2M
    [[nodiscard]] bytes_view executable_code() const noexcept { return m_executable_code; }
89
90
    /// Reference to the EOF header.
91
2.75M
    [[nodiscard]] const EOF1Header& eof_header() const noexcept { return m_eof_header; }
92
93
    /// Reference to the EOF data section. May be empty.
94
0
    [[nodiscard]] bytes_view eof_data() const noexcept { return m_eof_header.get_data(m_raw_code); }
95
96
    /// Check if given position is valid jump destination. Use only for legacy code.
97
    [[nodiscard]] bool check_jumpdest(uint64_t position) const noexcept
98
6.96M
    {
99
6.96M
        if (position >= m_raw_code.size())
100
78
            return false;
101
6.96M
        return m_jumpdest_bitset.test(static_cast<size_t>(position));
102
6.96M
    }
103
};
104
105
/// Analyze the EVM code in preparation for execution.
106
///
107
/// For legacy code this builds the map of valid JUMPDESTs.
108
/// If EOF is enabled, it recognizes the EOF code by the code prefix.
109
///
110
/// @param code         The reference to the EVM code to be analyzed.
111
/// @param eof_enabled  Should the EOF code prefix be recognized as EOF code?
112
EVMC_EXPORT CodeAnalysis analyze(bytes_view code, bool eof_enabled);
113
114
/// Executes in Baseline interpreter using EVMC-compatible parameters.
115
evmc_result execute(evmc_vm* vm, const evmc_host_interface* host, evmc_host_context* ctx,
116
    evmc_revision rev, const evmc_message* msg, const uint8_t* code, size_t code_size) noexcept;
117
118
/// Executes in Baseline interpreter with the pre-processed code.
119
EVMC_EXPORT evmc_result execute(VM&, const evmc_host_interface& host, evmc_host_context* ctx,
120
    evmc_revision rev, const evmc_message& msg, const CodeAnalysis& analysis) noexcept;
121
122
}  // namespace baseline
123
}  // namespace evmone
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline_analysis.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline_analysis.cpp.html new file mode 100644 index 0000000000..feae725088 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline_analysis.cpp.html @@ -0,0 +1,15 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone/baseline_analysis.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2020 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "baseline.hpp"
6
#include "eof.hpp"
7
#include "instructions.hpp"
8
#include <memory>
9
10
namespace evmone::baseline
11
{
12
static_assert(std::is_move_constructible_v<CodeAnalysis>);
13
static_assert(std::is_move_assignable_v<CodeAnalysis>);
14
static_assert(!std::is_copy_constructible_v<CodeAnalysis>);
15
static_assert(!std::is_copy_assignable_v<CodeAnalysis>);
16
17
namespace
18
{
19
void analyze_jumpdests(BitsetSpan map, bytes_view code) noexcept
20
2.75M
{
21
    // To find if op is any PUSH opcode (OP_PUSH1 <= op <= OP_PUSH32)
22
    // it can be noticed that OP_PUSH32 is INT8_MAX (0x7f) therefore,
23
    // static_cast<int8_t>(op) <= OP_PUSH32 is always true and can be skipped.
24
2.75M
    static_assert(OP_PUSH32 == std::numeric_limits<int8_t>::max());
25
26
377M
    for (size_t i = 0; i < code.size(); 
++i374M
)
27
374M
    {
28
374M
        const auto op = code[i];
29
374M
        if (static_cast<int8_t>(op) >= OP_PUSH1)  // If any PUSH opcode (see explanation above).
30
64.2M
            i += op - size_t{OP_PUSH1 - 1};       // Skip PUSH data.
31
310M
        else if (INTX_UNLIKELY(op == OP_JUMPDEST))
32
88.4M
            map.set(i);
33
374M
    }
34
2.75M
}
35
36
CodeAnalysis analyze_legacy(bytes_view code)
37
2.75M
{
38
    // We need at most 33 bytes of code padding: 32 for possible missing all data bytes of
39
    // the PUSH32 at the code end; and one more byte for STOP to guarantee there is a terminating
40
    // instruction at the code end.
41
2.75M
    static constexpr auto PADDING = 32 + 1;
42
43
2.75M
    static constexpr auto BITSET_ALIGNMENT = alignof(BitsetSpan::word_type);
44
45
2.75M
    const auto padded_code_size = code.size() + PADDING;
46
2.75M
    const auto aligned_code_size =
47
2.75M
        (padded_code_size + (BITSET_ALIGNMENT - 1)) / BITSET_ALIGNMENT * BITSET_ALIGNMENT;
48
2.75M
    const auto bitset_words = (code.size() + (BitsetSpan::WORD_BITS)) / BitsetSpan::WORD_BITS;
49
2.75M
    const auto total_size = aligned_code_size + bitset_words * sizeof(BitsetSpan::word_type);
50
51
2.75M
    auto storage = std::make_unique_for_overwrite<uint8_t[]>(total_size);
52
2.75M
    std::ranges::copy(code, storage.get());                           // Copy code.
53
2.75M
    std::fill_n(&storage[code.size()], total_size - code.size(), 0);  // Pad code and init bitset.
54
55
2.75M
    const auto bitset_storage =
56
2.75M
        new (&storage[aligned_code_size]) BitsetSpan::word_type[bitset_words];
57
2.75M
    const BitsetSpan jumpdest_bitset{bitset_storage};
58
2.75M
    analyze_jumpdests(jumpdest_bitset, code);
59
60
2.75M
    return {std::move(storage), code.size(), jumpdest_bitset};
61
2.75M
}
62
63
CodeAnalysis analyze_eof1(bytes_view container)
64
0
{
65
0
    auto header = read_valid_eof1_header(container);
66
67
    // Extract all code sections as single buffer reference.
68
    // TODO: It would be much easier if header had code_sections_offset and data_section_offset
69
    //       with code_offsets[] being relative to code_sections_offset.
70
0
    const auto code_sections_offset = header.code_offsets[0];
71
0
    const auto code_sections_end = size_t{header.code_offsets.back()} + header.code_sizes.back();
72
0
    const auto executable_code =
73
0
        container.substr(code_sections_offset, code_sections_end - code_sections_offset);
74
75
0
    return CodeAnalysis{container, executable_code, std::move(header)};
76
0
}
77
}  // namespace
78
79
CodeAnalysis analyze(bytes_view code, bool eof_enabled)
80
2.75M
{
81
2.75M
    if (eof_enabled && 
is_eof_container(code)0
)
  MC/DC Decision Region (81:9) to (81:46)
+
+  Number of Conditions: 2
+     Condition C1 --> (81:9)
+     Condition C2 --> (81:24)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
82
0
        return analyze_eof1(code);
83
2.75M
    return analyze_legacy(code);
84
2.75M
}
85
}  // namespace evmone::baseline
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline_execution.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline_execution.cpp.html new file mode 100644 index 0000000000..4399a474d3 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline_execution.cpp.html @@ -0,0 +1,35 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone/baseline_execution.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2020 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "baseline.hpp"
6
#include "baseline_instruction_table.hpp"
7
#include "eof.hpp"
8
#include "execution_state.hpp"
9
#include "instructions.hpp"
10
#include "vm.hpp"
11
#include <memory>
12
13
#ifdef NDEBUG
14
#define release_inline gnu::always_inline, msvc::forceinline
15
#else
16
#define release_inline
17
#endif
18
19
#if defined(__GNUC__)
20
245M
#define ASM_COMMENT(COMMENT) asm("# " #COMMENT)  // NOLINT(hicpp-no-assembler)
21
#else
22
#define ASM_COMMENT(COMMENT)
23
#endif
24
25
namespace evmone::baseline
26
{
27
namespace
28
{
29
/// Checks instruction requirements before execution.
30
///
31
/// This checks:
32
/// - if the instruction is defined
33
/// - if stack height requirements are fulfilled (stack overflow, stack underflow)
34
/// - charges the instruction base gas cost and checks is there is any gas left.
35
///
36
/// @tparam         Op            Instruction opcode.
37
/// @param          cost_table    Table of base gas costs.
38
/// @param [in,out] gas_left      Gas left.
39
/// @param          stack_top     Pointer to the stack top item.
40
/// @param          stack_bottom  Pointer to the stack bottom.
41
///                               The stack height is stack_top - stack_bottom.
42
/// @return  Status code with information which check has failed
43
///          or EVMC_SUCCESS if everything is fine.
44
template <Opcode Op>
45
inline evmc_status_code check_requirements(const CostTable& cost_table, int64_t& gas_left,
46
    const uint256* stack_top, const uint256* stack_bottom) noexcept
47
245M
{
48
245M
    static_assert(
49
245M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
245M
        "undefined instructions must not be handled by check_requirements()");
51
52
245M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
21.8M
    {
55
21.8M
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
21.8M
        if (INTX_UNLIKELY(gas_cost < 0))
60
15.5k
            return EVMC_UNDEFINED_INSTRUCTION;
61
21.8M
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
124M
    {
67
124M
        static_assert(instr::traits[Op].stack_height_change == 1,
68
124M
            "unexpected instruction with multiple results");
69
124M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
1.23k
            return EVMC_STACK_OVERFLOW;
71
124M
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
104M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
104M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
104M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
2.42k
            return EVMC_STACK_UNDERFLOW;
78
104M
    }
79
80
245M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
422k
        return EVMC_OUT_OF_GAS;
82
83
245M
    return EVMC_SUCCESS;
84
245M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)0>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
1.40M
{
48
1.40M
    static_assert(
49
1.40M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
1.40M
        "undefined instructions must not be handled by check_requirements()");
51
52
1.40M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
1.40M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
1.40M
    return EVMC_SUCCESS;
84
1.40M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)1>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
15.6M
{
48
15.6M
    static_assert(
49
15.6M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
15.6M
        "undefined instructions must not be handled by check_requirements()");
51
52
15.6M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
15.6M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
15.6M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
15.6M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
334
            return EVMC_STACK_UNDERFLOW;
78
15.6M
    }
79
80
15.6M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
38
        return EVMC_OUT_OF_GAS;
82
83
15.6M
    return EVMC_SUCCESS;
84
15.6M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)2>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
236k
{
48
236k
    static_assert(
49
236k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
236k
        "undefined instructions must not be handled by check_requirements()");
51
52
236k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
236k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
236k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
236k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
236k
    }
79
80
236k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
12
        return EVMC_OUT_OF_GAS;
82
83
236k
    return EVMC_SUCCESS;
84
236k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)3>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
3.12M
{
48
3.12M
    static_assert(
49
3.12M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
3.12M
        "undefined instructions must not be handled by check_requirements()");
51
52
3.12M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
3.12M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
3.12M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
3.12M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
3.12M
    }
79
80
3.12M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
3.12M
    return EVMC_SUCCESS;
84
3.12M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)4>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
46.6k
{
48
46.6k
    static_assert(
49
46.6k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
46.6k
        "undefined instructions must not be handled by check_requirements()");
51
52
46.6k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
46.6k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
46.6k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
46.6k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
46.6k
    }
79
80
46.6k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
46.6k
    return EVMC_SUCCESS;
84
46.6k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)5>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
4.03k
{
48
4.03k
    static_assert(
49
4.03k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
4.03k
        "undefined instructions must not be handled by check_requirements()");
51
52
4.03k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
4.03k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
4.03k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
4.03k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
4.03k
    }
79
80
4.03k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
4.03k
    return EVMC_SUCCESS;
84
4.03k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)6>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
155k
{
48
155k
    static_assert(
49
155k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
155k
        "undefined instructions must not be handled by check_requirements()");
51
52
155k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
155k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
155k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
155k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
155k
    }
79
80
155k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
155k
    return EVMC_SUCCESS;
84
155k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)7>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
3.53k
{
48
3.53k
    static_assert(
49
3.53k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
3.53k
        "undefined instructions must not be handled by check_requirements()");
51
52
3.53k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
3.53k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
3.53k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
3.53k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
3.53k
    }
79
80
3.53k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
3.53k
    return EVMC_SUCCESS;
84
3.53k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)8>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
2.01k
{
48
2.01k
    static_assert(
49
2.01k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
2.01k
        "undefined instructions must not be handled by check_requirements()");
51
52
2.01k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
2.01k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
2.01k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
2.01k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
2.01k
    }
79
80
2.01k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
2.01k
    return EVMC_SUCCESS;
84
2.01k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)9>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
2.29k
{
48
2.29k
    static_assert(
49
2.29k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
2.29k
        "undefined instructions must not be handled by check_requirements()");
51
52
2.29k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
2.29k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
2.29k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
2.29k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
2.29k
    }
79
80
2.29k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
2.29k
    return EVMC_SUCCESS;
84
2.29k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)10>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
37.1k
{
48
37.1k
    static_assert(
49
37.1k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
37.1k
        "undefined instructions must not be handled by check_requirements()");
51
52
37.1k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
37.1k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
37.1k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
37.1k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
37.1k
    }
79
80
37.1k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
37.1k
    return EVMC_SUCCESS;
84
37.1k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)11>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
2.54k
{
48
2.54k
    static_assert(
49
2.54k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
2.54k
        "undefined instructions must not be handled by check_requirements()");
51
52
2.54k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
2.54k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
2.54k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
2.54k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
2.54k
    }
79
80
2.54k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
2.54k
    return EVMC_SUCCESS;
84
2.54k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)16>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
2.94M
{
48
2.94M
    static_assert(
49
2.94M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
2.94M
        "undefined instructions must not be handled by check_requirements()");
51
52
2.94M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
2.94M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
2.94M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
2.94M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
34
            return EVMC_STACK_UNDERFLOW;
78
2.94M
    }
79
80
2.94M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
2.94M
    return EVMC_SUCCESS;
84
2.94M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)17>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
394k
{
48
394k
    static_assert(
49
394k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
394k
        "undefined instructions must not be handled by check_requirements()");
51
52
394k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
394k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
394k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
394k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
394k
    }
79
80
394k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
394k
    return EVMC_SUCCESS;
84
394k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)18>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
6.53k
{
48
6.53k
    static_assert(
49
6.53k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
6.53k
        "undefined instructions must not be handled by check_requirements()");
51
52
6.53k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
6.53k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
6.53k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
6.53k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
6.53k
    }
79
80
6.53k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
6.53k
    return EVMC_SUCCESS;
84
6.53k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)19>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
6.17k
{
48
6.17k
    static_assert(
49
6.17k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
6.17k
        "undefined instructions must not be handled by check_requirements()");
51
52
6.17k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
6.17k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
6.17k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
6.17k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
6.17k
    }
79
80
6.17k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
6.17k
    return EVMC_SUCCESS;
84
6.17k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)20>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
825k
{
48
825k
    static_assert(
49
825k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
825k
        "undefined instructions must not be handled by check_requirements()");
51
52
825k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
825k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
825k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
825k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
825k
    }
79
80
825k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
825k
    return EVMC_SUCCESS;
84
825k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)21>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
5.10M
{
48
5.10M
    static_assert(
49
5.10M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
5.10M
        "undefined instructions must not be handled by check_requirements()");
51
52
5.10M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
5.10M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
5.10M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
5.10M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
5.10M
    }
79
80
5.10M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
6
        return EVMC_OUT_OF_GAS;
82
83
5.10M
    return EVMC_SUCCESS;
84
5.10M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)22>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
128k
{
48
128k
    static_assert(
49
128k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
128k
        "undefined instructions must not be handled by check_requirements()");
51
52
128k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
128k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
128k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
128k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
128k
    }
79
80
128k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
128k
    return EVMC_SUCCESS;
84
128k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)23>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
51.8k
{
48
51.8k
    static_assert(
49
51.8k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
51.8k
        "undefined instructions must not be handled by check_requirements()");
51
52
51.8k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
51.8k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
51.8k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
51.8k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
51.8k
    }
79
80
51.8k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
51.8k
    return EVMC_SUCCESS;
84
51.8k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)24>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
1.63k
{
48
1.63k
    static_assert(
49
1.63k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
1.63k
        "undefined instructions must not be handled by check_requirements()");
51
52
1.63k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
1.63k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
1.63k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
1.63k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
1.63k
    }
79
80
1.63k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
1.63k
    return EVMC_SUCCESS;
84
1.63k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)25>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
70.3k
{
48
70.3k
    static_assert(
49
70.3k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
70.3k
        "undefined instructions must not be handled by check_requirements()");
51
52
70.3k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
70.3k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
70.3k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
70.3k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
70.3k
    }
79
80
70.3k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
70.3k
    return EVMC_SUCCESS;
84
70.3k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)26>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
78.2k
{
48
78.2k
    static_assert(
49
78.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
78.2k
        "undefined instructions must not be handled by check_requirements()");
51
52
78.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
78.2k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
78.2k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
78.2k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
78.2k
    }
79
80
78.2k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
78.2k
    return EVMC_SUCCESS;
84
78.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)27>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
3.46M
{
48
3.46M
    static_assert(
49
3.46M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
3.46M
        "undefined instructions must not be handled by check_requirements()");
51
52
3.46M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
3.46M
    {
55
3.46M
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
3.46M
        if (INTX_UNLIKELY(gas_cost < 0))
60
85
            return EVMC_UNDEFINED_INSTRUCTION;
61
3.46M
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
3.46M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
3.46M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
3.46M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
12
            return EVMC_STACK_UNDERFLOW;
78
3.46M
    }
79
80
3.46M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
3.46M
    return EVMC_SUCCESS;
84
3.46M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)28>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
18.6k
{
48
18.6k
    static_assert(
49
18.6k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
18.6k
        "undefined instructions must not be handled by check_requirements()");
51
52
18.6k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
18.6k
    {
55
18.6k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
18.6k
        if (INTX_UNLIKELY(gas_cost < 0))
60
83
            return EVMC_UNDEFINED_INSTRUCTION;
61
18.6k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
18.6k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
18.6k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
18.6k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
12
            return EVMC_STACK_UNDERFLOW;
78
18.6k
    }
79
80
18.6k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
18.6k
    return EVMC_SUCCESS;
84
18.6k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)29>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
8.33k
{
48
8.33k
    static_assert(
49
8.33k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
8.33k
        "undefined instructions must not be handled by check_requirements()");
51
52
8.33k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
8.33k
    {
55
8.33k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
8.33k
        if (INTX_UNLIKELY(gas_cost < 0))
60
83
            return EVMC_UNDEFINED_INSTRUCTION;
61
8.33k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
8.33k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
8.33k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
8.33k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
12
            return EVMC_STACK_UNDERFLOW;
78
8.33k
    }
79
80
8.33k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
8.33k
    return EVMC_SUCCESS;
84
8.33k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)30>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
3.28k
{
48
3.28k
    static_assert(
49
3.28k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
3.28k
        "undefined instructions must not be handled by check_requirements()");
51
52
3.28k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
3.28k
    {
55
3.28k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
3.28k
        if (INTX_UNLIKELY(gas_cost < 0))
60
454
            return EVMC_UNDEFINED_INSTRUCTION;
61
3.28k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
3.28k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
3.28k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
3.28k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
4
            return EVMC_STACK_UNDERFLOW;
78
3.28k
    }
79
80
3.28k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
16
        return EVMC_OUT_OF_GAS;
82
83
3.27k
    return EVMC_SUCCESS;
84
3.28k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)32>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
15.5k
{
48
15.5k
    static_assert(
49
15.5k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
15.5k
        "undefined instructions must not be handled by check_requirements()");
51
52
15.5k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
15.5k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
15.5k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
15.5k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
30
            return EVMC_STACK_UNDERFLOW;
78
15.5k
    }
79
80
15.5k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
15.5k
    return EVMC_SUCCESS;
84
15.5k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)48>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
56.9k
{
48
56.9k
    static_assert(
49
56.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
56.9k
        "undefined instructions must not be handled by check_requirements()");
51
52
56.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
56.9k
    {
67
56.9k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
56.9k
            "unexpected instruction with multiple results");
69
56.9k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
56.9k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
56.9k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
56.9k
    return EVMC_SUCCESS;
84
56.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)49>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
7.86k
{
48
7.86k
    static_assert(
49
7.86k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
7.86k
        "undefined instructions must not be handled by check_requirements()");
51
52
7.86k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
7.86k
    {
55
7.86k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
7.86k
        if (INTX_UNLIKELY(gas_cost < 0))
60
0
            return EVMC_UNDEFINED_INSTRUCTION;
61
7.86k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
7.86k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
7.86k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
7.86k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
7.86k
    }
79
80
7.86k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
7.86k
    return EVMC_SUCCESS;
84
7.86k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)50>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
23.6k
{
48
23.6k
    static_assert(
49
23.6k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
23.6k
        "undefined instructions must not be handled by check_requirements()");
51
52
23.6k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
23.6k
    {
67
23.6k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
23.6k
            "unexpected instruction with multiple results");
69
23.6k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
23.6k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
23.6k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
23.6k
    return EVMC_SUCCESS;
84
23.6k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)51>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
269k
{
48
269k
    static_assert(
49
269k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
269k
        "undefined instructions must not be handled by check_requirements()");
51
52
269k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
269k
    {
67
269k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
269k
            "unexpected instruction with multiple results");
69
269k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
269k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
269k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
6
        return EVMC_OUT_OF_GAS;
82
83
269k
    return EVMC_SUCCESS;
84
269k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)52>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
24.9k
{
48
24.9k
    static_assert(
49
24.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
24.9k
        "undefined instructions must not be handled by check_requirements()");
51
52
24.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
24.9k
    {
67
24.9k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
24.9k
            "unexpected instruction with multiple results");
69
24.9k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
24.9k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
24.9k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
24.9k
    return EVMC_SUCCESS;
84
24.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)53>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
1.82M
{
48
1.82M
    static_assert(
49
1.82M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
1.82M
        "undefined instructions must not be handled by check_requirements()");
51
52
1.82M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
1.82M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
1.82M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
1.82M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
1.82M
    }
79
80
1.82M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
6
        return EVMC_OUT_OF_GAS;
82
83
1.82M
    return EVMC_SUCCESS;
84
1.82M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)54>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
107k
{
48
107k
    static_assert(
49
107k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
107k
        "undefined instructions must not be handled by check_requirements()");
51
52
107k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
107k
    {
67
107k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
107k
            "unexpected instruction with multiple results");
69
107k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
107k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
107k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
107k
    return EVMC_SUCCESS;
84
107k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)55>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
121k
{
48
121k
    static_assert(
49
121k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
121k
        "undefined instructions must not be handled by check_requirements()");
51
52
121k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
121k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
121k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
121k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
48
            return EVMC_STACK_UNDERFLOW;
78
121k
    }
79
80
121k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
121k
    return EVMC_SUCCESS;
84
121k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)56>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
21.2k
{
48
21.2k
    static_assert(
49
21.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
21.2k
        "undefined instructions must not be handled by check_requirements()");
51
52
21.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
21.2k
    {
67
21.2k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
21.2k
            "unexpected instruction with multiple results");
69
21.2k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
21.2k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
21.2k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
21.2k
    return EVMC_SUCCESS;
84
21.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)57>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
23.2k
{
48
23.2k
    static_assert(
49
23.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
23.2k
        "undefined instructions must not be handled by check_requirements()");
51
52
23.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
23.2k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
23.2k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
23.2k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
23.2k
    }
79
80
23.2k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
23.2k
    return EVMC_SUCCESS;
84
23.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)58>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
13.4k
{
48
13.4k
    static_assert(
49
13.4k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
13.4k
        "undefined instructions must not be handled by check_requirements()");
51
52
13.4k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
13.4k
    {
67
13.4k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
13.4k
            "unexpected instruction with multiple results");
69
13.4k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
13.4k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
13.4k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
13.4k
    return EVMC_SUCCESS;
84
13.4k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)59>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
470k
{
48
470k
    static_assert(
49
470k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
470k
        "undefined instructions must not be handled by check_requirements()");
51
52
470k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
470k
    {
55
470k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
470k
        if (INTX_UNLIKELY(gas_cost < 0))
60
0
            return EVMC_UNDEFINED_INSTRUCTION;
61
470k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
470k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
470k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
470k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
470k
    }
79
80
470k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
402
        return EVMC_OUT_OF_GAS;
82
83
470k
    return EVMC_SUCCESS;
84
470k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)60>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
12.8k
{
48
12.8k
    static_assert(
49
12.8k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
12.8k
        "undefined instructions must not be handled by check_requirements()");
51
52
12.8k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
12.8k
    {
55
12.8k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
12.8k
        if (INTX_UNLIKELY(gas_cost < 0))
60
0
            return EVMC_UNDEFINED_INSTRUCTION;
61
12.8k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
12.8k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
12.8k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
12.8k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
12.8k
    }
79
80
12.8k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
24
        return EVMC_OUT_OF_GAS;
82
83
12.8k
    return EVMC_SUCCESS;
84
12.8k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)61>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
58.6k
{
48
58.6k
    static_assert(
49
58.6k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
58.6k
        "undefined instructions must not be handled by check_requirements()");
51
52
58.6k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
58.6k
    {
55
58.6k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
58.6k
        if (INTX_UNLIKELY(gas_cost < 0))
60
80
            return EVMC_UNDEFINED_INSTRUCTION;
61
58.6k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
58.6k
    {
67
58.6k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
58.6k
            "unexpected instruction with multiple results");
69
58.6k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
0
            return EVMC_STACK_OVERFLOW;
71
58.6k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
58.6k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
58.6k
    return EVMC_SUCCESS;
84
58.6k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)62>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
8.97k
{
48
8.97k
    static_assert(
49
8.97k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
8.97k
        "undefined instructions must not be handled by check_requirements()");
51
52
8.97k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
8.97k
    {
55
8.97k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
8.97k
        if (INTX_UNLIKELY(gas_cost < 0))
60
80
            return EVMC_UNDEFINED_INSTRUCTION;
61
8.97k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
8.97k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
8.97k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
8.97k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
6
            return EVMC_STACK_UNDERFLOW;
78
8.97k
    }
79
80
8.97k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
8.97k
    return EVMC_SUCCESS;
84
8.97k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)63>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
3.50k
{
48
3.50k
    static_assert(
49
3.50k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
3.50k
        "undefined instructions must not be handled by check_requirements()");
51
52
3.50k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
3.50k
    {
55
3.50k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
3.50k
        if (INTX_UNLIKELY(gas_cost < 0))
60
154
            return EVMC_UNDEFINED_INSTRUCTION;
61
3.50k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
3.50k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
3.50k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
3.50k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
12
            return EVMC_STACK_UNDERFLOW;
78
3.50k
    }
79
80
3.50k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
3.50k
    return EVMC_SUCCESS;
84
3.50k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)64>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
69.7k
{
48
69.7k
    static_assert(
49
69.7k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
69.7k
        "undefined instructions must not be handled by check_requirements()");
51
52
69.7k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
69.7k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
69.7k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
69.7k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
69.7k
    }
79
80
69.7k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
69.7k
    return EVMC_SUCCESS;
84
69.7k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)65>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
14.9k
{
48
14.9k
    static_assert(
49
14.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
14.9k
        "undefined instructions must not be handled by check_requirements()");
51
52
14.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
14.9k
    {
67
14.9k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
14.9k
            "unexpected instruction with multiple results");
69
14.9k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
14.9k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
14.9k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
14.9k
    return EVMC_SUCCESS;
84
14.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)66>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
147k
{
48
147k
    static_assert(
49
147k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
147k
        "undefined instructions must not be handled by check_requirements()");
51
52
147k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
147k
    {
67
147k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
147k
            "unexpected instruction with multiple results");
69
147k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
147k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
147k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
147k
    return EVMC_SUCCESS;
84
147k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)67>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
133k
{
48
133k
    static_assert(
49
133k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
133k
        "undefined instructions must not be handled by check_requirements()");
51
52
133k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
133k
    {
67
133k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
133k
            "unexpected instruction with multiple results");
69
133k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
133k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
133k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
133k
    return EVMC_SUCCESS;
84
133k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)68>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
13.7k
{
48
13.7k
    static_assert(
49
13.7k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
13.7k
        "undefined instructions must not be handled by check_requirements()");
51
52
13.7k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
13.7k
    {
67
13.7k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
13.7k
            "unexpected instruction with multiple results");
69
13.7k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
13.7k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
13.7k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
13.7k
    return EVMC_SUCCESS;
84
13.7k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)69>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
15.2k
{
48
15.2k
    static_assert(
49
15.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
15.2k
        "undefined instructions must not be handled by check_requirements()");
51
52
15.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
15.2k
    {
67
15.2k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
15.2k
            "unexpected instruction with multiple results");
69
15.2k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
15.2k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
15.2k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
15.2k
    return EVMC_SUCCESS;
84
15.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)70>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
652
{
48
652
    static_assert(
49
652
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
652
        "undefined instructions must not be handled by check_requirements()");
51
52
652
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
652
    {
55
652
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
652
        if (INTX_UNLIKELY(gas_cost < 0))
60
238
            return EVMC_UNDEFINED_INSTRUCTION;
61
652
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
652
    {
67
652
        static_assert(instr::traits[Op].stack_height_change == 1,
68
652
            "unexpected instruction with multiple results");
69
652
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
0
            return EVMC_STACK_OVERFLOW;
71
652
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
652
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
652
    return EVMC_SUCCESS;
84
652
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)71>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
1.76k
{
48
1.76k
    static_assert(
49
1.76k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
1.76k
        "undefined instructions must not be handled by check_requirements()");
51
52
1.76k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
1.76k
    {
55
1.76k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
1.76k
        if (INTX_UNLIKELY(gas_cost < 0))
60
238
            return EVMC_UNDEFINED_INSTRUCTION;
61
1.76k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
1.76k
    {
67
1.76k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
1.76k
            "unexpected instruction with multiple results");
69
1.76k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
0
            return EVMC_STACK_OVERFLOW;
71
1.76k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
1.76k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
1.76k
    return EVMC_SUCCESS;
84
1.76k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)72>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
926
{
48
926
    static_assert(
49
926
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
926
        "undefined instructions must not be handled by check_requirements()");
51
52
926
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
926
    {
55
926
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
926
        if (INTX_UNLIKELY(gas_cost < 0))
60
406
            return EVMC_UNDEFINED_INSTRUCTION;
61
926
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
926
    {
67
926
        static_assert(instr::traits[Op].stack_height_change == 1,
68
926
            "unexpected instruction with multiple results");
69
926
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
0
            return EVMC_STACK_OVERFLOW;
71
926
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
926
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
926
    return EVMC_SUCCESS;
84
926
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)73>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
3.52k
{
48
3.52k
    static_assert(
49
3.52k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
3.52k
        "undefined instructions must not be handled by check_requirements()");
51
52
3.52k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
3.52k
    {
55
3.52k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
3.52k
        if (INTX_UNLIKELY(gas_cost < 0))
60
658
            return EVMC_UNDEFINED_INSTRUCTION;
61
3.52k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
3.52k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
3.52k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
3.52k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
6
            return EVMC_STACK_UNDERFLOW;
78
3.52k
    }
79
80
3.52k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
3.52k
    return EVMC_SUCCESS;
84
3.52k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)74>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
13.4k
{
48
13.4k
    static_assert(
49
13.4k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
13.4k
        "undefined instructions must not be handled by check_requirements()");
51
52
13.4k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
13.4k
    {
55
13.4k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
13.4k
        if (INTX_UNLIKELY(gas_cost < 0))
60
662
            return EVMC_UNDEFINED_INSTRUCTION;
61
13.4k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
13.4k
    {
67
13.4k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
13.4k
            "unexpected instruction with multiple results");
69
13.4k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
13.4k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
13.4k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
6
        return EVMC_OUT_OF_GAS;
82
83
13.4k
    return EVMC_SUCCESS;
84
13.4k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)80>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
4.52M
{
48
4.52M
    static_assert(
49
4.52M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
4.52M
        "undefined instructions must not be handled by check_requirements()");
51
52
4.52M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
4.52M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
4.52M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
4.52M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
48
            return EVMC_STACK_UNDERFLOW;
78
4.52M
    }
79
80
4.52M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
80
        return EVMC_OUT_OF_GAS;
82
83
4.52M
    return EVMC_SUCCESS;
84
4.52M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)81>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
11.9M
{
48
11.9M
    static_assert(
49
11.9M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
11.9M
        "undefined instructions must not be handled by check_requirements()");
51
52
11.9M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
11.9M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
11.9M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
11.9M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
11.9M
    }
79
80
11.9M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
6
        return EVMC_OUT_OF_GAS;
82
83
11.9M
    return EVMC_SUCCESS;
84
11.9M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)82>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
8.58M
{
48
8.58M
    static_assert(
49
8.58M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
8.58M
        "undefined instructions must not be handled by check_requirements()");
51
52
8.58M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
8.58M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
8.58M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
8.58M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
8.58M
    }
79
80
8.58M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
50
        return EVMC_OUT_OF_GAS;
82
83
8.58M
    return EVMC_SUCCESS;
84
8.58M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)83>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
155k
{
48
155k
    static_assert(
49
155k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
155k
        "undefined instructions must not be handled by check_requirements()");
51
52
155k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
155k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
155k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
155k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
155k
    }
79
80
155k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
155k
    return EVMC_SUCCESS;
84
155k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)84>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
1.01M
{
48
1.01M
    static_assert(
49
1.01M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
1.01M
        "undefined instructions must not be handled by check_requirements()");
51
52
1.01M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
1.01M
    {
55
1.01M
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
1.01M
        if (INTX_UNLIKELY(gas_cost < 0))
60
0
            return EVMC_UNDEFINED_INSTRUCTION;
61
1.01M
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
1.01M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
1.01M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
1.01M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
1.01M
    }
79
80
1.01M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
4
        return EVMC_OUT_OF_GAS;
82
83
1.01M
    return EVMC_SUCCESS;
84
1.01M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)85>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
4.69M
{
48
4.69M
    static_assert(
49
4.69M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
4.69M
        "undefined instructions must not be handled by check_requirements()");
51
52
4.69M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
4.69M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
4.69M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
4.69M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
4.69M
    }
79
80
4.69M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
4.69M
    return EVMC_SUCCESS;
84
4.69M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)86>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
5.33M
{
48
5.33M
    static_assert(
49
5.33M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
5.33M
        "undefined instructions must not be handled by check_requirements()");
51
52
5.33M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
5.33M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
5.33M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
5.33M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
5.33M
    }
79
80
5.33M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
60
        return EVMC_OUT_OF_GAS;
82
83
5.33M
    return EVMC_SUCCESS;
84
5.33M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)87>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
6.93M
{
48
6.93M
    static_assert(
49
6.93M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
6.93M
        "undefined instructions must not be handled by check_requirements()");
51
52
6.93M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
6.93M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
6.93M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
6.93M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
12
            return EVMC_STACK_UNDERFLOW;
78
6.93M
    }
79
80
6.93M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
8
        return EVMC_OUT_OF_GAS;
82
83
6.93M
    return EVMC_SUCCESS;
84
6.93M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)88>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
5.49M
{
48
5.49M
    static_assert(
49
5.49M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
5.49M
        "undefined instructions must not be handled by check_requirements()");
51
52
5.49M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
5.49M
    {
67
5.49M
        static_assert(instr::traits[Op].stack_height_change == 1,
68
5.49M
            "unexpected instruction with multiple results");
69
5.49M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
22
            return EVMC_STACK_OVERFLOW;
71
5.49M
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
5.49M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
40
        return EVMC_OUT_OF_GAS;
82
83
5.49M
    return EVMC_SUCCESS;
84
5.49M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)89>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
16.5k
{
48
16.5k
    static_assert(
49
16.5k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
16.5k
        "undefined instructions must not be handled by check_requirements()");
51
52
16.5k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
16.5k
    {
67
16.5k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
16.5k
            "unexpected instruction with multiple results");
69
16.5k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
16.5k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
16.5k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
16.5k
    return EVMC_SUCCESS;
84
16.5k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)90>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
16.5M
{
48
16.5M
    static_assert(
49
16.5M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
16.5M
        "undefined instructions must not be handled by check_requirements()");
51
52
16.5M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
16.5M
    {
67
16.5M
        static_assert(instr::traits[Op].stack_height_change == 1,
68
16.5M
            "unexpected instruction with multiple results");
69
16.5M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
16.5M
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
16.5M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
10
        return EVMC_OUT_OF_GAS;
82
83
16.5M
    return EVMC_SUCCESS;
84
16.5M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)91>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
23.8M
{
48
23.8M
    static_assert(
49
23.8M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
23.8M
        "undefined instructions must not be handled by check_requirements()");
51
52
23.8M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
23.8M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
14
        return EVMC_OUT_OF_GAS;
82
83
23.8M
    return EVMC_SUCCESS;
84
23.8M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)92>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
1.89M
{
48
1.89M
    static_assert(
49
1.89M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
1.89M
        "undefined instructions must not be handled by check_requirements()");
51
52
1.89M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
1.89M
    {
55
1.89M
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
1.89M
        if (INTX_UNLIKELY(gas_cost < 0))
60
658
            return EVMC_UNDEFINED_INSTRUCTION;
61
1.89M
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
1.89M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
1.89M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
1.89M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
1.89M
    }
79
80
1.89M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
1.89M
    return EVMC_SUCCESS;
84
1.89M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)93>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
9.08M
{
48
9.08M
    static_assert(
49
9.08M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
9.08M
        "undefined instructions must not be handled by check_requirements()");
51
52
9.08M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
9.08M
    {
55
9.08M
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
9.08M
        if (INTX_UNLIKELY(gas_cost < 0))
60
658
            return EVMC_UNDEFINED_INSTRUCTION;
61
9.08M
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
9.08M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
9.08M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
9.08M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
48
            return EVMC_STACK_UNDERFLOW;
78
9.08M
    }
79
80
9.08M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
30
        return EVMC_OUT_OF_GAS;
82
83
9.07M
    return EVMC_SUCCESS;
84
9.08M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)94>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
2.24k
{
48
2.24k
    static_assert(
49
2.24k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
2.24k
        "undefined instructions must not be handled by check_requirements()");
51
52
2.24k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
2.24k
    {
55
2.24k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
2.24k
        if (INTX_UNLIKELY(gas_cost < 0))
60
658
            return EVMC_UNDEFINED_INSTRUCTION;
61
2.24k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
2.24k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
2.24k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
2.24k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
12
            return EVMC_STACK_UNDERFLOW;
78
2.24k
    }
79
80
2.24k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
48
        return EVMC_OUT_OF_GAS;
82
83
2.19k
    return EVMC_SUCCESS;
84
2.24k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)95>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
1.15M
{
48
1.15M
    static_assert(
49
1.15M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
1.15M
        "undefined instructions must not be handled by check_requirements()");
51
52
1.15M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
1.15M
    {
55
1.15M
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
1.15M
        if (INTX_UNLIKELY(gas_cost < 0))
60
584
            return EVMC_UNDEFINED_INSTRUCTION;
61
1.15M
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
1.15M
    {
67
1.15M
        static_assert(instr::traits[Op].stack_height_change == 1,
68
1.15M
            "unexpected instruction with multiple results");
69
1.15M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
32
            return EVMC_STACK_OVERFLOW;
71
1.15M
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
1.15M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
18
        return EVMC_OUT_OF_GAS;
82
83
1.15M
    return EVMC_SUCCESS;
84
1.15M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)96>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
76.2M
{
48
76.2M
    static_assert(
49
76.2M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
76.2M
        "undefined instructions must not be handled by check_requirements()");
51
52
76.2M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
76.2M
    {
67
76.2M
        static_assert(instr::traits[Op].stack_height_change == 1,
68
76.2M
            "unexpected instruction with multiple results");
69
76.2M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
60
            return EVMC_STACK_OVERFLOW;
71
76.2M
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
76.2M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
3.66k
        return EVMC_OUT_OF_GAS;
82
83
76.2M
    return EVMC_SUCCESS;
84
76.2M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)97>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
10.0M
{
48
10.0M
    static_assert(
49
10.0M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
10.0M
        "undefined instructions must not be handled by check_requirements()");
51
52
10.0M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
10.0M
    {
67
10.0M
        static_assert(instr::traits[Op].stack_height_change == 1,
68
10.0M
            "unexpected instruction with multiple results");
69
10.0M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
10.0M
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
10.0M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
120
        return EVMC_OUT_OF_GAS;
82
83
10.0M
    return EVMC_SUCCESS;
84
10.0M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)98>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
1.32M
{
48
1.32M
    static_assert(
49
1.32M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
1.32M
        "undefined instructions must not be handled by check_requirements()");
51
52
1.32M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
1.32M
    {
67
1.32M
        static_assert(instr::traits[Op].stack_height_change == 1,
68
1.32M
            "unexpected instruction with multiple results");
69
1.32M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
1.32M
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
1.32M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
6
        return EVMC_OUT_OF_GAS;
82
83
1.32M
    return EVMC_SUCCESS;
84
1.32M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)99>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
119k
{
48
119k
    static_assert(
49
119k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
119k
        "undefined instructions must not be handled by check_requirements()");
51
52
119k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
119k
    {
67
119k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
119k
            "unexpected instruction with multiple results");
69
119k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
119k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
119k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
119k
    return EVMC_SUCCESS;
84
119k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)100>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
58.2k
{
48
58.2k
    static_assert(
49
58.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
58.2k
        "undefined instructions must not be handled by check_requirements()");
51
52
58.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
58.2k
    {
67
58.2k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
58.2k
            "unexpected instruction with multiple results");
69
58.2k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
58.2k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
58.2k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
58.2k
    return EVMC_SUCCESS;
84
58.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)101>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
111k
{
48
111k
    static_assert(
49
111k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
111k
        "undefined instructions must not be handled by check_requirements()");
51
52
111k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
111k
    {
67
111k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
111k
            "unexpected instruction with multiple results");
69
111k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
111k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
111k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
111k
    return EVMC_SUCCESS;
84
111k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)102>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
46.6k
{
48
46.6k
    static_assert(
49
46.6k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
46.6k
        "undefined instructions must not be handled by check_requirements()");
51
52
46.6k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
46.6k
    {
67
46.6k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
46.6k
            "unexpected instruction with multiple results");
69
46.6k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
46.6k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
46.6k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
46.6k
    return EVMC_SUCCESS;
84
46.6k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)103>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
47.3k
{
48
47.3k
    static_assert(
49
47.3k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
47.3k
        "undefined instructions must not be handled by check_requirements()");
51
52
47.3k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
47.3k
    {
67
47.3k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
47.3k
            "unexpected instruction with multiple results");
69
47.3k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
47.3k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
47.3k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
4
        return EVMC_OUT_OF_GAS;
82
83
47.3k
    return EVMC_SUCCESS;
84
47.3k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)104>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
40.4k
{
48
40.4k
    static_assert(
49
40.4k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
40.4k
        "undefined instructions must not be handled by check_requirements()");
51
52
40.4k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
40.4k
    {
67
40.4k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
40.4k
            "unexpected instruction with multiple results");
69
40.4k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
40.4k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
40.4k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
40.4k
    return EVMC_SUCCESS;
84
40.4k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)105>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
34.7k
{
48
34.7k
    static_assert(
49
34.7k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
34.7k
        "undefined instructions must not be handled by check_requirements()");
51
52
34.7k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
34.7k
    {
67
34.7k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
34.7k
            "unexpected instruction with multiple results");
69
34.7k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
34.7k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
34.7k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
34.7k
    return EVMC_SUCCESS;
84
34.7k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)106>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
28.8k
{
48
28.8k
    static_assert(
49
28.8k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
28.8k
        "undefined instructions must not be handled by check_requirements()");
51
52
28.8k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
28.8k
    {
67
28.8k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
28.8k
            "unexpected instruction with multiple results");
69
28.8k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
28.8k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
28.8k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
28.8k
    return EVMC_SUCCESS;
84
28.8k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)107>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
40.4k
{
48
40.4k
    static_assert(
49
40.4k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
40.4k
        "undefined instructions must not be handled by check_requirements()");
51
52
40.4k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
40.4k
    {
67
40.4k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
40.4k
            "unexpected instruction with multiple results");
69
40.4k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
40.4k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
40.4k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
40.4k
    return EVMC_SUCCESS;
84
40.4k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)108>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
38.8k
{
48
38.8k
    static_assert(
49
38.8k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
38.8k
        "undefined instructions must not be handled by check_requirements()");
51
52
38.8k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
38.8k
    {
67
38.8k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
38.8k
            "unexpected instruction with multiple results");
69
38.8k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
38.8k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
38.8k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
38.8k
    return EVMC_SUCCESS;
84
38.8k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)109>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
34.1k
{
48
34.1k
    static_assert(
49
34.1k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
34.1k
        "undefined instructions must not be handled by check_requirements()");
51
52
34.1k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
34.1k
    {
67
34.1k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
34.1k
            "unexpected instruction with multiple results");
69
34.1k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
34.1k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
34.1k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
34.1k
    return EVMC_SUCCESS;
84
34.1k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)110>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
29.0k
{
48
29.0k
    static_assert(
49
29.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
29.0k
        "undefined instructions must not be handled by check_requirements()");
51
52
29.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
29.0k
    {
67
29.0k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
29.0k
            "unexpected instruction with multiple results");
69
29.0k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
29.0k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
29.0k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
29.0k
    return EVMC_SUCCESS;
84
29.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)111>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
48.5k
{
48
48.5k
    static_assert(
49
48.5k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
48.5k
        "undefined instructions must not be handled by check_requirements()");
51
52
48.5k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
48.5k
    {
67
48.5k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
48.5k
            "unexpected instruction with multiple results");
69
48.5k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
48.5k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
48.5k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
48.5k
    return EVMC_SUCCESS;
84
48.5k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)112>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
21.2k
{
48
21.2k
    static_assert(
49
21.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
21.2k
        "undefined instructions must not be handled by check_requirements()");
51
52
21.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
21.2k
    {
67
21.2k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
21.2k
            "unexpected instruction with multiple results");
69
21.2k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
21.2k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
21.2k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
21.2k
    return EVMC_SUCCESS;
84
21.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)113>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
66.2k
{
48
66.2k
    static_assert(
49
66.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
66.2k
        "undefined instructions must not be handled by check_requirements()");
51
52
66.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
66.2k
    {
67
66.2k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
66.2k
            "unexpected instruction with multiple results");
69
66.2k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
66.2k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
66.2k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
66.2k
    return EVMC_SUCCESS;
84
66.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)114>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
30.7k
{
48
30.7k
    static_assert(
49
30.7k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
30.7k
        "undefined instructions must not be handled by check_requirements()");
51
52
30.7k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
30.7k
    {
67
30.7k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
30.7k
            "unexpected instruction with multiple results");
69
30.7k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
30.7k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
30.7k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
30.7k
    return EVMC_SUCCESS;
84
30.7k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)115>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
2.23M
{
48
2.23M
    static_assert(
49
2.23M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
2.23M
        "undefined instructions must not be handled by check_requirements()");
51
52
2.23M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
2.23M
    {
67
2.23M
        static_assert(instr::traits[Op].stack_height_change == 1,
68
2.23M
            "unexpected instruction with multiple results");
69
2.23M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
2.23M
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
2.23M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
22
        return EVMC_OUT_OF_GAS;
82
83
2.23M
    return EVMC_SUCCESS;
84
2.23M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)116>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
45.0k
{
48
45.0k
    static_assert(
49
45.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
45.0k
        "undefined instructions must not be handled by check_requirements()");
51
52
45.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
45.0k
    {
67
45.0k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
45.0k
            "unexpected instruction with multiple results");
69
45.0k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
45.0k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
45.0k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
45.0k
    return EVMC_SUCCESS;
84
45.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)117>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
37.3k
{
48
37.3k
    static_assert(
49
37.3k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
37.3k
        "undefined instructions must not be handled by check_requirements()");
51
52
37.3k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
37.3k
    {
67
37.3k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
37.3k
            "unexpected instruction with multiple results");
69
37.3k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
37.3k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
37.3k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
37.3k
    return EVMC_SUCCESS;
84
37.3k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)118>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
37.9k
{
48
37.9k
    static_assert(
49
37.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
37.9k
        "undefined instructions must not be handled by check_requirements()");
51
52
37.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
37.9k
    {
67
37.9k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
37.9k
            "unexpected instruction with multiple results");
69
37.9k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
37.9k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
37.9k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
37.9k
    return EVMC_SUCCESS;
84
37.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)119>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
31.8k
{
48
31.8k
    static_assert(
49
31.8k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
31.8k
        "undefined instructions must not be handled by check_requirements()");
51
52
31.8k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
31.8k
    {
67
31.8k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
31.8k
            "unexpected instruction with multiple results");
69
31.8k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
31.8k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
31.8k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
31.8k
    return EVMC_SUCCESS;
84
31.8k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)120>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
30.1k
{
48
30.1k
    static_assert(
49
30.1k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
30.1k
        "undefined instructions must not be handled by check_requirements()");
51
52
30.1k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
30.1k
    {
67
30.1k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
30.1k
            "unexpected instruction with multiple results");
69
30.1k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
30.1k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
30.1k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
30.1k
    return EVMC_SUCCESS;
84
30.1k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)121>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
41.0k
{
48
41.0k
    static_assert(
49
41.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
41.0k
        "undefined instructions must not be handled by check_requirements()");
51
52
41.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
41.0k
    {
67
41.0k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
41.0k
            "unexpected instruction with multiple results");
69
41.0k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
41.0k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
41.0k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
41.0k
    return EVMC_SUCCESS;
84
41.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)122>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
42.0k
{
48
42.0k
    static_assert(
49
42.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
42.0k
        "undefined instructions must not be handled by check_requirements()");
51
52
42.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
42.0k
    {
67
42.0k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
42.0k
            "unexpected instruction with multiple results");
69
42.0k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
42.0k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
42.0k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
42.0k
    return EVMC_SUCCESS;
84
42.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)123>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
28.7k
{
48
28.7k
    static_assert(
49
28.7k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
28.7k
        "undefined instructions must not be handled by check_requirements()");
51
52
28.7k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
28.7k
    {
67
28.7k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
28.7k
            "unexpected instruction with multiple results");
69
28.7k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
28.7k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
28.7k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
28.7k
    return EVMC_SUCCESS;
84
28.7k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)124>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
34.4k
{
48
34.4k
    static_assert(
49
34.4k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
34.4k
        "undefined instructions must not be handled by check_requirements()");
51
52
34.4k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
34.4k
    {
67
34.4k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
34.4k
            "unexpected instruction with multiple results");
69
34.4k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
34.4k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
34.4k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
4
        return EVMC_OUT_OF_GAS;
82
83
34.3k
    return EVMC_SUCCESS;
84
34.4k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)125>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
24.9k
{
48
24.9k
    static_assert(
49
24.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
24.9k
        "undefined instructions must not be handled by check_requirements()");
51
52
24.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
24.9k
    {
67
24.9k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
24.9k
            "unexpected instruction with multiple results");
69
24.9k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
24.9k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
24.9k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
24.9k
    return EVMC_SUCCESS;
84
24.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)126>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
93.2k
{
48
93.2k
    static_assert(
49
93.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
93.2k
        "undefined instructions must not be handled by check_requirements()");
51
52
93.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
93.2k
    {
67
93.2k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
93.2k
            "unexpected instruction with multiple results");
69
93.2k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
93.2k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
93.2k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
93.2k
    return EVMC_SUCCESS;
84
93.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)127>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
301k
{
48
301k
    static_assert(
49
301k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
301k
        "undefined instructions must not be handled by check_requirements()");
51
52
301k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
301k
    {
67
301k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
301k
            "unexpected instruction with multiple results");
69
301k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
30
            return EVMC_STACK_OVERFLOW;
71
301k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
301k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
301k
    return EVMC_SUCCESS;
84
301k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)128>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
5.87M
{
48
5.87M
    static_assert(
49
5.87M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
5.87M
        "undefined instructions must not be handled by check_requirements()");
51
52
5.87M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
5.87M
    {
67
5.87M
        static_assert(instr::traits[Op].stack_height_change == 1,
68
5.87M
            "unexpected instruction with multiple results");
69
5.87M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
5.87M
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
5.87M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
5.87M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
5.87M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
5.87M
    }
79
80
5.87M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
5.87M
    return EVMC_SUCCESS;
84
5.87M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)129>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
1.25M
{
48
1.25M
    static_assert(
49
1.25M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
1.25M
        "undefined instructions must not be handled by check_requirements()");
51
52
1.25M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
1.25M
    {
67
1.25M
        static_assert(instr::traits[Op].stack_height_change == 1,
68
1.25M
            "unexpected instruction with multiple results");
69
1.25M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
1.25M
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
1.25M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
1.25M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
1.25M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
1.25M
    }
79
80
1.25M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
1.25M
    return EVMC_SUCCESS;
84
1.25M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)130>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
617k
{
48
617k
    static_assert(
49
617k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
617k
        "undefined instructions must not be handled by check_requirements()");
51
52
617k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
617k
    {
67
617k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
617k
            "unexpected instruction with multiple results");
69
617k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
617k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
617k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
617k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
617k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
617k
    }
79
80
617k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
617k
    return EVMC_SUCCESS;
84
617k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)131>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
291k
{
48
291k
    static_assert(
49
291k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
291k
        "undefined instructions must not be handled by check_requirements()");
51
52
291k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
291k
    {
67
291k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
291k
            "unexpected instruction with multiple results");
69
291k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
291k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
291k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
291k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
291k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
291k
    }
79
80
291k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
291k
    return EVMC_SUCCESS;
84
291k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)132>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
126k
{
48
126k
    static_assert(
49
126k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
126k
        "undefined instructions must not be handled by check_requirements()");
51
52
126k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
126k
    {
67
126k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
126k
            "unexpected instruction with multiple results");
69
126k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
126k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
126k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
126k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
126k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
42
            return EVMC_STACK_UNDERFLOW;
78
126k
    }
79
80
126k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
126k
    return EVMC_SUCCESS;
84
126k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)133>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
64.9k
{
48
64.9k
    static_assert(
49
64.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
64.9k
        "undefined instructions must not be handled by check_requirements()");
51
52
64.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
64.9k
    {
67
64.9k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
64.9k
            "unexpected instruction with multiple results");
69
64.9k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
64.9k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
64.9k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
64.9k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
64.9k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
64.9k
    }
79
80
64.9k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
64.9k
    return EVMC_SUCCESS;
84
64.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)134>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
47.8k
{
48
47.8k
    static_assert(
49
47.8k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
47.8k
        "undefined instructions must not be handled by check_requirements()");
51
52
47.8k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
47.8k
    {
67
47.8k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
47.8k
            "unexpected instruction with multiple results");
69
47.8k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
47.8k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
47.8k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
47.8k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
47.8k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
47.8k
    }
79
80
47.8k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
47.8k
    return EVMC_SUCCESS;
84
47.8k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)135>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
443k
{
48
443k
    static_assert(
49
443k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
443k
        "undefined instructions must not be handled by check_requirements()");
51
52
443k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
443k
    {
67
443k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
443k
            "unexpected instruction with multiple results");
69
443k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
443k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
443k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
443k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
443k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
443k
    }
79
80
443k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
443k
    return EVMC_SUCCESS;
84
443k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)136>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
27.0k
{
48
27.0k
    static_assert(
49
27.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
27.0k
        "undefined instructions must not be handled by check_requirements()");
51
52
27.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
27.0k
    {
67
27.0k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
27.0k
            "unexpected instruction with multiple results");
69
27.0k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
27.0k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
27.0k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
27.0k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
27.0k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
36
            return EVMC_STACK_UNDERFLOW;
78
27.0k
    }
79
80
27.0k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
27.0k
    return EVMC_SUCCESS;
84
27.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)137>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
53.3k
{
48
53.3k
    static_assert(
49
53.3k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
53.3k
        "undefined instructions must not be handled by check_requirements()");
51
52
53.3k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
53.3k
    {
67
53.3k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
53.3k
            "unexpected instruction with multiple results");
69
53.3k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
53.3k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
53.3k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
53.3k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
53.3k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
53.3k
    }
79
80
53.3k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
4
        return EVMC_OUT_OF_GAS;
82
83
53.3k
    return EVMC_SUCCESS;
84
53.3k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)138>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
24.9k
{
48
24.9k
    static_assert(
49
24.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
24.9k
        "undefined instructions must not be handled by check_requirements()");
51
52
24.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
24.9k
    {
67
24.9k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
24.9k
            "unexpected instruction with multiple results");
69
24.9k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
24.9k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
24.9k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
24.9k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
24.9k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
24.9k
    }
79
80
24.9k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
24.9k
    return EVMC_SUCCESS;
84
24.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)139>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
16.5k
{
48
16.5k
    static_assert(
49
16.5k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
16.5k
        "undefined instructions must not be handled by check_requirements()");
51
52
16.5k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
16.5k
    {
67
16.5k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
16.5k
            "unexpected instruction with multiple results");
69
16.5k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
16.5k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
16.5k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
16.5k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
16.5k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
36
            return EVMC_STACK_UNDERFLOW;
78
16.5k
    }
79
80
16.5k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
16.5k
    return EVMC_SUCCESS;
84
16.5k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)140>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
30.5k
{
48
30.5k
    static_assert(
49
30.5k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
30.5k
        "undefined instructions must not be handled by check_requirements()");
51
52
30.5k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
30.5k
    {
67
30.5k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
30.5k
            "unexpected instruction with multiple results");
69
30.5k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
30.5k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
30.5k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
30.5k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
30.5k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
30.5k
    }
79
80
30.5k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
30.5k
    return EVMC_SUCCESS;
84
30.5k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)141>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
15.0k
{
48
15.0k
    static_assert(
49
15.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
15.0k
        "undefined instructions must not be handled by check_requirements()");
51
52
15.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
15.0k
    {
67
15.0k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
15.0k
            "unexpected instruction with multiple results");
69
15.0k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
15.0k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
15.0k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
15.0k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
15.0k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
30
            return EVMC_STACK_UNDERFLOW;
78
15.0k
    }
79
80
15.0k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
15.0k
    return EVMC_SUCCESS;
84
15.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)142>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
25.2k
{
48
25.2k
    static_assert(
49
25.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
25.2k
        "undefined instructions must not be handled by check_requirements()");
51
52
25.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
25.2k
    {
67
25.2k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
25.2k
            "unexpected instruction with multiple results");
69
25.2k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
25.2k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
25.2k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
25.2k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
25.2k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
36
            return EVMC_STACK_UNDERFLOW;
78
25.2k
    }
79
80
25.2k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
25.2k
    return EVMC_SUCCESS;
84
25.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)143>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
17.3k
{
48
17.3k
    static_assert(
49
17.3k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
17.3k
        "undefined instructions must not be handled by check_requirements()");
51
52
17.3k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
17.3k
    {
67
17.3k
        static_assert(instr::traits[Op].stack_height_change == 1,
68
17.3k
            "unexpected instruction with multiple results");
69
17.3k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
6
            return EVMC_STACK_OVERFLOW;
71
17.3k
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
17.3k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
17.3k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
17.3k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
36
            return EVMC_STACK_UNDERFLOW;
78
17.3k
    }
79
80
17.3k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
17.3k
    return EVMC_SUCCESS;
84
17.3k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)144>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
722k
{
48
722k
    static_assert(
49
722k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
722k
        "undefined instructions must not be handled by check_requirements()");
51
52
722k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
722k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
722k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
722k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
722k
    }
79
80
722k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
722k
    return EVMC_SUCCESS;
84
722k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)145>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
402k
{
48
402k
    static_assert(
49
402k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
402k
        "undefined instructions must not be handled by check_requirements()");
51
52
402k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
402k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
402k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
402k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
402k
    }
79
80
402k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
402k
    return EVMC_SUCCESS;
84
402k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)146>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
271k
{
48
271k
    static_assert(
49
271k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
271k
        "undefined instructions must not be handled by check_requirements()");
51
52
271k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
271k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
271k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
271k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
271k
    }
79
80
271k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
271k
    return EVMC_SUCCESS;
84
271k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)147>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
87.3k
{
48
87.3k
    static_assert(
49
87.3k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
87.3k
        "undefined instructions must not be handled by check_requirements()");
51
52
87.3k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
87.3k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
87.3k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
87.3k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
87.3k
    }
79
80
87.3k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
87.3k
    return EVMC_SUCCESS;
84
87.3k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)148>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
36.9k
{
48
36.9k
    static_assert(
49
36.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
36.9k
        "undefined instructions must not be handled by check_requirements()");
51
52
36.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
36.9k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
36.9k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
36.9k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
36.9k
    }
79
80
36.9k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
36.9k
    return EVMC_SUCCESS;
84
36.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)149>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
8.23k
{
48
8.23k
    static_assert(
49
8.23k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
8.23k
        "undefined instructions must not be handled by check_requirements()");
51
52
8.23k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
8.23k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
8.23k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
8.23k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
8.23k
    }
79
80
8.23k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
8.23k
    return EVMC_SUCCESS;
84
8.23k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)150>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
3.82k
{
48
3.82k
    static_assert(
49
3.82k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
3.82k
        "undefined instructions must not be handled by check_requirements()");
51
52
3.82k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
3.82k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
3.82k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
3.82k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
30
            return EVMC_STACK_UNDERFLOW;
78
3.82k
    }
79
80
3.82k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
3.82k
    return EVMC_SUCCESS;
84
3.82k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)151>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
7.73k
{
48
7.73k
    static_assert(
49
7.73k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
7.73k
        "undefined instructions must not be handled by check_requirements()");
51
52
7.73k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
7.73k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
7.73k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
7.73k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
7.73k
    }
79
80
7.73k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
7.73k
    return EVMC_SUCCESS;
84
7.73k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)152>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
5.86k
{
48
5.86k
    static_assert(
49
5.86k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
5.86k
        "undefined instructions must not be handled by check_requirements()");
51
52
5.86k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
5.86k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
5.86k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
5.86k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
5.86k
    }
79
80
5.86k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
5.86k
    return EVMC_SUCCESS;
84
5.86k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)153>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
2.24k
{
48
2.24k
    static_assert(
49
2.24k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
2.24k
        "undefined instructions must not be handled by check_requirements()");
51
52
2.24k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
2.24k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
2.24k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
2.24k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
2.24k
    }
79
80
2.24k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
2.24k
    return EVMC_SUCCESS;
84
2.24k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)154>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
2.67k
{
48
2.67k
    static_assert(
49
2.67k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
2.67k
        "undefined instructions must not be handled by check_requirements()");
51
52
2.67k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
2.67k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
2.67k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
2.67k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
2.67k
    }
79
80
2.67k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
2.67k
    return EVMC_SUCCESS;
84
2.67k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)155>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
6.73k
{
48
6.73k
    static_assert(
49
6.73k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
6.73k
        "undefined instructions must not be handled by check_requirements()");
51
52
6.73k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
6.73k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
6.73k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
6.73k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
6.73k
    }
79
80
6.73k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
6.73k
    return EVMC_SUCCESS;
84
6.73k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)156>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
4.18k
{
48
4.18k
    static_assert(
49
4.18k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
4.18k
        "undefined instructions must not be handled by check_requirements()");
51
52
4.18k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
4.18k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
4.18k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
4.18k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
4.18k
    }
79
80
4.18k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
4
        return EVMC_OUT_OF_GAS;
82
83
4.18k
    return EVMC_SUCCESS;
84
4.18k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)157>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
3.60k
{
48
3.60k
    static_assert(
49
3.60k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
3.60k
        "undefined instructions must not be handled by check_requirements()");
51
52
3.60k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
3.60k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
3.60k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
3.60k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
3.60k
    }
79
80
3.60k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
3.60k
    return EVMC_SUCCESS;
84
3.60k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)158>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
2.35k
{
48
2.35k
    static_assert(
49
2.35k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
2.35k
        "undefined instructions must not be handled by check_requirements()");
51
52
2.35k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
2.35k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
2.35k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
2.35k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
2.35k
    }
79
80
2.35k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
2.35k
    return EVMC_SUCCESS;
84
2.35k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)159>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
2.35k
{
48
2.35k
    static_assert(
49
2.35k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
2.35k
        "undefined instructions must not be handled by check_requirements()");
51
52
2.35k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
2.35k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
2.35k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
2.35k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
2.35k
    }
79
80
2.35k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
2.35k
    return EVMC_SUCCESS;
84
2.35k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)160>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
9.38k
{
48
9.38k
    static_assert(
49
9.38k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
9.38k
        "undefined instructions must not be handled by check_requirements()");
51
52
9.38k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
9.38k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
9.38k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
9.38k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
9.38k
    }
79
80
9.38k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
4
        return EVMC_OUT_OF_GAS;
82
83
9.38k
    return EVMC_SUCCESS;
84
9.38k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)161>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
8.22k
{
48
8.22k
    static_assert(
49
8.22k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
8.22k
        "undefined instructions must not be handled by check_requirements()");
51
52
8.22k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
8.22k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
8.22k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
8.22k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
8.22k
    }
79
80
8.22k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
8.22k
    return EVMC_SUCCESS;
84
8.22k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)162>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
4.60k
{
48
4.60k
    static_assert(
49
4.60k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
4.60k
        "undefined instructions must not be handled by check_requirements()");
51
52
4.60k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
4.60k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
4.60k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
4.60k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
30
            return EVMC_STACK_UNDERFLOW;
78
4.60k
    }
79
80
4.60k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
4.60k
    return EVMC_SUCCESS;
84
4.60k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)163>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
6.78k
{
48
6.78k
    static_assert(
49
6.78k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
6.78k
        "undefined instructions must not be handled by check_requirements()");
51
52
6.78k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
6.78k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
6.78k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
6.78k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
6.78k
    }
79
80
6.78k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
6.78k
    return EVMC_SUCCESS;
84
6.78k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)164>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
767
{
48
767
    static_assert(
49
767
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
767
        "undefined instructions must not be handled by check_requirements()");
51
52
767
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
767
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
767
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
767
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
36
            return EVMC_STACK_UNDERFLOW;
78
767
    }
79
80
767
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
767
    return EVMC_SUCCESS;
84
767
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)208>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
476
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
476
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
476
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
0
            return EVMC_STACK_UNDERFLOW;
78
476
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)209>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
476
    {
67
476
        static_assert(instr::traits[Op].stack_height_change == 1,
68
476
            "unexpected instruction with multiple results");
69
476
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
0
            return EVMC_STACK_OVERFLOW;
71
476
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)210>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
476
    {
67
476
        static_assert(instr::traits[Op].stack_height_change == 1,
68
476
            "unexpected instruction with multiple results");
69
476
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
0
            return EVMC_STACK_OVERFLOW;
71
476
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)211>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
476
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
476
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
476
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
0
            return EVMC_STACK_UNDERFLOW;
78
476
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)224>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)225>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
476
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
476
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
476
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
0
            return EVMC_STACK_UNDERFLOW;
78
476
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)226>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
476
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
476
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
476
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
0
            return EVMC_STACK_UNDERFLOW;
78
476
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)227>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
482
{
48
482
    static_assert(
49
482
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
482
        "undefined instructions must not be handled by check_requirements()");
51
52
482
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
482
    {
55
482
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
482
        if (INTX_UNLIKELY(gas_cost < 0))
60
482
            return EVMC_UNDEFINED_INSTRUCTION;
61
482
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
482
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
482
    return EVMC_SUCCESS;
84
482
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)228>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)229>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)230>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
476
    {
67
476
        static_assert(instr::traits[Op].stack_height_change == 1,
68
476
            "unexpected instruction with multiple results");
69
476
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
0
            return EVMC_STACK_OVERFLOW;
71
476
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)231>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)232>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)236>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
476
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
476
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
476
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
0
            return EVMC_STACK_UNDERFLOW;
78
476
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)237>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
476
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
476
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
476
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
0
            return EVMC_STACK_UNDERFLOW;
78
476
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)238>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
476
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
476
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
476
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
0
            return EVMC_STACK_UNDERFLOW;
78
476
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)240>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
24.0k
{
48
24.0k
    static_assert(
49
24.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
24.0k
        "undefined instructions must not be handled by check_requirements()");
51
52
24.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
24.0k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
24.0k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
24.0k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
24.0k
    }
79
80
24.0k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
2.10k
        return EVMC_OUT_OF_GAS;
82
83
21.9k
    return EVMC_SUCCESS;
84
24.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)241>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
875k
{
48
875k
    static_assert(
49
875k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
875k
        "undefined instructions must not be handled by check_requirements()");
51
52
875k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
875k
    {
55
875k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
875k
        if (INTX_UNLIKELY(gas_cost < 0))
60
0
            return EVMC_UNDEFINED_INSTRUCTION;
61
875k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
875k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
875k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
875k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
24
            return EVMC_STACK_UNDERFLOW;
78
875k
    }
79
80
875k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
70
        return EVMC_OUT_OF_GAS;
82
83
875k
    return EVMC_SUCCESS;
84
875k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)242>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
83.1k
{
48
83.1k
    static_assert(
49
83.1k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
83.1k
        "undefined instructions must not be handled by check_requirements()");
51
52
83.1k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
83.1k
    {
55
83.1k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
83.1k
        if (INTX_UNLIKELY(gas_cost < 0))
60
0
            return EVMC_UNDEFINED_INSTRUCTION;
61
83.1k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
83.1k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
83.1k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
83.1k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
42
            return EVMC_STACK_UNDERFLOW;
78
83.1k
    }
79
80
83.1k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
86
        return EVMC_OUT_OF_GAS;
82
83
83.0k
    return EVMC_SUCCESS;
84
83.1k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)243>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
526k
{
48
526k
    static_assert(
49
526k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
526k
        "undefined instructions must not be handled by check_requirements()");
51
52
526k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
526k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
526k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
526k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
18
            return EVMC_STACK_UNDERFLOW;
78
526k
    }
79
80
526k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
526k
    return EVMC_SUCCESS;
84
526k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)244>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
101k
{
48
101k
    static_assert(
49
101k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
101k
        "undefined instructions must not be handled by check_requirements()");
51
52
101k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
101k
    {
55
101k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
101k
        if (INTX_UNLIKELY(gas_cost < 0))
60
19
            return EVMC_UNDEFINED_INSTRUCTION;
61
101k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
101k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
101k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
101k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
30
            return EVMC_STACK_UNDERFLOW;
78
101k
    }
79
80
101k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
66
        return EVMC_OUT_OF_GAS;
82
83
101k
    return EVMC_SUCCESS;
84
101k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)245>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
27.0k
{
48
27.0k
    static_assert(
49
27.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
27.0k
        "undefined instructions must not be handled by check_requirements()");
51
52
27.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
27.0k
    {
55
27.0k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
27.0k
        if (INTX_UNLIKELY(gas_cost < 0))
60
83
            return EVMC_UNDEFINED_INSTRUCTION;
61
27.0k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
27.0k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
27.0k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
27.0k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
12
            return EVMC_STACK_UNDERFLOW;
78
27.0k
    }
79
80
27.0k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
1.96k
        return EVMC_OUT_OF_GAS;
82
83
25.1k
    return EVMC_SUCCESS;
84
27.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)247>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
476
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
476
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
476
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
0
            return EVMC_STACK_UNDERFLOW;
78
476
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)248>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
476
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
476
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
476
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
0
            return EVMC_STACK_UNDERFLOW;
78
476
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)249>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
488
{
48
488
    static_assert(
49
488
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
488
        "undefined instructions must not be handled by check_requirements()");
51
52
488
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
488
    {
55
488
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
488
        if (INTX_UNLIKELY(gas_cost < 0))
60
488
            return EVMC_UNDEFINED_INSTRUCTION;
61
488
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
488
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
488
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
488
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
0
            return EVMC_STACK_UNDERFLOW;
78
488
    }
79
80
488
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
488
    return EVMC_SUCCESS;
84
488
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)250>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
3.06M
{
48
3.06M
    static_assert(
49
3.06M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
3.06M
        "undefined instructions must not be handled by check_requirements()");
51
52
3.06M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
3.06M
    {
55
3.06M
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
3.06M
        if (INTX_UNLIKELY(gas_cost < 0))
60
45
            return EVMC_UNDEFINED_INSTRUCTION;
61
3.06M
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
3.06M
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
3.06M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
3.06M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
12
            return EVMC_STACK_UNDERFLOW;
78
3.06M
    }
79
80
3.06M
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
104
        return EVMC_OUT_OF_GAS;
82
83
3.06M
    return EVMC_SUCCESS;
84
3.06M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)251>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
476
{
48
476
    static_assert(
49
476
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
476
        "undefined instructions must not be handled by check_requirements()");
51
52
476
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
476
    {
55
476
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
476
        if (INTX_UNLIKELY(gas_cost < 0))
60
476
            return EVMC_UNDEFINED_INSTRUCTION;
61
476
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
476
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
476
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
476
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
0
            return EVMC_STACK_UNDERFLOW;
78
476
    }
79
80
476
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
476
    return EVMC_SUCCESS;
84
476
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)253>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
25.4k
{
48
25.4k
    static_assert(
49
25.4k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
25.4k
        "undefined instructions must not be handled by check_requirements()");
51
52
25.4k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
25.4k
    {
55
25.4k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
25.4k
        if (INTX_UNLIKELY(gas_cost < 0))
60
45
            return EVMC_UNDEFINED_INSTRUCTION;
61
25.4k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
25.4k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
25.4k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
25.4k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
50
            return EVMC_STACK_UNDERFLOW;
78
25.4k
    }
79
80
25.4k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
25.4k
    return EVMC_SUCCESS;
84
25.4k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)254>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
1.96k
{
48
1.96k
    static_assert(
49
1.96k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
1.96k
        "undefined instructions must not be handled by check_requirements()");
51
52
1.96k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
    {
55
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
        if (INTX_UNLIKELY(gas_cost < 0))
60
            return EVMC_UNDEFINED_INSTRUCTION;
61
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
            return EVMC_STACK_UNDERFLOW;
78
    }
79
80
1.96k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
0
        return EVMC_OUT_OF_GAS;
82
83
1.96k
    return EVMC_SUCCESS;
84
1.96k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)255>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
47
420k
{
48
420k
    static_assert(
49
420k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
50
420k
        "undefined instructions must not be handled by check_requirements()");
51
52
420k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
53
    if constexpr (!instr::has_const_gas_cost(Op))
54
420k
    {
55
420k
        gas_cost = cost_table[Op];  // If not, load the cost from the table.
56
57
        // Negative cost marks an undefined instruction.
58
        // This check must be first to produce correct error code.
59
420k
        if (INTX_UNLIKELY(gas_cost < 0))
60
0
            return EVMC_UNDEFINED_INSTRUCTION;
61
420k
    }
62
63
    // Check stack requirements first. This is order is not required,
64
    // but it is nicer because complete gas check may need to inspect operands.
65
    if constexpr (instr::traits[Op].stack_height_change > 0)
66
    {
67
        static_assert(instr::traits[Op].stack_height_change == 1,
68
            "unexpected instruction with multiple results");
69
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
70
            return EVMC_STACK_OVERFLOW;
71
    }
72
    if constexpr (instr::traits[Op].stack_height_required > 0)
73
420k
    {
74
        // Check stack underflow using pointer comparison <= (better optimization).
75
420k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
76
420k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
77
12
            return EVMC_STACK_UNDERFLOW;
78
420k
    }
79
80
420k
    if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
81
413k
        return EVMC_OUT_OF_GAS;
82
83
7.76k
    return EVMC_SUCCESS;
84
420k
}
85
86
87
/// The execution position.
88
struct Position
89
{
90
    code_iterator code_it;  ///< The position in the code.
91
    uint256* stack_end;     ///< The pointer to the stack end.
92
};
93
94
/// Helpers for invoking instruction implementations of different signatures.
95
/// @{
96
[[release_inline]] inline code_iterator invoke(void (*instr_fn)(StackTop) noexcept, Position pos,
97
    int64_t& /*gas*/, ExecutionState& /*state*/) noexcept
98
72.4M
{
99
72.4M
    instr_fn(pos.stack_end);
100
72.4M
    return pos.code_it + 1;
101
72.4M
}
102
103
[[release_inline]] inline code_iterator invoke(
104
    Result (*instr_fn)(StackTop, int64_t, ExecutionState&) noexcept, Position pos, int64_t& gas,
105
    ExecutionState& state) noexcept
106
56.9M
{
107
56.9M
    const auto o = instr_fn(pos.stack_end, gas, state);
108
56.9M
    gas = o.gas_left;
109
56.9M
    if (o.status != EVMC_SUCCESS)
110
298k
    {
111
298k
        state.status = o.status;
112
298k
        return nullptr;
113
298k
    }
114
56.6M
    return pos.code_it + 1;
115
56.9M
}
116
117
[[release_inline]] inline code_iterator invoke(void (*instr_fn)(StackTop, ExecutionState&) noexcept,
118
    Position pos, int64_t& /*gas*/, ExecutionState& state) noexcept
119
4.71M
{
120
4.71M
    instr_fn(pos.stack_end, state);
121
4.71M
    return pos.code_it + 1;
122
4.71M
}
123
124
[[release_inline]] inline code_iterator invoke(
125
    code_iterator (*instr_fn)(StackTop, ExecutionState&, code_iterator) noexcept, Position pos,
126
    int64_t& /*gas*/, ExecutionState& state) noexcept
127
109M
{
128
109M
    return instr_fn(pos.stack_end, state, pos.code_it);
129
109M
}
130
131
[[release_inline]] inline code_iterator invoke(
132
    code_iterator (*instr_fn)(StackTop, code_iterator) noexcept, Position pos, int64_t& /*gas*/,
133
    ExecutionState& /*state*/) noexcept
134
0
{
135
0
    return instr_fn(pos.stack_end, pos.code_it);
136
0
}
137
138
[[release_inline]] inline code_iterator invoke(
139
    TermResult (*instr_fn)(StackTop, int64_t, ExecutionState&) noexcept, Position pos, int64_t& gas,
140
    ExecutionState& state) noexcept
141
1.96M
{
142
1.96M
    const auto result = instr_fn(pos.stack_end, gas, state);
143
1.96M
    gas = result.gas_left;
144
1.96M
    state.status = result.status;
145
1.96M
    return nullptr;
146
1.96M
}
147
148
[[release_inline]] inline code_iterator invoke(
149
    Result (*instr_fn)(StackTop, int64_t, ExecutionState&, code_iterator&) noexcept, Position pos,
150
    int64_t& gas, ExecutionState& state) noexcept
151
0
{
152
0
    const auto result = instr_fn(pos.stack_end, gas, state, pos.code_it);
153
0
    gas = result.gas_left;
154
0
    if (result.status != EVMC_SUCCESS)
155
0
    {
156
0
        state.status = result.status;
157
0
        return nullptr;
158
0
    }
159
0
    return pos.code_it;
160
0
}
161
162
[[release_inline]] inline code_iterator invoke(
163
    TermResult (*instr_fn)(StackTop, int64_t, ExecutionState&, code_iterator) noexcept,
164
    Position pos, int64_t& gas, ExecutionState& state) noexcept
165
0
{
166
0
    const auto result = instr_fn(pos.stack_end, gas, state, pos.code_it);
167
0
    gas = result.gas_left;
168
0
    state.status = result.status;
169
0
    return nullptr;
170
0
}
171
172
/// A helper to invoke the instruction implementation of the given opcode Op.
173
template <Opcode Op>
174
[[release_inline]] inline Position invoke(const CostTable& cost_table, const uint256* stack_bottom,
175
    Position pos, int64_t& gas, ExecutionState& state) noexcept
176
245M
{
177
245M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
245M
        status != EVMC_SUCCESS)
179
441k
    {
180
441k
        state.status = status;
181
441k
        return {nullptr, pos.stack_end};
182
441k
    }
183
245M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
245M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
245M
    return {new_pos, new_stack_top};
186
245M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)0>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
1.40M
{
177
1.40M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
1.40M
        status != EVMC_SUCCESS)
179
0
    {
180
0
        state.status = status;
181
0
        return {nullptr, pos.stack_end};
182
0
    }
183
1.40M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
1.40M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
1.40M
    return {new_pos, new_stack_top};
186
1.40M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)1>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
15.6M
{
177
15.6M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
15.6M
        status != EVMC_SUCCESS)
179
372
    {
180
372
        state.status = status;
181
372
        return {nullptr, pos.stack_end};
182
372
    }
183
15.6M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
15.6M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
15.6M
    return {new_pos, new_stack_top};
186
15.6M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)2>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
236k
{
177
236k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
236k
        status != EVMC_SUCCESS)
179
36
    {
180
36
        state.status = status;
181
36
        return {nullptr, pos.stack_end};
182
36
    }
183
236k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
236k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
236k
    return {new_pos, new_stack_top};
186
236k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)3>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
3.12M
{
177
3.12M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
3.12M
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
3.12M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
3.12M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
3.12M
    return {new_pos, new_stack_top};
186
3.12M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)4>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
46.6k
{
177
46.6k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
46.6k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
46.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
46.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
46.5k
    return {new_pos, new_stack_top};
186
46.6k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)5>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
4.03k
{
177
4.03k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
4.03k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
4.01k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
4.01k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
4.01k
    return {new_pos, new_stack_top};
186
4.03k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)6>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
155k
{
177
155k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
155k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
155k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
155k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
155k
    return {new_pos, new_stack_top};
186
155k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)7>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
3.53k
{
177
3.53k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
3.53k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
3.51k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
3.51k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
3.51k
    return {new_pos, new_stack_top};
186
3.53k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)8>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
2.01k
{
177
2.01k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
2.01k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
2.00k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
2.00k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
2.00k
    return {new_pos, new_stack_top};
186
2.01k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)9>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
2.29k
{
177
2.29k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
2.29k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
2.27k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
2.27k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
2.27k
    return {new_pos, new_stack_top};
186
2.29k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)10>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
37.1k
{
177
37.1k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
37.1k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
37.1k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
37.1k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
37.1k
    return {new_pos, new_stack_top};
186
37.1k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)11>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
2.54k
{
177
2.54k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
2.54k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
2.52k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
2.52k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
2.52k
    return {new_pos, new_stack_top};
186
2.54k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)16>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
2.94M
{
177
2.94M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
2.94M
        status != EVMC_SUCCESS)
179
34
    {
180
34
        state.status = status;
181
34
        return {nullptr, pos.stack_end};
182
34
    }
183
2.94M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
2.94M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
2.94M
    return {new_pos, new_stack_top};
186
2.94M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)17>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
394k
{
177
394k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
394k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
394k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
394k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
394k
    return {new_pos, new_stack_top};
186
394k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)18>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
6.53k
{
177
6.53k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
6.53k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
6.51k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
6.51k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
6.51k
    return {new_pos, new_stack_top};
186
6.53k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)19>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
6.17k
{
177
6.17k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
6.17k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
6.15k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
6.15k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
6.15k
    return {new_pos, new_stack_top};
186
6.17k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)20>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
825k
{
177
825k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
825k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
825k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
825k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
825k
    return {new_pos, new_stack_top};
186
825k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)21>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
5.10M
{
177
5.10M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
5.10M
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
5.10M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
5.10M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
5.10M
    return {new_pos, new_stack_top};
186
5.10M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)22>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
128k
{
177
128k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
128k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
128k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
128k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
128k
    return {new_pos, new_stack_top};
186
128k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)23>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
51.8k
{
177
51.8k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
51.8k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
51.7k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
51.7k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
51.7k
    return {new_pos, new_stack_top};
186
51.8k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)24>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
1.63k
{
177
1.63k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
1.63k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
1.61k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
1.61k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
1.61k
    return {new_pos, new_stack_top};
186
1.63k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)25>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
70.3k
{
177
70.3k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
70.3k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
70.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
70.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
70.3k
    return {new_pos, new_stack_top};
186
70.3k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)26>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
78.2k
{
177
78.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
78.2k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
78.2k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
78.2k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
78.2k
    return {new_pos, new_stack_top};
186
78.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)27>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
3.46M
{
177
3.46M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
3.46M
        status != EVMC_SUCCESS)
179
97
    {
180
97
        state.status = status;
181
97
        return {nullptr, pos.stack_end};
182
97
    }
183
3.46M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
3.46M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
3.46M
    return {new_pos, new_stack_top};
186
3.46M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)28>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
18.6k
{
177
18.6k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
18.6k
        status != EVMC_SUCCESS)
179
95
    {
180
95
        state.status = status;
181
95
        return {nullptr, pos.stack_end};
182
95
    }
183
18.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
18.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
18.5k
    return {new_pos, new_stack_top};
186
18.6k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)29>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
8.33k
{
177
8.33k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
8.33k
        status != EVMC_SUCCESS)
179
95
    {
180
95
        state.status = status;
181
95
        return {nullptr, pos.stack_end};
182
95
    }
183
8.24k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
8.24k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
8.24k
    return {new_pos, new_stack_top};
186
8.33k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)30>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
3.28k
{
177
3.28k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
3.28k
        status != EVMC_SUCCESS)
179
474
    {
180
474
        state.status = status;
181
474
        return {nullptr, pos.stack_end};
182
474
    }
183
2.81k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
2.81k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
2.81k
    return {new_pos, new_stack_top};
186
3.28k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)32>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
15.5k
{
177
15.5k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
15.5k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
15.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
15.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
15.5k
    return {new_pos, new_stack_top};
186
15.5k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)48>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
56.9k
{
177
56.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
56.9k
        status != EVMC_SUCCESS)
179
6
    {
180
6
        state.status = status;
181
6
        return {nullptr, pos.stack_end};
182
6
    }
183
56.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
56.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
56.8k
    return {new_pos, new_stack_top};
186
56.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)49>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
7.86k
{
177
7.86k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
7.86k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
7.83k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
7.83k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
7.83k
    return {new_pos, new_stack_top};
186
7.86k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)50>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
23.6k
{
177
23.6k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
23.6k
        status != EVMC_SUCCESS)
179
6
    {
180
6
        state.status = status;
181
6
        return {nullptr, pos.stack_end};
182
6
    }
183
23.6k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
23.6k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
23.6k
    return {new_pos, new_stack_top};
186
23.6k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)51>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
269k
{
177
269k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
269k
        status != EVMC_SUCCESS)
179
12
    {
180
12
        state.status = status;
181
12
        return {nullptr, pos.stack_end};
182
12
    }
183
269k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
269k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
269k
    return {new_pos, new_stack_top};
186
269k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)52>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
24.9k
{
177
24.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
24.9k
        status != EVMC_SUCCESS)
179
6
    {
180
6
        state.status = status;
181
6
        return {nullptr, pos.stack_end};
182
6
    }
183
24.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
24.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
24.9k
    return {new_pos, new_stack_top};
186
24.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)53>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
1.82M
{
177
1.82M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
1.82M
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
1.82M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
1.82M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
1.82M
    return {new_pos, new_stack_top};
186
1.82M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)54>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
107k
{
177
107k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
107k
        status != EVMC_SUCCESS)
179
6
    {
180
6
        state.status = status;
181
6
        return {nullptr, pos.stack_end};
182
6
    }
183
107k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
107k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
107k
    return {new_pos, new_stack_top};
186
107k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)55>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
121k
{
177
121k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
121k
        status != EVMC_SUCCESS)
179
48
    {
180
48
        state.status = status;
181
48
        return {nullptr, pos.stack_end};
182
48
    }
183
121k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
121k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
121k
    return {new_pos, new_stack_top};
186
121k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)56>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
21.2k
{
177
21.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
21.2k
        status != EVMC_SUCCESS)
179
6
    {
180
6
        state.status = status;
181
6
        return {nullptr, pos.stack_end};
182
6
    }
183
21.2k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
21.2k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
21.2k
    return {new_pos, new_stack_top};
186
21.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)57>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
23.2k
{
177
23.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
23.2k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
23.2k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
23.2k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
23.2k
    return {new_pos, new_stack_top};
186
23.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)58>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
13.4k
{
177
13.4k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
13.4k
        status != EVMC_SUCCESS)
179
6
    {
180
6
        state.status = status;
181
6
        return {nullptr, pos.stack_end};
182
6
    }
183
13.4k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
13.4k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
13.4k
    return {new_pos, new_stack_top};
186
13.4k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)59>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
470k
{
177
470k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
470k
        status != EVMC_SUCCESS)
179
420
    {
180
420
        state.status = status;
181
420
        return {nullptr, pos.stack_end};
182
420
    }
183
470k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
470k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
470k
    return {new_pos, new_stack_top};
186
470k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)60>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
12.8k
{
177
12.8k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
12.8k
        status != EVMC_SUCCESS)
179
42
    {
180
42
        state.status = status;
181
42
        return {nullptr, pos.stack_end};
182
42
    }
183
12.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
12.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
12.8k
    return {new_pos, new_stack_top};
186
12.8k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)61>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
58.6k
{
177
58.6k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
58.6k
        status != EVMC_SUCCESS)
179
80
    {
180
80
        state.status = status;
181
80
        return {nullptr, pos.stack_end};
182
80
    }
183
58.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
58.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
58.5k
    return {new_pos, new_stack_top};
186
58.6k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)62>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
8.97k
{
177
8.97k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
8.97k
        status != EVMC_SUCCESS)
179
86
    {
180
86
        state.status = status;
181
86
        return {nullptr, pos.stack_end};
182
86
    }
183
8.89k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
8.89k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
8.89k
    return {new_pos, new_stack_top};
186
8.97k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)63>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
3.50k
{
177
3.50k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
3.50k
        status != EVMC_SUCCESS)
179
166
    {
180
166
        state.status = status;
181
166
        return {nullptr, pos.stack_end};
182
166
    }
183
3.33k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
3.33k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
3.33k
    return {new_pos, new_stack_top};
186
3.50k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)64>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
69.7k
{
177
69.7k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
69.7k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
69.7k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
69.7k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
69.7k
    return {new_pos, new_stack_top};
186
69.7k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)65>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
14.9k
{
177
14.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
14.9k
        status != EVMC_SUCCESS)
179
6
    {
180
6
        state.status = status;
181
6
        return {nullptr, pos.stack_end};
182
6
    }
183
14.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
14.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
14.9k
    return {new_pos, new_stack_top};
186
14.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)66>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
147k
{
177
147k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
147k
        status != EVMC_SUCCESS)
179
6
    {
180
6
        state.status = status;
181
6
        return {nullptr, pos.stack_end};
182
6
    }
183
147k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
147k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
147k
    return {new_pos, new_stack_top};
186
147k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)67>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
133k
{
177
133k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
133k
        status != EVMC_SUCCESS)
179
6
    {
180
6
        state.status = status;
181
6
        return {nullptr, pos.stack_end};
182
6
    }
183
133k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
133k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
133k
    return {new_pos, new_stack_top};
186
133k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)68>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
13.7k
{
177
13.7k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
13.7k
        status != EVMC_SUCCESS)
179
6
    {
180
6
        state.status = status;
181
6
        return {nullptr, pos.stack_end};
182
6
    }
183
13.7k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
13.7k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
13.7k
    return {new_pos, new_stack_top};
186
13.7k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)69>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
15.2k
{
177
15.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
15.2k
        status != EVMC_SUCCESS)
179
6
    {
180
6
        state.status = status;
181
6
        return {nullptr, pos.stack_end};
182
6
    }
183
15.2k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
15.2k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
15.2k
    return {new_pos, new_stack_top};
186
15.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)70>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
652
{
177
652
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
652
        status != EVMC_SUCCESS)
179
238
    {
180
238
        state.status = status;
181
238
        return {nullptr, pos.stack_end};
182
238
    }
183
414
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
414
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
414
    return {new_pos, new_stack_top};
186
652
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)71>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
1.76k
{
177
1.76k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
1.76k
        status != EVMC_SUCCESS)
179
238
    {
180
238
        state.status = status;
181
238
        return {nullptr, pos.stack_end};
182
238
    }
183
1.52k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
1.52k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
1.52k
    return {new_pos, new_stack_top};
186
1.76k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)72>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
926
{
177
926
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
926
        status != EVMC_SUCCESS)
179
406
    {
180
406
        state.status = status;
181
406
        return {nullptr, pos.stack_end};
182
406
    }
183
520
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
520
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
520
    return {new_pos, new_stack_top};
186
926
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)73>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
3.52k
{
177
3.52k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
3.52k
        status != EVMC_SUCCESS)
179
664
    {
180
664
        state.status = status;
181
664
        return {nullptr, pos.stack_end};
182
664
    }
183
2.85k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
2.85k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
2.85k
    return {new_pos, new_stack_top};
186
3.52k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)74>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
13.4k
{
177
13.4k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
13.4k
        status != EVMC_SUCCESS)
179
674
    {
180
674
        state.status = status;
181
674
        return {nullptr, pos.stack_end};
182
674
    }
183
12.7k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
12.7k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
12.7k
    return {new_pos, new_stack_top};
186
13.4k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)80>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
4.52M
{
177
4.52M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
4.52M
        status != EVMC_SUCCESS)
179
128
    {
180
128
        state.status = status;
181
128
        return {nullptr, pos.stack_end};
182
128
    }
183
4.52M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
4.52M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
4.52M
    return {new_pos, new_stack_top};
186
4.52M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)81>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
11.9M
{
177
11.9M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
11.9M
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
11.9M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
11.9M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
11.9M
    return {new_pos, new_stack_top};
186
11.9M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)82>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
8.58M
{
177
8.58M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
8.58M
        status != EVMC_SUCCESS)
179
68
    {
180
68
        state.status = status;
181
68
        return {nullptr, pos.stack_end};
182
68
    }
183
8.58M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
8.58M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
8.58M
    return {new_pos, new_stack_top};
186
8.58M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)83>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
155k
{
177
155k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
155k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
155k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
155k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
155k
    return {new_pos, new_stack_top};
186
155k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)84>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
1.01M
{
177
1.01M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
1.01M
        status != EVMC_SUCCESS)
179
22
    {
180
22
        state.status = status;
181
22
        return {nullptr, pos.stack_end};
182
22
    }
183
1.01M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
1.01M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
1.01M
    return {new_pos, new_stack_top};
186
1.01M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)85>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
4.69M
{
177
4.69M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
4.69M
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
4.69M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
4.69M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
4.69M
    return {new_pos, new_stack_top};
186
4.69M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)86>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
5.33M
{
177
5.33M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
5.33M
        status != EVMC_SUCCESS)
179
84
    {
180
84
        state.status = status;
181
84
        return {nullptr, pos.stack_end};
182
84
    }
183
5.33M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
5.33M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
5.33M
    return {new_pos, new_stack_top};
186
5.33M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)87>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
6.93M
{
177
6.93M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
6.93M
        status != EVMC_SUCCESS)
179
20
    {
180
20
        state.status = status;
181
20
        return {nullptr, pos.stack_end};
182
20
    }
183
6.93M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
6.93M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
6.93M
    return {new_pos, new_stack_top};
186
6.93M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)88>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
5.49M
{
177
5.49M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
5.49M
        status != EVMC_SUCCESS)
179
62
    {
180
62
        state.status = status;
181
62
        return {nullptr, pos.stack_end};
182
62
    }
183
5.49M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
5.49M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
5.49M
    return {new_pos, new_stack_top};
186
5.49M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)89>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
16.5k
{
177
16.5k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
16.5k
        status != EVMC_SUCCESS)
179
6
    {
180
6
        state.status = status;
181
6
        return {nullptr, pos.stack_end};
182
6
    }
183
16.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
16.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
16.5k
    return {new_pos, new_stack_top};
186
16.5k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)90>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
16.5M
{
177
16.5M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
16.5M
        status != EVMC_SUCCESS)
179
16
    {
180
16
        state.status = status;
181
16
        return {nullptr, pos.stack_end};
182
16
    }
183
16.5M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
16.5M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
16.5M
    return {new_pos, new_stack_top};
186
16.5M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)91>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
23.8M
{
177
23.8M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
23.8M
        status != EVMC_SUCCESS)
179
14
    {
180
14
        state.status = status;
181
14
        return {nullptr, pos.stack_end};
182
14
    }
183
23.8M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
23.8M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
23.8M
    return {new_pos, new_stack_top};
186
23.8M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)92>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
1.89M
{
177
1.89M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
1.89M
        status != EVMC_SUCCESS)
179
682
    {
180
682
        state.status = status;
181
682
        return {nullptr, pos.stack_end};
182
682
    }
183
1.89M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
1.89M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
1.89M
    return {new_pos, new_stack_top};
186
1.89M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)93>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
9.08M
{
177
9.08M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
9.08M
        status != EVMC_SUCCESS)
179
736
    {
180
736
        state.status = status;
181
736
        return {nullptr, pos.stack_end};
182
736
    }
183
9.07M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
9.07M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
9.07M
    return {new_pos, new_stack_top};
186
9.08M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)94>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
2.24k
{
177
2.24k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
2.24k
        status != EVMC_SUCCESS)
179
718
    {
180
718
        state.status = status;
181
718
        return {nullptr, pos.stack_end};
182
718
    }
183
1.52k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
1.52k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
1.52k
    return {new_pos, new_stack_top};
186
2.24k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)95>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
1.15M
{
177
1.15M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
1.15M
        status != EVMC_SUCCESS)
179
634
    {
180
634
        state.status = status;
181
634
        return {nullptr, pos.stack_end};
182
634
    }
183
1.15M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
1.15M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
1.15M
    return {new_pos, new_stack_top};
186
1.15M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)96>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
76.2M
{
177
76.2M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
76.2M
        status != EVMC_SUCCESS)
179
3.72k
    {
180
3.72k
        state.status = status;
181
3.72k
        return {nullptr, pos.stack_end};
182
3.72k
    }
183
76.2M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
76.2M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
76.2M
    return {new_pos, new_stack_top};
186
76.2M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)97>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
10.0M
{
177
10.0M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
10.0M
        status != EVMC_SUCCESS)
179
150
    {
180
150
        state.status = status;
181
150
        return {nullptr, pos.stack_end};
182
150
    }
183
10.0M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
10.0M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
10.0M
    return {new_pos, new_stack_top};
186
10.0M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)98>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
1.32M
{
177
1.32M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
1.32M
        status != EVMC_SUCCESS)
179
36
    {
180
36
        state.status = status;
181
36
        return {nullptr, pos.stack_end};
182
36
    }
183
1.32M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
1.32M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
1.32M
    return {new_pos, new_stack_top};
186
1.32M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)99>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
119k
{
177
119k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
119k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
119k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
119k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
119k
    return {new_pos, new_stack_top};
186
119k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)100>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
58.2k
{
177
58.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
58.2k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
58.1k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
58.1k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
58.1k
    return {new_pos, new_stack_top};
186
58.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)101>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
111k
{
177
111k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
111k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
111k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
111k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
111k
    return {new_pos, new_stack_top};
186
111k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)102>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
46.6k
{
177
46.6k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
46.6k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
46.6k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
46.6k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
46.6k
    return {new_pos, new_stack_top};
186
46.6k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)103>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
47.3k
{
177
47.3k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
47.3k
        status != EVMC_SUCCESS)
179
34
    {
180
34
        state.status = status;
181
34
        return {nullptr, pos.stack_end};
182
34
    }
183
47.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
47.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
47.3k
    return {new_pos, new_stack_top};
186
47.3k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)104>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
40.4k
{
177
40.4k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
40.4k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
40.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
40.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
40.3k
    return {new_pos, new_stack_top};
186
40.4k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)105>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
34.7k
{
177
34.7k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
34.7k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
34.6k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
34.6k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
34.6k
    return {new_pos, new_stack_top};
186
34.7k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)106>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
28.8k
{
177
28.8k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
28.8k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
28.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
28.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
28.8k
    return {new_pos, new_stack_top};
186
28.8k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)107>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
40.4k
{
177
40.4k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
40.4k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
40.4k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
40.4k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
40.4k
    return {new_pos, new_stack_top};
186
40.4k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)108>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
38.8k
{
177
38.8k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
38.8k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
38.7k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
38.7k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
38.7k
    return {new_pos, new_stack_top};
186
38.8k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)109>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
34.1k
{
177
34.1k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
34.1k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
34.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
34.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
34.0k
    return {new_pos, new_stack_top};
186
34.1k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)110>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
29.0k
{
177
29.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
29.0k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
29.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
29.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
29.0k
    return {new_pos, new_stack_top};
186
29.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)111>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
48.5k
{
177
48.5k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
48.5k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
48.4k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
48.4k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
48.4k
    return {new_pos, new_stack_top};
186
48.5k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)112>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
21.2k
{
177
21.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
21.2k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
21.2k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
21.2k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
21.2k
    return {new_pos, new_stack_top};
186
21.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)113>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
66.2k
{
177
66.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
66.2k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
66.2k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
66.2k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
66.2k
    return {new_pos, new_stack_top};
186
66.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)114>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
30.7k
{
177
30.7k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
30.7k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
30.7k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
30.7k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
30.7k
    return {new_pos, new_stack_top};
186
30.7k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)115>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
2.23M
{
177
2.23M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
2.23M
        status != EVMC_SUCCESS)
179
52
    {
180
52
        state.status = status;
181
52
        return {nullptr, pos.stack_end};
182
52
    }
183
2.23M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
2.23M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
2.23M
    return {new_pos, new_stack_top};
186
2.23M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)116>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
45.0k
{
177
45.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
45.0k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
44.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
44.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
44.9k
    return {new_pos, new_stack_top};
186
45.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)117>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
37.3k
{
177
37.3k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
37.3k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
37.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
37.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
37.3k
    return {new_pos, new_stack_top};
186
37.3k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)118>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
37.9k
{
177
37.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
37.9k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
37.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
37.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
37.9k
    return {new_pos, new_stack_top};
186
37.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)119>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
31.8k
{
177
31.8k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
31.8k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
31.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
31.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
31.8k
    return {new_pos, new_stack_top};
186
31.8k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)120>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
30.1k
{
177
30.1k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
30.1k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
30.1k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
30.1k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
30.1k
    return {new_pos, new_stack_top};
186
30.1k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)121>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
41.0k
{
177
41.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
41.0k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
41.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
41.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
41.0k
    return {new_pos, new_stack_top};
186
41.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)122>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
42.0k
{
177
42.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
42.0k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
42.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
42.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
42.0k
    return {new_pos, new_stack_top};
186
42.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)123>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
28.7k
{
177
28.7k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
28.7k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
28.7k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
28.7k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
28.7k
    return {new_pos, new_stack_top};
186
28.7k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)124>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
34.4k
{
177
34.4k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
34.4k
        status != EVMC_SUCCESS)
179
34
    {
180
34
        state.status = status;
181
34
        return {nullptr, pos.stack_end};
182
34
    }
183
34.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
34.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
34.3k
    return {new_pos, new_stack_top};
186
34.4k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)125>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
24.9k
{
177
24.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
24.9k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
24.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
24.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
24.9k
    return {new_pos, new_stack_top};
186
24.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)126>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
93.2k
{
177
93.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
93.2k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
93.2k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
93.2k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
93.2k
    return {new_pos, new_stack_top};
186
93.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)127>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
301k
{
177
301k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
301k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
301k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
301k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
301k
    return {new_pos, new_stack_top};
186
301k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)128>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
5.87M
{
177
5.87M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
5.87M
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
5.87M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
5.87M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
5.87M
    return {new_pos, new_stack_top};
186
5.87M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)129>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
1.25M
{
177
1.25M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
1.25M
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
1.25M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
1.25M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
1.25M
    return {new_pos, new_stack_top};
186
1.25M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)130>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
617k
{
177
617k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
617k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
617k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
617k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
617k
    return {new_pos, new_stack_top};
186
617k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)131>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
291k
{
177
291k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
291k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
291k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
291k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
291k
    return {new_pos, new_stack_top};
186
291k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)132>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
126k
{
177
126k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
126k
        status != EVMC_SUCCESS)
179
48
    {
180
48
        state.status = status;
181
48
        return {nullptr, pos.stack_end};
182
48
    }
183
126k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
126k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
126k
    return {new_pos, new_stack_top};
186
126k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)133>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
64.9k
{
177
64.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
64.9k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
64.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
64.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
64.8k
    return {new_pos, new_stack_top};
186
64.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)134>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
47.8k
{
177
47.8k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
47.8k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
47.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
47.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
47.8k
    return {new_pos, new_stack_top};
186
47.8k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)135>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
443k
{
177
443k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
443k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
443k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
443k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
443k
    return {new_pos, new_stack_top};
186
443k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)136>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
27.0k
{
177
27.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
27.0k
        status != EVMC_SUCCESS)
179
42
    {
180
42
        state.status = status;
181
42
        return {nullptr, pos.stack_end};
182
42
    }
183
26.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
26.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
26.9k
    return {new_pos, new_stack_top};
186
27.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)137>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
53.3k
{
177
53.3k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
53.3k
        status != EVMC_SUCCESS)
179
34
    {
180
34
        state.status = status;
181
34
        return {nullptr, pos.stack_end};
182
34
    }
183
53.2k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
53.2k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
53.2k
    return {new_pos, new_stack_top};
186
53.3k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)138>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
24.9k
{
177
24.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
24.9k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
24.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
24.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
24.9k
    return {new_pos, new_stack_top};
186
24.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)139>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
16.5k
{
177
16.5k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
16.5k
        status != EVMC_SUCCESS)
179
42
    {
180
42
        state.status = status;
181
42
        return {nullptr, pos.stack_end};
182
42
    }
183
16.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
16.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
16.5k
    return {new_pos, new_stack_top};
186
16.5k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)140>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
30.5k
{
177
30.5k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
30.5k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
30.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
30.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
30.5k
    return {new_pos, new_stack_top};
186
30.5k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)141>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
15.0k
{
177
15.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
15.0k
        status != EVMC_SUCCESS)
179
36
    {
180
36
        state.status = status;
181
36
        return {nullptr, pos.stack_end};
182
36
    }
183
15.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
15.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
15.0k
    return {new_pos, new_stack_top};
186
15.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)142>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
25.2k
{
177
25.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
25.2k
        status != EVMC_SUCCESS)
179
42
    {
180
42
        state.status = status;
181
42
        return {nullptr, pos.stack_end};
182
42
    }
183
25.1k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
25.1k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
25.1k
    return {new_pos, new_stack_top};
186
25.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)143>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
17.3k
{
177
17.3k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
17.3k
        status != EVMC_SUCCESS)
179
42
    {
180
42
        state.status = status;
181
42
        return {nullptr, pos.stack_end};
182
42
    }
183
17.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
17.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
17.3k
    return {new_pos, new_stack_top};
186
17.3k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)144>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
722k
{
177
722k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
722k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
722k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
722k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
722k
    return {new_pos, new_stack_top};
186
722k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)145>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
402k
{
177
402k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
402k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
402k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
402k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
402k
    return {new_pos, new_stack_top};
186
402k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)146>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
271k
{
177
271k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
271k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
271k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
271k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
271k
    return {new_pos, new_stack_top};
186
271k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)147>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
87.3k
{
177
87.3k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
87.3k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
87.2k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
87.2k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
87.2k
    return {new_pos, new_stack_top};
186
87.3k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)148>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
36.9k
{
177
36.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
36.9k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
36.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
36.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
36.9k
    return {new_pos, new_stack_top};
186
36.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)149>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
8.23k
{
177
8.23k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
8.23k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
8.20k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
8.20k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
8.20k
    return {new_pos, new_stack_top};
186
8.23k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)150>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
3.82k
{
177
3.82k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
3.82k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
3.79k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
3.79k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
3.79k
    return {new_pos, new_stack_top};
186
3.82k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)151>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
7.73k
{
177
7.73k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
7.73k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
7.70k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
7.70k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
7.70k
    return {new_pos, new_stack_top};
186
7.73k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)152>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
5.86k
{
177
5.86k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
5.86k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
5.83k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
5.83k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
5.83k
    return {new_pos, new_stack_top};
186
5.86k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)153>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
2.24k
{
177
2.24k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
2.24k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
2.22k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
2.22k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
2.22k
    return {new_pos, new_stack_top};
186
2.24k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)154>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
2.67k
{
177
2.67k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
2.67k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
2.65k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
2.65k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
2.65k
    return {new_pos, new_stack_top};
186
2.67k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)155>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
6.73k
{
177
6.73k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
6.73k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
6.70k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
6.70k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
6.70k
    return {new_pos, new_stack_top};
186
6.73k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)156>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
4.18k
{
177
4.18k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
4.18k
        status != EVMC_SUCCESS)
179
22
    {
180
22
        state.status = status;
181
22
        return {nullptr, pos.stack_end};
182
22
    }
183
4.16k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
4.16k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
4.16k
    return {new_pos, new_stack_top};
186
4.18k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)157>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
3.60k
{
177
3.60k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
3.60k
        status != EVMC_SUCCESS)
179
24
    {
180
24
        state.status = status;
181
24
        return {nullptr, pos.stack_end};
182
24
    }
183
3.57k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
3.57k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
3.57k
    return {new_pos, new_stack_top};
186
3.60k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)158>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
2.35k
{
177
2.35k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
2.35k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
2.33k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
2.33k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
2.33k
    return {new_pos, new_stack_top};
186
2.35k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)159>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
2.35k
{
177
2.35k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
2.35k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
2.34k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
2.34k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
2.34k
    return {new_pos, new_stack_top};
186
2.35k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)160>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
9.38k
{
177
9.38k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
9.38k
        status != EVMC_SUCCESS)
179
22
    {
180
22
        state.status = status;
181
22
        return {nullptr, pos.stack_end};
182
22
    }
183
9.36k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
9.36k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
9.36k
    return {new_pos, new_stack_top};
186
9.38k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)161>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
8.22k
{
177
8.22k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
8.22k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
8.20k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
8.20k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
8.20k
    return {new_pos, new_stack_top};
186
8.22k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)162>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
4.60k
{
177
4.60k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
4.60k
        status != EVMC_SUCCESS)
179
30
    {
180
30
        state.status = status;
181
30
        return {nullptr, pos.stack_end};
182
30
    }
183
4.57k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
4.57k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
4.57k
    return {new_pos, new_stack_top};
186
4.60k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)163>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
6.78k
{
177
6.78k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
6.78k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
6.76k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
6.76k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
6.76k
    return {new_pos, new_stack_top};
186
6.78k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)164>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
767
{
177
767
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
767
        status != EVMC_SUCCESS)
179
36
    {
180
36
        state.status = status;
181
36
        return {nullptr, pos.stack_end};
182
36
    }
183
731
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
731
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
731
    return {new_pos, new_stack_top};
186
767
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)208>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)209>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)210>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)211>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)224>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)225>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)226>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)227>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
482
{
177
482
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
482
        status != EVMC_SUCCESS)
179
482
    {
180
482
        state.status = status;
181
482
        return {nullptr, pos.stack_end};
182
482
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
482
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)228>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)229>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)230>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)231>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)232>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)236>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)237>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)238>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)240>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
24.0k
{
177
24.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
24.0k
        status != EVMC_SUCCESS)
179
2.12k
    {
180
2.12k
        state.status = status;
181
2.12k
        return {nullptr, pos.stack_end};
182
2.12k
    }
183
21.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
21.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
21.9k
    return {new_pos, new_stack_top};
186
24.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)241>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
875k
{
177
875k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
875k
        status != EVMC_SUCCESS)
179
94
    {
180
94
        state.status = status;
181
94
        return {nullptr, pos.stack_end};
182
94
    }
183
875k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
875k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
875k
    return {new_pos, new_stack_top};
186
875k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)242>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
83.1k
{
177
83.1k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
83.1k
        status != EVMC_SUCCESS)
179
128
    {
180
128
        state.status = status;
181
128
        return {nullptr, pos.stack_end};
182
128
    }
183
82.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
82.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
82.9k
    return {new_pos, new_stack_top};
186
83.1k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)243>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
526k
{
177
526k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
526k
        status != EVMC_SUCCESS)
179
18
    {
180
18
        state.status = status;
181
18
        return {nullptr, pos.stack_end};
182
18
    }
183
525k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
525k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
525k
    return {new_pos, new_stack_top};
186
526k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)244>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
101k
{
177
101k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
101k
        status != EVMC_SUCCESS)
179
115
    {
180
115
        state.status = status;
181
115
        return {nullptr, pos.stack_end};
182
115
    }
183
101k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
101k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
101k
    return {new_pos, new_stack_top};
186
101k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)245>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
27.0k
{
177
27.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
27.0k
        status != EVMC_SUCCESS)
179
2.06k
    {
180
2.06k
        state.status = status;
181
2.06k
        return {nullptr, pos.stack_end};
182
2.06k
    }
183
25.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
25.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
25.0k
    return {new_pos, new_stack_top};
186
27.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)247>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)248>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)249>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
488
{
177
488
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
488
        status != EVMC_SUCCESS)
179
488
    {
180
488
        state.status = status;
181
488
        return {nullptr, pos.stack_end};
182
488
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
488
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)250>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
3.06M
{
177
3.06M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
3.06M
        status != EVMC_SUCCESS)
179
161
    {
180
161
        state.status = status;
181
161
        return {nullptr, pos.stack_end};
182
161
    }
183
3.06M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
3.06M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
3.06M
    return {new_pos, new_stack_top};
186
3.06M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)251>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
476
{
177
476
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
476
        status != EVMC_SUCCESS)
179
476
    {
180
476
        state.status = status;
181
476
        return {nullptr, pos.stack_end};
182
476
    }
183
0
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
0
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
0
    return {new_pos, new_stack_top};
186
476
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)253>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
25.4k
{
177
25.4k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
25.4k
        status != EVMC_SUCCESS)
179
95
    {
180
95
        state.status = status;
181
95
        return {nullptr, pos.stack_end};
182
95
    }
183
25.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
25.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
25.3k
    return {new_pos, new_stack_top};
186
25.4k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)254>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
1.96k
{
177
1.96k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
1.96k
        status != EVMC_SUCCESS)
179
0
    {
180
0
        state.status = status;
181
0
        return {nullptr, pos.stack_end};
182
0
    }
183
1.96k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
1.96k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
1.96k
    return {new_pos, new_stack_top};
186
1.96k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)255>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
176
420k
{
177
420k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
178
420k
        status != EVMC_SUCCESS)
179
413k
    {
180
413k
        state.status = status;
181
413k
        return {nullptr, pos.stack_end};
182
413k
    }
183
7.75k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
184
7.75k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
185
7.75k
    return {new_pos, new_stack_top};
186
420k
}
187
188
189
template <bool TracingEnabled>
190
int64_t dispatch(const CostTable& cost_table, ExecutionState& state, int64_t gas,
191
    const uint8_t* code, Tracer* tracer = nullptr) noexcept
192
0
{
193
0
    const auto stack_bottom = state.stack_space.bottom();
194
195
    // Code iterator and stack top pointer for interpreter loop.
196
0
    Position position{code, stack_bottom};
197
198
0
    while (true)  // Guaranteed to terminate because padded code ends with STOP.
199
0
    {
200
        if constexpr (TracingEnabled)
201
0
        {
202
0
            const auto offset = static_cast<uint32_t>(position.code_it - code);
203
0
            const auto stack_height = static_cast<int>(position.stack_end - stack_bottom);
204
0
            if (offset < state.original_code.size())  // Skip STOP from code padding.
205
0
            {
206
0
                tracer->notify_instruction_start(
207
0
                    offset, position.stack_end - 1, stack_height, gas, state);
208
0
            }
209
0
        }
210
211
0
        const auto op = *position.code_it;
212
0
        switch (op)
213
0
        {
214
0
#define ON_OPCODE(OPCODE)                                                                     \
215
0
    case OPCODE:                                                                              \
216
0
        ASM_COMMENT(OPCODE);                                                                  \
217
0
        if (const auto next = invoke<OPCODE>(cost_table, stack_bottom, position, gas, state); \
218
0
            next.code_it == nullptr)                                                          \
219
0
        {                                                                                     \
220
0
            return gas;                                                                       \
221
0
        }                                                                                     \
222
0
        else                                                                                  \
223
0
        {                                                                                     \
224
            /* Update current position only when no error,                                    \
225
               this improves compiler optimization. */                                        \
226
0
            position = next;                                                                  \
227
0
        }                                                                                     \
228
0
        break;
229
230
0
            MAP_OPCODES
231
0
#undef ON_OPCODE
232
233
0
        default:
234
0
            state.status = EVMC_UNDEFINED_INSTRUCTION;
235
0
            return gas;
236
0
        }
237
0
    }
238
0
    intx::unreachable();
239
0
}
Unexecuted instantiation: baseline_execution.cpp:long evmone::baseline::(anonymous namespace)::dispatch<true>(std::array<short, 256ul> const&, evmone::ExecutionState&, long, unsigned char const*, evmone::Tracer*)
Unexecuted instantiation: baseline_execution.cpp:long evmone::baseline::(anonymous namespace)::dispatch<false>(std::array<short, 256ul> const&, evmone::ExecutionState&, long, unsigned char const*, evmone::Tracer*)
240
241
#if EVMONE_CGOTO_SUPPORTED
242
int64_t dispatch_cgoto(
243
    const CostTable& cost_table, ExecutionState& state, int64_t gas, const uint8_t* code) noexcept
244
2.75M
{
245
2.75M
#pragma GCC diagnostic ignored "-Wpedantic"
246
247
2.75M
    static constexpr void* cgoto_table[] = {
248
467M
#define ON_OPCODE(OPCODE) &&TARGET_##OPCODE,
249
2.75M
#undef ON_OPCODE_UNDEFINED
250
236M
#define ON_OPCODE_UNDEFINED(_) &&TARGET_OP_UNDEFINED,
251
2.75M
        MAP_OPCODES
252
2.75M
#undef ON_OPCODE
253
2.75M
#undef ON_OPCODE_UNDEFINED
254
2.75M
#define ON_OPCODE_UNDEFINED ON_OPCODE_UNDEFINED_DEFAULT
255
2.75M
    };
256
2.75M
    static_assert(std::size(cgoto_table) == 256);
257
258
2.75M
    const auto stack_bottom = state.stack_space.bottom();
259
260
    // Code iterator and stack top pointer for interpreter loop.
261
2.75M
    Position position{code, stack_bottom};
262
263
2.75M
    goto* cgoto_table[*position.code_it];
264
265
2.75M
#define ON_OPCODE(OPCODE)                                                                 \
266
245M
    TARGET_##OPCODE : ASM_COMMENT(OPCODE);                                                \
267
245M
    if (const auto next = invoke<OPCODE>(cost_table, stack_bottom, position, gas, state); \
268
245M
        next.code_it == nullptr)                                                          \
269
245M
    {                                                                                     \
270
2.71M
        return gas;                                                                       \
271
2.71M
    }                                                                                     \
272
245M
    else                                                                                  \
273
245M
    {                                                                                     \
274
        /* Update current position only when no error,                                    \
275
           this improves compiler optimization. */                                        \
276
242M
        position = next;                                                                  \
277
242M
    }                                                                                     \
278
245M
    
goto* cgoto_table[*position.code_it];242M
279
280
488M
    
MAP_OPCODES2.75M
281
488M
#undef ON_OPCODE
282
283
488M
TARGET_OP_UNDEFINED:
284
41.0k
    state.status = EVMC_UNDEFINED_INSTRUCTION;
285
41.0k
    return gas;
286
488M
}
287
#endif
288
}  // namespace
289
290
evmc_result execute(VM& vm, const evmc_host_interface& host, evmc_host_context* ctx,
291
    evmc_revision rev, const evmc_message& msg, const CodeAnalysis& analysis) noexcept
292
2.75M
{
293
2.75M
    const auto code = analysis.executable_code();
294
2.75M
    const auto code_begin = code.data();
295
2.75M
    auto gas = msg.gas;
296
297
2.75M
    auto& state = vm.get_execution_state(static_cast<size_t>(msg.depth));
298
2.75M
    state.reset(msg, rev, host, ctx, analysis.raw_code());
299
300
2.75M
    state.analysis.baseline = &analysis;  // Assign code analysis for instruction implementations.
301
302
2.75M
    const auto& cost_table = get_baseline_cost_table(state.rev, analysis.eof_header().version);
303
304
2.75M
    auto* tracer = vm.get_tracer();
305
2.75M
    if (INTX_UNLIKELY(tracer != nullptr))
306
0
    {
307
0
        tracer->notify_execution_start(state.rev, *state.msg, code);
308
0
        gas = dispatch<true>(cost_table, state, gas, code_begin, tracer);
309
0
    }
310
2.75M
    else
311
2.75M
    {
312
2.75M
#if EVMONE_CGOTO_SUPPORTED
313
2.75M
        if (vm.cgoto)
314
2.75M
            gas = dispatch_cgoto(cost_table, state, gas, code_begin);
315
0
        else
316
0
#endif
317
0
            gas = dispatch<false>(cost_table, state, gas, code_begin);
318
2.75M
    }
319
320
2.75M
    const auto gas_left = (state.status == EVMC_SUCCESS || 
state.status == EVMC_REVERT811k
) ?
gas1.96M
:
0786k
;
  MC/DC Decision Region (320:28) to (320:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (320:28)
+     Condition C2 --> (320:60)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
321
2.75M
    const auto gas_refund = (state.status == EVMC_SUCCESS) ? 
state.gas_refund1.93M
:
0811k
;
322
323
2.75M
    assert(state.output_size != 0 || state.output_offset == 0);
324
2.75M
    const auto result =
325
2.75M
        (state.deploy_container.has_value() ?
326
0
                evmc::make_result(state.status, gas_left, gas_refund,
327
0
                    state.deploy_container->data(), state.deploy_container->size()) :
328
2.75M
                evmc::make_result(state.status, gas_left, gas_refund,
329
2.75M
                    state.output_size != 0 ? 
&state.memory[state.output_offset]455k
:
nullptr2.29M
,
330
2.75M
                    state.output_size));
331
332
2.75M
    if (INTX_UNLIKELY(tracer != nullptr))
333
0
        tracer->notify_execution_end(result);
334
335
2.75M
    return result;
336
2.75M
}
337
338
evmc_result execute(evmc_vm* c_vm, const evmc_host_interface* host, evmc_host_context* ctx,
339
    evmc_revision rev, const evmc_message* msg, const uint8_t* code, size_t code_size) noexcept
340
2.75M
{
341
2.75M
    auto vm = static_cast<VM*>(c_vm);
342
2.75M
    const bytes_view container{code, code_size};
343
2.75M
    const auto eof_enabled = rev >= instr::REV_EOF1;
344
345
    // Since EOF validation recurses into subcontainers, it only makes sense to do for top level
346
    // message calls. The condition for `msg->kind` inside differentiates between creation tx code
347
    // (initcode) and already deployed code (runtime).
348
2.75M
    if (vm->validate_eof && 
eof_enabled0
&&
is_eof_container(container)0
&&
msg->depth == 00
)
  MC/DC Decision Region (348:9) to (348:90)
+
+  Number of Conditions: 4
+     Condition C1 --> (348:9)
+     Condition C2 --> (348:29)
+     Condition C3 --> (348:44)
+     Condition C4 --> (348:75)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3, C4    Result
+  1 { F,  -,  -,  -  = F      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  C3-Pair: not covered
+  C4-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
349
0
    {
350
0
        const auto container_kind =
351
0
            (msg->kind == EVMC_EOFCREATE ? ContainerKind::initcode : ContainerKind::runtime);
352
0
        if (validate_eof(rev, container_kind, container) != EOFValidationError::success)
353
0
            return evmc_make_result(EVMC_CONTRACT_VALIDATION_FAILURE, 0, 0, nullptr, 0);
354
0
    }
355
356
2.75M
    const auto code_analysis = analyze(container, eof_enabled);
357
2.75M
    return execute(*vm, *host, ctx, rev, *msg, code_analysis);
358
2.75M
}
359
}  // namespace evmone::baseline
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline_instruction_table.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline_instruction_table.cpp.html new file mode 100644 index 0000000000..9cd508f70c --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/baseline_instruction_table.cpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone/baseline_instruction_table.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2020 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "baseline_instruction_table.hpp"
6
#include "instructions_traits.hpp"
7
8
namespace evmone::baseline
9
{
10
namespace
11
{
12
consteval auto build_cost_tables(bool eof) noexcept
13
{
14
    std::array<CostTable, EVMC_MAX_REVISION + 1> tables{};
15
    for (size_t r = EVMC_FRONTIER; r <= EVMC_MAX_REVISION; ++r)
16
    {
17
        auto& table = tables[r];
18
        for (size_t op = 0; op < table.size(); ++op)
19
        {
20
            const auto& tr = instr::traits[op];
21
            const auto since = eof ? tr.eof_since : tr.since;
22
            table[op] = (since && r >= *since) ? instr::gas_costs[r][op] : instr::undefined;
23
        }
24
    }
25
    return tables;
26
}
27
28
constexpr auto LEGACY_COST_TABLES = build_cost_tables(false);
29
constexpr auto EOF_COST_TABLES = build_cost_tables(true);
30
}  // namespace
31
32
const CostTable& get_baseline_cost_table(evmc_revision rev, uint8_t eof_version) noexcept
33
2.75M
{
34
2.75M
    const auto& tables = (eof_version == 0) ? LEGACY_COST_TABLES : 
EOF_COST_TABLES0
;
35
2.75M
    return tables[rev];
36
2.75M
}
37
}  // namespace evmone::baseline
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/delegation.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/delegation.cpp.html new file mode 100644 index 0000000000..a449bf8bf0 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/delegation.cpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone/delegation.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2025 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#include "delegation.hpp"
5
#include <cassert>
6
7
namespace evmone
8
{
9
std::optional<evmc::address> get_delegate_address(
10
    const evmc::HostInterface& host, const evmc::address& addr) noexcept
11
2.43M
{
12
    // Load the code prefix up to the delegation designation size.
13
    // The HostInterface::copy_code() copies up to the addr's code size
14
    // and returns the number of bytes copied.
15
2.43M
    uint8_t designation_buffer[std::size(DELEGATION_MAGIC) + sizeof(evmc::address)];
16
2.43M
    const auto size = host.copy_code(addr, 0, designation_buffer, std::size(designation_buffer));
17
2.43M
    const bytes_view designation{designation_buffer, size};
18
19
2.43M
    if (!is_code_delegated(designation))
20
2.42M
        return {};
21
22
    // Copy the delegate address from the designation buffer.
23
5.42k
    evmc::address delegate_address;
24
    // Assume the designation with the valid magic has also valid length.
25
    assert(designation.size() == std::size(designation_buffer));
26
5.42k
    std::ranges::copy(designation.substr(std::size(DELEGATION_MAGIC)), delegate_address.bytes);
27
5.42k
    return delegate_address;
28
2.43M
}
29
}  // namespace evmone
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/delegation.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/delegation.hpp.html new file mode 100644 index 0000000000..476d598b9a --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/delegation.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone/delegation.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2025 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <evmc/bytes.hpp>
7
#include <evmc/evmc.hpp>
8
#include <evmc/utils.h>
9
10
namespace evmone
11
{
12
using evmc::bytes_view;
13
14
/// Prefix of code for delegated accounts
15
/// defined by [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702)
16
constexpr uint8_t DELEGATION_MAGIC_BYTES[] = {0xef, 0x01, 0x00};
17
constexpr bytes_view DELEGATION_MAGIC{DELEGATION_MAGIC_BYTES, std::size(DELEGATION_MAGIC_BYTES)};
18
19
/// Check if code contains EIP-7702 delegation designator
20
constexpr bool is_code_delegated(bytes_view code) noexcept
21
3.03M
{
22
3.03M
    return code.starts_with(DELEGATION_MAGIC);
23
3.03M
}
24
25
/// Get EIP-7702 delegate address from the code of addr, if it is delegated.
26
EVMC_EXPORT std::optional<evmc::address> get_delegate_address(
27
    const evmc::HostInterface& host, const evmc::address& addr) noexcept;
28
}  // namespace evmone
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/execution_state.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/execution_state.hpp.html new file mode 100644 index 0000000000..06a2da8db4 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/execution_state.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone/execution_state.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2019 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <evmc/evmc.hpp>
7
#include <intx/intx.hpp>
8
#include <exception>
9
#include <memory>
10
#include <string>
11
#include <vector>
12
13
namespace evmone
14
{
15
namespace advanced
16
{
17
struct AdvancedCodeAnalysis;
18
}
19
namespace baseline
20
{
21
class CodeAnalysis;
22
}
23
24
using evmc::bytes;
25
using evmc::bytes_view;
26
using intx::uint256;
27
28
29
/// Provides memory for EVM stack.
30
class StackSpace
31
{
32
    struct Storage
33
    {
34
        /// The maximum number of EVM stack items.
35
        static constexpr auto limit = 1024;
36
37
        /// Stack space items are aligned to 256 bits for better packing in cache lines.
38
        static constexpr auto alignment = sizeof(uint256);
39
40
        alignas(alignment) uint256 items[limit];
41
    };
42
43
    /// The storage allocated for maximum possible number of items.
44
    std::unique_ptr<Storage> m_stack_space = std::make_unique<Storage>();
45
46
public:
47
    static constexpr auto limit = Storage::limit;
48
49
    /// Returns the pointer to the "bottom", i.e. below the stack space.
50
2.75M
    [[nodiscard]] uint256* bottom() noexcept { return &m_stack_space->items[0]; }
51
};
52
53
54
/// The EVM memory.
55
///
56
/// The implementations uses initial allocation of 4k and then grows capacity with 2x factor.
57
/// Some benchmarks have been done to confirm 4k is ok-ish value.
58
class Memory
59
{
60
    /// The size of allocation "page".
61
    static constexpr size_t page_size = 4 * 1024;
62
63
    struct FreeDeleter
64
    {
65
2.05k
        void operator()(uint8_t* p) const noexcept { std::free(p); }
66
    };
67
68
    /// Owned pointer to allocated memory.
69
    std::unique_ptr<uint8_t[], FreeDeleter> m_data;
70
71
    /// The "virtual" size of the memory.
72
    size_t m_size = 0;
73
74
    /// The size of allocated memory. The initialization value is the initial capacity.
75
    size_t m_capacity = page_size;
76
77
0
    [[noreturn, gnu::cold]] static void handle_out_of_memory() noexcept { std::terminate(); }
78
79
    void allocate_capacity() noexcept
80
6.76k
    {
81
6.76k
        m_data.reset(static_cast<uint8_t*>(std::realloc(m_data.release(), m_capacity)));
82
6.76k
        if (!m_data) [[unlikely]]
83
0
            handle_out_of_memory();
84
6.76k
    }
85
86
public:
87
    /// Creates Memory object with initial capacity allocation.
88
2.05k
    Memory() noexcept { allocate_capacity(); }
89
90
24.6M
    uint8_t& operator[](size_t index) noexcept { return m_data[index]; }
91
92
0
    [[nodiscard]] const uint8_t* data() const noexcept { return m_data.get(); }
93
26.9M
    [[nodiscard]] size_t size() const noexcept { return m_size; }
94
95
    /// Grows the memory to the given size. The extent is filled with zeros.
96
    ///
97
    /// @param new_size  New memory size. Must be larger than the current size and multiple of 32.
98
    void grow(size_t new_size) noexcept
99
1.80M
    {
100
        // Restriction for future changes. EVM always has memory size as multiple of 32 bytes.
101
1.80M
        INTX_REQUIRE(new_size % 32 == 0);
102
103
        // Allow only growing memory. Include hint for optimizing compiler.
104
1.80M
        INTX_REQUIRE(new_size > m_size);
105
106
1.80M
        if (new_size > m_capacity)
107
4.71k
        {
108
4.71k
            m_capacity *= 2;  // Double the capacity.
109
110
4.71k
            if (m_capacity < new_size)  // If not enough.
111
1.66k
            {
112
                // Set capacity to required size rounded to multiple of page_size.
113
1.66k
                m_capacity = ((new_size + (page_size - 1)) / page_size) * page_size;
114
1.66k
            }
115
116
4.71k
            allocate_capacity();
117
4.71k
        }
118
1.80M
        std::memset(&m_data[m_size], 0, new_size - m_size);
119
1.80M
        m_size = new_size;
120
1.80M
    }
121
122
    /// Virtually clears the memory by setting its size to 0. The capacity stays unchanged.
123
2.75M
    void clear() noexcept { m_size = 0; }
124
};
125
126
/// Initcode read from Initcode Transaction (EIP-7873).
127
struct TransactionInitcode
128
{
129
    /// Initcode bytes.
130
    bytes_view code;
131
    /// Result of initcode validation, if it was validated.
132
    /// std::nullopt if initcode was not validated yet.
133
    std::optional<bool> is_valid;
134
};
135
136
/// Generic execution state for generic instructions implementations.
137
// NOLINTNEXTLINE(clang-analyzer-optin.performance.Padding)
138
class ExecutionState
139
{
140
public:
141
    int64_t gas_refund = 0;
142
    Memory memory;
143
    const evmc_message* msg = nullptr;
144
    evmc::HostContext host;
145
    evmc_revision rev = {};
146
    bytes return_data;
147
148
    /// Reference to original EVM code container.
149
    /// For legacy code this is a reference to entire original code.
150
    /// For EOF-formatted code this is a reference to entire container.
151
    bytes_view original_code;
152
153
    evmc_status_code status = EVMC_SUCCESS;
154
    size_t output_offset = 0;
155
    size_t output_size = 0;
156
157
    /// Container to be deployed returned from RETURNCODE, used only inside EOFCREATE execution.
158
    std::optional<bytes> deploy_container;
159
160
private:
161
    evmc_tx_context m_tx = {};
162
    std::optional<std::unordered_map<evmc::bytes32, TransactionInitcode>> m_initcodes;
163
164
public:
165
    /// Pointer to code analysis.
166
    /// This should be set and used internally by execute() function of a particular interpreter.
167
    union
168
    {
169
        const baseline::CodeAnalysis* baseline = nullptr;
170
        const advanced::AdvancedCodeAnalysis* advanced;
171
    } analysis{};
172
173
    std::vector<const uint8_t*> call_stack;
174
175
    /// Stack space allocation.
176
    ///
177
    /// This is the last field to make other fields' offsets of reasonable values.
178
    StackSpace stack_space;
179
180
2.05k
    ExecutionState() noexcept = default;
181
182
    ExecutionState(const evmc_message& message, evmc_revision revision,
183
        const evmc_host_interface& host_interface, evmc_host_context* host_ctx,
184
        bytes_view _code) noexcept
185
0
      : msg{&message}, host{host_interface, host_ctx}, rev{revision}, original_code{_code}
186
0
    {}
187
188
    /// Resets the contents of the ExecutionState so that it could be reused.
189
    void reset(const evmc_message& message, evmc_revision revision,
190
        const evmc_host_interface& host_interface, evmc_host_context* host_ctx,
191
        bytes_view _code) noexcept
192
2.75M
    {
193
2.75M
        gas_refund = 0;
194
2.75M
        memory.clear();
195
2.75M
        msg = &message;
196
2.75M
        host = {host_interface, host_ctx};
197
2.75M
        rev = revision;
198
2.75M
        return_data.clear();
199
2.75M
        original_code = _code;
200
2.75M
        status = EVMC_SUCCESS;
201
2.75M
        output_offset = 0;
202
2.75M
        output_size = 0;
203
2.75M
        deploy_container = {};
204
2.75M
        m_tx = {};
205
2.75M
        m_initcodes.reset();
206
2.75M
        call_stack = {};
207
2.75M
    }
208
209
13.9M
    [[nodiscard]] bool in_static_mode() const { return (msg->flags & EVMC_STATIC) != 0; }
210
211
    const evmc_tx_context& get_tx_context() noexcept
212
447k
    {
213
447k
        if (INTX_UNLIKELY(m_tx.block_timestamp == 0))
214
168k
            m_tx = host.get_tx_context();
215
447k
        return m_tx;
216
447k
    }
217
218
    /// Get initcode by its hash from transaction initcodes.
219
    ///
220
    /// Returns nullptr if no such initcode was found.
221
    [[nodiscard]] TransactionInitcode* get_tx_initcode_by_hash(const evmc_bytes32& hash)
222
0
    {
223
0
        if (!m_initcodes.has_value())
224
0
        {
225
0
            m_initcodes.emplace();
226
0
            const auto& tx_context = get_tx_context();
227
0
            for (size_t i = 0; i < tx_context.initcodes_count; ++i)
228
0
            {
229
0
                const auto& initcode = tx_context.initcodes[i];
230
0
                m_initcodes->insert({initcode.hash,
231
0
                    {.code = {initcode.code, initcode.code_size}, .is_valid = std::nullopt}});
232
0
            }
233
0
        }
234
235
0
        const auto it = m_initcodes->find(hash);
236
0
        return it != m_initcodes->end() ? &it->second : nullptr;
237
0
    }
238
};
239
}  // namespace evmone
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions.hpp.html new file mode 100644 index 0000000000..5e9679d296 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions.hpp.html @@ -0,0 +1,157 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone/instructions.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2019 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include "baseline.hpp"
7
#include "eof.hpp"
8
#include "execution_state.hpp"
9
#include "instructions_traits.hpp"
10
#include "instructions_xmacro.hpp"
11
#include <evmone_precompiles/keccak.hpp>
12
13
namespace evmone
14
{
15
using code_iterator = const uint8_t*;
16
17
/// Represents the pointer to the stack top item
18
/// and allows retrieving stack items and manipulating the pointer.
19
class StackTop
20
{
21
    uint256* m_end;  ///< Pointer to the stack end (1 slot above the stack top item).
22
23
public:
24
    explicit(false) StackTop(uint256* end) noexcept
25
245M
      : m_end{std::assume_aligned<sizeof(uint256)>(end)}
26
245M
    {}
27
28
    /// Returns the pointer to the stack end (the stack slot above the top item).
29
0
    [[nodiscard]] uint256* end() noexcept { return m_end; }
30
31
    /// Returns the reference to the stack item by index, where 0 means the top item
32
    /// and positive index values the items further down the stack.
33
    /// Using [-1] is also valid, but .push() should be used instead.
34
30.5M
    [[nodiscard]] uint256& operator[](int index) noexcept { return m_end[-1 - index]; }
35
36
    /// Returns the reference to the stack top item.
37
144M
    [[nodiscard]] uint256& top() noexcept { return m_end[-1]; }
38
39
    /// Returns the current top item and move the stack top pointer down.
40
    /// The value is returned by reference because the stack slot remains valid.
41
113M
    [[nodiscard]] uint256& pop() noexcept { return *--m_end; }
42
43
    /// Assigns the value to the stack top and moves the stack top pointer up.
44
128M
    void push(const uint256& value) noexcept { *m_end++ = value; }
45
};
46
47
48
/// Instruction execution result.
49
struct Result
50
{
51
    evmc_status_code status;
52
    int64_t gas_left;
53
};
54
55
/// Instruction result indicating that execution terminates unconditionally.
56
struct TermResult : Result
57
{};
58
59
constexpr auto max_buffer_size = std::numeric_limits<uint32_t>::max();
60
61
/// The size of the EVM 256-bit word.
62
constexpr auto word_size = 32;
63
64
/// Returns number of words what would fit to provided number of bytes,
65
/// i.e. it rounds up the number bytes to number of words.
66
constexpr int64_t num_words(uint64_t size_in_bytes) noexcept
67
2.03M
{
68
2.03M
    return static_cast<int64_t>((size_in_bytes + (word_size - 1)) / word_size);
69
2.03M
}
70
71
/// Computes gas cost of copying the given amount of bytes to/from EVM memory.
72
constexpr int64_t copy_cost(uint64_t size_in_bytes) noexcept
73
166k
{
74
166k
    constexpr auto WordCopyCost = 3;
75
166k
    return num_words(size_in_bytes) * WordCopyCost;
76
166k
}
77
78
/// Grows EVM memory and checks its cost.
79
///
80
/// This function should not be inlined because this may affect other inlining decisions:
81
/// - making check_memory() too costly to inline,
82
/// - making mload()/mstore()/mstore8() too costly to inline.
83
///
84
/// TODO: This function should be moved to Memory class.
85
[[gnu::noinline]] inline int64_t grow_memory(
86
    int64_t gas_left, Memory& memory, uint64_t new_size) noexcept
87
1.80M
{
88
    // This implementation recomputes memory.size(). This value is already known to the caller
89
    // and can be passed as a parameter, but this make no difference to the performance.
90
91
1.80M
    const auto new_words = num_words(new_size);
92
1.80M
    const auto current_words = static_cast<int64_t>(memory.size() / word_size);
93
1.80M
    const auto new_cost = 3 * new_words + new_words * new_words / 512;
94
1.80M
    const auto current_cost = 3 * current_words + current_words * current_words / 512;
95
1.80M
    const auto cost = new_cost - current_cost;
96
97
1.80M
    gas_left -= cost;
98
1.80M
    if (gas_left >= 0) [[likely]]
99
1.80M
        memory.grow(static_cast<size_t>(new_words * word_size));
100
1.80M
    return gas_left;
101
1.80M
}
102
103
/// Check memory requirements of a reasonable size.
104
inline bool check_memory(
105
    int64_t& gas_left, Memory& memory, const uint256& offset, uint64_t size) noexcept
106
25.1M
{
107
    // TODO: This should be done in intx.
108
    // There is "branchless" variant of this using | instead of ||, but benchmarks difference
109
    // is within noise. This should be decided when moving the implementation to intx.
110
25.1M
    if (((offset[3] | offset[2] | offset[1]) != 0) || 
(offset[0] > max_buffer_size)25.1M
)
  MC/DC Decision Region (110:9) to (110:84)
+
+  Number of Conditions: 2
+     Condition C1 --> (110:9)
+     Condition C2 --> (110:55)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
111
1.11k
        return false;
112
113
25.1M
    const auto new_size = static_cast<uint64_t>(offset) + size;
114
25.1M
    if (new_size > memory.size())
115
1.80M
        gas_left = grow_memory(gas_left, memory, new_size);
116
117
25.1M
    return gas_left >= 0;  // Always true for no-grow case.
118
25.1M
}
119
120
/// Check memory requirements for "copy" instructions.
121
inline bool check_memory(
122
    int64_t& gas_left, Memory& memory, const uint256& offset, const uint256& size) noexcept
123
9.05M
{
124
9.05M
    if (size == 0)  // Copy of size 0 is always valid (even if offset is huge).
125
4.64M
        return true;
126
127
    // This check has 3 same word checks with the check above.
128
    // However, compilers do decent although not perfect job unifying common instructions.
129
    // TODO: This should be done in intx.
130
4.41M
    if (((size[3] | size[2] | size[1]) != 0) || 
(size[0] > max_buffer_size)4.41M
)
  MC/DC Decision Region (130:9) to (130:76)
+
+  Number of Conditions: 2
+     Condition C1 --> (130:9)
+     Condition C2 --> (130:49)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
131
1.70k
        return false;
132
133
4.41M
    return check_memory(gas_left, memory, offset, static_cast<uint64_t>(size));
134
4.41M
}
135
136
namespace instr::core
137
{
138
139
/// The "core" instruction implementations.
140
///
141
/// These are minimal EVM instruction implementations which assume:
142
/// - the stack requirements (overflow, underflow) have already been checked,
143
/// - the "base" gas const has already been charged,
144
/// - the `stack` pointer points to the EVM stack top element.
145
/// Moreover, these implementations _do not_ inform about new stack height
146
/// after execution. The adjustment must be performed by the caller.
147
28.4M
inline void noop(StackTop /*stack*/) noexcept {}
148
inline constexpr auto pop = noop;
149
inline constexpr auto jumpdest = noop;
150
151
template <evmc_status_code Status>
152
inline TermResult stop_impl(
153
    StackTop /*stack*/, int64_t gas_left, ExecutionState& /*state*/) noexcept
154
1.40M
{
155
1.40M
    return {Status, gas_left};
156
1.40M
}
evmone::TermResult evmone::instr::core::stop_impl<(evmc_status_code)0>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
154
1.40M
{
155
1.40M
    return {Status, gas_left};
156
1.40M
}
evmone::TermResult evmone::instr::core::stop_impl<(evmc_status_code)4>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
154
1.96k
{
155
1.96k
    return {Status, gas_left};
156
1.96k
}
157
inline constexpr auto stop = stop_impl<EVMC_SUCCESS>;
158
inline constexpr auto invalid = stop_impl<EVMC_INVALID_INSTRUCTION>;
159
160
inline void add(StackTop stack) noexcept
161
15.6M
{
162
15.6M
    stack.top() += stack.pop();
163
15.6M
}
164
165
inline void mul(StackTop stack) noexcept
166
236k
{
167
236k
    stack.top() *= stack.pop();
168
236k
}
169
170
inline void sub(StackTop stack) noexcept
171
3.12M
{
172
3.12M
    stack[1] = stack[0] - stack[1];
173
3.12M
}
174
175
inline void div(StackTop stack) noexcept
176
46.5k
{
177
46.5k
    auto& v = stack[1];
178
46.5k
    v = v != 0 ? 
stack[0] / v46.5k
:
066
;
179
46.5k
}
180
181
inline void sdiv(StackTop stack) noexcept
182
4.01k
{
183
4.01k
    auto& v = stack[1];
184
4.01k
    v = v != 0 ? 
intx::sdivrem(stack[0], v).quot3.92k
:
090
;
185
4.01k
}
186
187
inline void mod(StackTop stack) noexcept
188
155k
{
189
155k
    auto& v = stack[1];
190
155k
    v = v != 0 ? 
stack[0] % v154k
:
066
;
191
155k
}
192
193
inline void smod(StackTop stack) noexcept
194
3.51k
{
195
3.51k
    auto& v = stack[1];
196
3.51k
    v = v != 0 ? 
intx::sdivrem(stack[0], v).rem3.44k
:
072
;
197
3.51k
}
198
199
inline void addmod(StackTop stack) noexcept
200
2.00k
{
201
2.00k
    const auto& x = stack.pop();
202
2.00k
    const auto& y = stack.pop();
203
2.00k
    auto& m = stack.top();
204
2.00k
    m = m != 0 ? 
intx::addmod(x, y, m)1.74k
:
0252
;
205
2.00k
}
206
207
inline void mulmod(StackTop stack) noexcept
208
2.27k
{
209
2.27k
    const auto& x = stack[0];
210
2.27k
    const auto& y = stack[1];
211
2.27k
    auto& m = stack[2];
212
2.27k
    m = m != 0 ? 
intx::mulmod(x, y, m)2.03k
:
0240
;
213
2.27k
}
214
215
inline Result exp(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
216
37.1k
{
217
37.1k
    const auto& base = stack.pop();
218
37.1k
    auto& exponent = stack.top();
219
220
37.1k
    const auto exponent_significant_bytes =
221
37.1k
        static_cast<int>(intx::count_significant_bytes(exponent));
222
37.1k
    const auto exponent_cost = state.rev >= EVMC_SPURIOUS_DRAGON ? 
5037.0k
:
1086
;
223
37.1k
    const auto additional_cost = exponent_significant_bytes * exponent_cost;
224
37.1k
    if ((gas_left -= additional_cost) < 0)
225
0
        return {EVMC_OUT_OF_GAS, gas_left};
226
227
37.1k
    exponent = intx::exp(base, exponent);
228
37.1k
    return {EVMC_SUCCESS, gas_left};
229
37.1k
}
230
231
inline void signextend(StackTop stack) noexcept
232
2.52k
{
233
2.52k
    const auto& ext = stack.pop();
234
2.52k
    auto& x = stack.top();
235
236
2.52k
    if (ext < 31)  // For 31 we also don't need to do anything.
237
1.06k
    {
238
1.06k
        const auto e = ext[0];  // uint256 -> uint64.
239
1.06k
        const auto sign_word_index =
240
1.06k
            static_cast<size_t>(e / sizeof(e));      // Index of the word with the sign bit.
241
1.06k
        const auto sign_byte_index = e % sizeof(e);  // Index of the sign byte in the sign word.
242
1.06k
        auto& sign_word = x[sign_word_index];
243
244
1.06k
        const auto sign_byte_offset = sign_byte_index * 8;
245
1.06k
        const auto sign_byte = sign_word >> sign_byte_offset;  // Move sign byte to position 0.
246
247
        // Sign-extend the "sign" byte and move it to the right position. Value bits are zeros.
248
1.06k
        const auto sext_byte = static_cast<uint64_t>(int64_t{static_cast<int8_t>(sign_byte)});
249
1.06k
        const auto sext = sext_byte << sign_byte_offset;
250
251
1.06k
        const auto sign_mask = ~uint64_t{0} << sign_byte_offset;
252
1.06k
        const auto value = sign_word & ~sign_mask;  // Reset extended bytes.
253
1.06k
        sign_word = sext | value;                   // Combine the result word.
254
255
        // Produce bits (all zeros or ones) for extended words. This is done by SAR of
256
        // the sign-extended byte. Shift by any value 7-63 would work.
257
1.06k
        const auto sign_ex = static_cast<uint64_t>(static_cast<int64_t>(sext_byte) >> 8);
258
259
4.21k
        for (size_t i = 3; i > sign_word_index; 
--i3.15k
)
260
3.15k
            x[i] = sign_ex;  // Clear extended words.
261
1.06k
    }
262
2.52k
}
263
264
inline void lt(StackTop stack) noexcept
265
2.94M
{
266
2.94M
    const auto& x = stack.pop();
267
2.94M
    stack[0] = x < stack[0];
268
2.94M
}
269
270
inline void gt(StackTop stack) noexcept
271
394k
{
272
394k
    const auto& x = stack.pop();
273
394k
    stack[0] = stack[0] < x;  // Arguments are swapped and < is used.
274
394k
}
275
276
inline void slt(StackTop stack) noexcept
277
6.51k
{
278
6.51k
    const auto& x = stack.pop();
279
6.51k
    stack[0] = slt(x, stack[0]);
280
6.51k
}
281
282
inline void sgt(StackTop stack) noexcept
283
6.15k
{
284
6.15k
    const auto& x = stack.pop();
285
6.15k
    stack[0] = slt(stack[0], x);  // Arguments are swapped and SLT is used.
286
6.15k
}
287
288
inline void eq(StackTop stack) noexcept
289
825k
{
290
825k
    stack[1] = stack[0] == stack[1];
291
825k
}
292
293
inline void iszero(StackTop stack) noexcept
294
5.10M
{
295
5.10M
    stack.top() = stack.top() == 0;
296
5.10M
}
297
298
inline void and_(StackTop stack) noexcept
299
128k
{
300
128k
    stack.top() &= stack.pop();
301
128k
}
302
303
inline void or_(StackTop stack) noexcept
304
51.7k
{
305
51.7k
    stack.top() |= stack.pop();
306
51.7k
}
307
308
inline void xor_(StackTop stack) noexcept
309
1.61k
{
310
1.61k
    stack.top() ^= stack.pop();
311
1.61k
}
312
313
inline void not_(StackTop stack) noexcept
314
70.3k
{
315
70.3k
    stack.top() = ~stack.top();
316
70.3k
}
317
318
inline void byte(StackTop stack) noexcept
319
78.2k
{
320
78.2k
    const auto& n = stack.pop();
321
78.2k
    auto& x = stack.top();
322
323
78.2k
    const bool n_valid = n < 32;
324
78.2k
    const uint64_t byte_mask = (n_valid ? 
0xff78.1k
:
080
);
325
326
78.2k
    const auto index = 31 - static_cast<unsigned>(n[0] % 32);
327
78.2k
    const auto word = x[index / 8];
328
78.2k
    const auto byte_index = index % 8;
329
78.2k
    const auto byte = (word >> (byte_index * 8)) & byte_mask;
330
78.2k
    x = byte;
331
78.2k
}
332
333
inline void shl(StackTop stack) noexcept
334
3.46M
{
335
3.46M
    stack.top() <<= stack.pop();
336
3.46M
}
337
338
inline void shr(StackTop stack) noexcept
339
18.5k
{
340
18.5k
    stack.top() >>= stack.pop();
341
18.5k
}
342
343
inline void sar(StackTop stack) noexcept
344
8.24k
{
345
8.24k
    const auto& y = stack.pop();
346
8.24k
    auto& x = stack.top();
347
348
8.24k
    const bool is_neg = static_cast<int64_t>(x[3]) < 0;  // Inspect the top bit (words are LE).
349
8.24k
    const auto sign_mask = is_neg ? 
~uint256{}2.32k
:
uint256{}5.91k
;
350
351
8.24k
    const auto mask_shift = (y < 256) ? 
(256 - y[0])3.29k
:
04.94k
;
352
8.24k
    x = (x >> y) | (sign_mask << mask_shift);
353
8.24k
}
354
355
inline void clz(StackTop stack) noexcept
356
2.81k
{
357
2.81k
    stack.top() = clz(stack.top());
358
2.81k
}
359
360
inline Result keccak256(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
361
15.5k
{
362
15.5k
    const auto& index = stack.pop();
363
15.5k
    auto& size = stack.top();
364
365
15.5k
    if (!check_memory(gas_left, state.memory, index, size))
366
2.19k
        return {EVMC_OUT_OF_GAS, gas_left};
367
368
13.3k
    const auto i = static_cast<size_t>(index);
369
13.3k
    const auto s = static_cast<size_t>(size);
370
13.3k
    const auto w = num_words(s);
371
13.3k
    const auto cost = w * 6;
372
13.3k
    if ((gas_left -= cost) < 0)
373
600
        return {EVMC_OUT_OF_GAS, gas_left};
374
375
12.7k
    auto data = s != 0 ? 
&state.memory[i]11.9k
:
nullptr801
;
376
12.7k
    size = intx::be::load<uint256>(ethash::keccak256(data, s));
377
12.7k
    return {EVMC_SUCCESS, gas_left};
378
13.3k
}
379
380
381
inline void address(StackTop stack, ExecutionState& state) noexcept
382
56.8k
{
383
56.8k
    stack.push(intx::be::load<uint256>(state.msg->recipient));
384
56.8k
}
385
386
inline Result balance(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
387
7.83k
{
388
7.83k
    auto& x = stack.top();
389
7.83k
    const auto addr = intx::be::trunc<evmc::address>(x);
390
391
7.83k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(addr) == EVMC_ACCESS_COLD7.66k
)
  MC/DC Decision Region (391:9) to (391:88)
+
+  Number of Conditions: 2
+     Condition C1 --> (391:9)
+     Condition C2 --> (391:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
392
1.56k
    {
393
1.56k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
394
12
            return {EVMC_OUT_OF_GAS, gas_left};
395
1.56k
    }
396
397
7.82k
    x = intx::be::load<uint256>(state.host.get_balance(addr));
398
7.82k
    return {EVMC_SUCCESS, gas_left};
399
7.83k
}
400
401
inline void origin(StackTop stack, ExecutionState& state) noexcept
402
23.6k
{
403
23.6k
    stack.push(intx::be::load<uint256>(state.get_tx_context().tx_origin));
404
23.6k
}
405
406
inline void caller(StackTop stack, ExecutionState& state) noexcept
407
269k
{
408
269k
    stack.push(intx::be::load<uint256>(state.msg->sender));
409
269k
}
410
411
inline void callvalue(StackTop stack, ExecutionState& state) noexcept
412
24.9k
{
413
24.9k
    stack.push(intx::be::load<uint256>(state.msg->value));
414
24.9k
}
415
416
inline void calldataload(StackTop stack, ExecutionState& state) noexcept
417
1.82M
{
418
1.82M
    auto& index = stack.top();
419
420
1.82M
    if (state.msg->input_size < index)
421
8.08k
        index = 0;
422
1.81M
    else
423
1.81M
    {
424
1.81M
        const auto begin = static_cast<size_t>(index);
425
1.81M
        const auto end = std::min(begin + 32, state.msg->input_size);
426
427
1.81M
        uint8_t data[32] = {};
428
50.4M
        for (size_t i = 0; i < (end - begin); 
++i48.5M
)
429
48.5M
            data[i] = state.msg->input_data[begin + i];
430
431
1.81M
        index = intx::be::load<uint256>(data);
432
1.81M
    }
433
1.82M
}
434
435
inline void calldatasize(StackTop stack, ExecutionState& state) noexcept
436
107k
{
437
107k
    stack.push(state.msg->input_size);
438
107k
}
439
440
inline Result calldatacopy(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
441
121k
{
442
121k
    const auto& mem_index = stack.pop();
443
121k
    const auto& input_index = stack.pop();
444
121k
    const auto& size = stack.pop();
445
446
121k
    if (!check_memory(gas_left, state.memory, mem_index, size))
447
108
        return {EVMC_OUT_OF_GAS, gas_left};
448
449
121k
    auto dst = static_cast<size_t>(mem_index);
450
121k
    auto src = state.msg->input_size < input_index ? 
state.msg->input_size234
:
451
121k
                                                     
static_cast<size_t>(input_index)120k
;
452
121k
    auto s = static_cast<size_t>(size);
453
121k
    auto copy_size = std::min(s, state.msg->input_size - src);
454
455
121k
    if (const auto cost = copy_cost(s); (gas_left -= cost) < 0)
456
6
        return {EVMC_OUT_OF_GAS, gas_left};
457
458
121k
    if (copy_size > 0)
459
113k
        std::memcpy(&state.memory[dst], &state.msg->input_data[src], copy_size);
460
461
121k
    if (s - copy_size > 0)
462
7.31k
        std::memset(&state.memory[dst + copy_size], 0, s - copy_size);
463
464
121k
    return {EVMC_SUCCESS, gas_left};
465
121k
}
466
467
inline void codesize(StackTop stack, ExecutionState& state) noexcept
468
21.2k
{
469
21.2k
    stack.push(state.original_code.size());
470
21.2k
}
471
472
inline Result codecopy(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
473
23.2k
{
474
    // TODO: Similar to calldatacopy().
475
476
23.2k
    const auto& mem_index = stack.pop();
477
23.2k
    const auto& input_index = stack.pop();
478
23.2k
    const auto& size = stack.pop();
479
480
23.2k
    if (!check_memory(gas_left, state.memory, mem_index, size))
481
108
        return {EVMC_OUT_OF_GAS, gas_left};
482
483
23.1k
    const auto code_size = state.original_code.size();
484
23.1k
    const auto dst = static_cast<size_t>(mem_index);
485
23.1k
    const auto src = code_size < input_index ? 
code_size186
:
static_cast<size_t>(input_index)22.9k
;
486
23.1k
    const auto s = static_cast<size_t>(size);
487
23.1k
    const auto copy_size = std::min(s, code_size - src);
488
489
23.1k
    if (const auto cost = copy_cost(s); (gas_left -= cost) < 0)
490
6
        return {EVMC_OUT_OF_GAS, gas_left};
491
492
    // TODO: Add unit tests for each combination of conditions.
493
23.1k
    if (copy_size > 0)
494
22.8k
        std::memcpy(&state.memory[dst], &state.original_code[src], copy_size);
495
496
23.1k
    if (s - copy_size > 0)
497
876
        std::memset(&state.memory[dst + copy_size], 0, s - copy_size);
498
499
23.1k
    return {EVMC_SUCCESS, gas_left};
500
23.1k
}
501
502
503
inline void gasprice(StackTop stack, ExecutionState& state) noexcept
504
13.4k
{
505
13.4k
    stack.push(intx::be::load<uint256>(state.get_tx_context().tx_gas_price));
506
13.4k
}
507
508
inline void basefee(StackTop stack, ExecutionState& state) noexcept
509
520
{
510
520
    stack.push(intx::be::load<uint256>(state.get_tx_context().block_base_fee));
511
520
}
512
513
inline void blobhash(StackTop stack, ExecutionState& state) noexcept
514
2.85k
{
515
2.85k
    auto& index = stack.top();
516
2.85k
    const auto& tx = state.get_tx_context();
517
518
2.85k
    index = (index < tx.blob_hashes_count) ?
519
2.07k
                intx::be::load<uint256>(tx.blob_hashes[static_cast<size_t>(index)]) :
520
2.85k
                
0779
;
521
2.85k
}
522
523
inline void blobbasefee(StackTop stack, ExecutionState& state) noexcept
524
12.7k
{
525
12.7k
    stack.push(intx::be::load<uint256>(state.get_tx_context().blob_base_fee));
526
12.7k
}
527
528
inline Result extcodesize(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
529
470k
{
530
470k
    auto& x = stack.top();
531
470k
    const auto addr = intx::be::trunc<evmc::address>(x);
532
533
470k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(addr) == EVMC_ACCESS_COLD468k
)
  MC/DC Decision Region (533:9) to (533:88)
+
+  Number of Conditions: 2
+     Condition C1 --> (533:9)
+     Condition C2 --> (533:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
534
4.78k
    {
535
4.78k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
536
156
            return {EVMC_OUT_OF_GAS, gas_left};
537
4.78k
    }
538
539
470k
    x = state.host.get_code_size(addr);
540
470k
    return {EVMC_SUCCESS, gas_left};
541
470k
}
542
543
inline Result extcodecopy(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
544
12.8k
{
545
12.8k
    const auto addr = intx::be::trunc<evmc::address>(stack.pop());
546
12.8k
    const auto& mem_index = stack.pop();
547
12.8k
    const auto& input_index = stack.pop();
548
12.8k
    const auto& size = stack.pop();
549
550
12.8k
    if (!check_memory(gas_left, state.memory, mem_index, size))
551
96
        return {EVMC_OUT_OF_GAS, gas_left};
552
553
12.7k
    const auto s = static_cast<size_t>(size);
554
12.7k
    if (const auto cost = copy_cost(s); (gas_left -= cost) < 0)
555
18
        return {EVMC_OUT_OF_GAS, gas_left};
556
557
12.7k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(addr) == EVMC_ACCESS_COLD11.2k
)
  MC/DC Decision Region (557:9) to (557:88)
+
+  Number of Conditions: 2
+     Condition C1 --> (557:9)
+     Condition C2 --> (557:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
558
1.03k
    {
559
1.03k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
560
6
            return {EVMC_OUT_OF_GAS, gas_left};
561
1.03k
    }
562
563
12.7k
    if (s > 0)
564
12.5k
    {
565
12.5k
        const auto src =
566
12.5k
            (max_buffer_size < input_index) ? 
max_buffer_size66
:
static_cast<size_t>(input_index)12.4k
;
567
12.5k
        const auto dst = static_cast<size_t>(mem_index);
568
12.5k
        const auto num_bytes_copied = state.host.copy_code(addr, src, &state.memory[dst], s);
569
12.5k
        if (const auto num_bytes_to_clear = s - num_bytes_copied; num_bytes_to_clear > 0)
570
1.41k
            std::memset(&state.memory[dst + num_bytes_copied], 0, num_bytes_to_clear);
571
12.5k
    }
572
573
12.7k
    return {EVMC_SUCCESS, gas_left};
574
12.7k
}
575
576
inline void returndataload(StackTop stack, ExecutionState& state) noexcept
577
0
{
578
0
    auto& index = stack.top();
579
580
0
    if (state.return_data.size() < index)
581
0
        index = 0;
582
0
    else
583
0
    {
584
0
        const auto begin = static_cast<size_t>(index);
585
0
        const auto end = std::min(begin + 32, state.return_data.size());
586
587
0
        uint8_t data[32] = {};
588
0
        for (size_t i = 0; i < (end - begin); ++i)
589
0
            data[i] = state.return_data[begin + i];
590
591
0
        index = intx::be::unsafe::load<uint256>(data);
592
0
    }
593
0
}
594
595
inline void returndatasize(StackTop stack, ExecutionState& state) noexcept
596
58.5k
{
597
58.5k
    stack.push(state.return_data.size());
598
58.5k
}
599
600
inline Result returndatacopy(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
601
8.89k
{
602
8.89k
    const auto& mem_index = stack.pop();
603
8.89k
    const auto& input_index = stack.pop();
604
8.89k
    const auto& size = stack.pop();
605
606
8.89k
    if (!check_memory(gas_left, state.memory, mem_index, size))
607
204
        return {EVMC_OUT_OF_GAS, gas_left};
608
609
8.68k
    auto dst = static_cast<size_t>(mem_index);
610
8.68k
    auto s = static_cast<size_t>(size);
611
612
8.68k
    if (is_eof_container(state.original_code))
613
0
    {
614
0
        auto src = state.return_data.size() < input_index ? state.return_data.size() :
615
0
                                                            static_cast<size_t>(input_index);
616
0
        auto copy_size = std::min(s, state.return_data.size() - src);
617
618
0
        if (const auto cost = copy_cost(s); (gas_left -= cost) < 0)
619
0
            return {EVMC_OUT_OF_GAS, gas_left};
620
621
0
        if (copy_size > 0)
622
0
            std::memcpy(&state.memory[dst], &state.return_data[src], copy_size);
623
624
0
        if (s - copy_size > 0)
625
0
            std::memset(&state.memory[dst + copy_size], 0, s - copy_size);
626
0
    }
627
8.68k
    else
628
8.68k
    {
629
8.68k
        if (state.return_data.size() < input_index)
630
252
            return {EVMC_INVALID_MEMORY_ACCESS, gas_left};
631
8.43k
        auto src = static_cast<size_t>(input_index);
632
633
8.43k
        if (src + s > state.return_data.size())
634
234
            return {EVMC_INVALID_MEMORY_ACCESS, gas_left};
635
636
8.20k
        if (const auto cost = copy_cost(s); (gas_left -= cost) < 0)
637
6
            return {EVMC_OUT_OF_GAS, gas_left};
638
639
8.19k
        if (s > 0)
640
6.71k
            std::memcpy(&state.memory[dst], &state.return_data[src], s);
641
8.19k
    }
642
643
8.19k
    return {EVMC_SUCCESS, gas_left};
644
8.68k
}
645
646
inline Result extcodehash(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
647
3.33k
{
648
3.33k
    auto& x = stack.top();
649
3.33k
    const auto addr = intx::be::trunc<evmc::address>(x);
650
651
3.33k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(addr) == EVMC_ACCESS_COLD3.25k
)
  MC/DC Decision Region (651:9) to (651:88)
+
+  Number of Conditions: 2
+     Condition C1 --> (651:9)
+     Condition C2 --> (651:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
652
801
    {
653
801
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
654
6
            return {EVMC_OUT_OF_GAS, gas_left};
655
801
    }
656
657
3.33k
    x = intx::be::load<uint256>(state.host.get_code_hash(addr));
658
3.33k
    return {EVMC_SUCCESS, gas_left};
659
3.33k
}
660
661
662
inline void blockhash(StackTop stack, ExecutionState& state) noexcept
663
69.7k
{
664
69.7k
    auto& number = stack.top();
665
666
69.7k
    const auto upper_bound = state.get_tx_context().block_number;
667
69.7k
    const auto lower_bound = std::max(upper_bound - 256, decltype(upper_bound){0});
668
69.7k
    const auto n = static_cast<int64_t>(number);
669
69.7k
    const auto header =
670
69.7k
        (number < upper_bound && 
n >= lower_bound69.7k
) ?
state.host.get_block_hash(n)69.6k
:
evmc::bytes32{}131
;
  MC/DC Decision Region (670:10) to (670:50)
+
+  Number of Conditions: 2
+     Condition C1 --> (670:10)
+     Condition C2 --> (670:34)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
671
69.7k
    number = intx::be::load<uint256>(header);
672
69.7k
}
673
674
inline void coinbase(StackTop stack, ExecutionState& state) noexcept
675
14.9k
{
676
14.9k
    stack.push(intx::be::load<uint256>(state.get_tx_context().block_coinbase));
677
14.9k
}
678
679
inline void timestamp(StackTop stack, ExecutionState& state) noexcept
680
147k
{
681
    // TODO: Add tests for negative timestamp?
682
147k
    stack.push(static_cast<uint64_t>(state.get_tx_context().block_timestamp));
683
147k
}
684
685
inline void number(StackTop stack, ExecutionState& state) noexcept
686
133k
{
687
    // TODO: Add tests for negative block number?
688
133k
    stack.push(static_cast<uint64_t>(state.get_tx_context().block_number));
689
133k
}
690
691
inline void prevrandao(StackTop stack, ExecutionState& state) noexcept
692
13.7k
{
693
13.7k
    stack.push(intx::be::load<uint256>(state.get_tx_context().block_prev_randao));
694
13.7k
}
695
696
inline void gaslimit(StackTop stack, ExecutionState& state) noexcept
697
15.2k
{
698
15.2k
    stack.push(static_cast<uint64_t>(state.get_tx_context().block_gas_limit));
699
15.2k
}
700
701
inline void chainid(StackTop stack, ExecutionState& state) noexcept
702
414
{
703
414
    stack.push(intx::be::load<uint256>(state.get_tx_context().chain_id));
704
414
}
705
706
inline void selfbalance(StackTop stack, ExecutionState& state) noexcept
707
1.52k
{
708
    // TODO: introduce selfbalance in EVMC?
709
1.52k
    stack.push(intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)));
710
1.52k
}
711
712
inline Result mload(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
713
11.9M
{
714
11.9M
    auto& index = stack.top();
715
716
11.9M
    if (!check_memory(gas_left, state.memory, index, 32))
717
666
        return {EVMC_OUT_OF_GAS, gas_left};
718
719
11.9M
    index = intx::be::unsafe::load<uint256>(&state.memory[static_cast<size_t>(index)]);
720
11.9M
    return {EVMC_SUCCESS, gas_left};
721
11.9M
}
722
723
inline Result mstore(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
724
8.58M
{
725
8.58M
    const auto& index = stack.pop();
726
8.58M
    const auto& value = stack.pop();
727
728
8.58M
    if (!check_memory(gas_left, state.memory, index, 32))
729
698
        return {EVMC_OUT_OF_GAS, gas_left};
730
731
8.58M
    intx::be::unsafe::store(&state.memory[static_cast<size_t>(index)], value);
732
8.58M
    return {EVMC_SUCCESS, gas_left};
733
8.58M
}
734
735
inline Result mstore8(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
736
155k
{
737
155k
    const auto& index = stack.pop();
738
155k
    const auto& value = stack.pop();
739
740
155k
    if (!check_memory(gas_left, state.memory, index, 1))
741
612
        return {EVMC_OUT_OF_GAS, gas_left};
742
743
154k
    state.memory[static_cast<size_t>(index)] = static_cast<uint8_t>(value);
744
154k
    return {EVMC_SUCCESS, gas_left};
745
155k
}
746
747
Result sload(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
748
749
Result sstore(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
750
751
/// Internal jump implementation for JUMP/JUMPI instructions.
752
inline code_iterator jump_impl(ExecutionState& state, const uint256& dst) noexcept
753
6.96M
{
754
6.96M
    const auto hi_part_is_nonzero = (dst[3] | dst[2] | dst[1]) != 0;
755
6.96M
    if (hi_part_is_nonzero || 
!state.analysis.baseline->check_jumpdest(dst[0])6.96M
) [[unlikely]]
  MC/DC Decision Region (755:9) to (755:79)
+
+  Number of Conditions: 2
+     Condition C1 --> (755:9)
+     Condition C2 --> (755:31)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
756
3.11k
    {
757
3.11k
        state.status = EVMC_BAD_JUMP_DESTINATION;
758
3.11k
        return nullptr;
759
3.11k
    }
760
761
6.95M
    return &state.analysis.baseline->executable_code()[static_cast<size_t>(dst[0])];
762
6.96M
}
763
764
/// JUMP instruction implementation using baseline::CodeAnalysis.
765
inline code_iterator jump(StackTop stack, ExecutionState& state, code_iterator /*pos*/) noexcept
766
5.33M
{
767
5.33M
    return jump_impl(state, stack.pop());
768
5.33M
}
769
770
/// JUMPI instruction implementation using baseline::CodeAnalysis.
771
inline code_iterator jumpi(StackTop stack, ExecutionState& state, code_iterator pos) noexcept
772
6.93M
{
773
6.93M
    const auto& dst = stack.pop();
774
6.93M
    const auto& cond = stack.pop();
775
6.93M
    return cond ? 
jump_impl(state, dst)1.62M
:
pos + 15.30M
;
776
6.93M
}
777
778
inline code_iterator rjump(StackTop /*stack*/, ExecutionState& /*state*/, code_iterator pc) noexcept
779
0
{
780
    // Reading next 2 bytes is guaranteed to be safe by deploy-time validation.
781
0
    const auto offset = read_int16_be(&pc[1]);
782
0
    return pc + 3 + offset;  // PC_post_rjump + offset
783
0
}
784
785
inline code_iterator rjumpi(StackTop stack, ExecutionState& state, code_iterator pc) noexcept
786
0
{
787
0
    const auto cond = stack.pop();
788
0
    return cond ? rjump(stack, state, pc) : pc + 3;
789
0
}
790
791
inline code_iterator rjumpv(StackTop stack, ExecutionState& /*state*/, code_iterator pc) noexcept
792
0
{
793
0
    constexpr auto REL_OFFSET_SIZE = sizeof(int16_t);
794
0
    const auto case_ = stack.pop();
795
796
0
    const auto max_index = pc[1];
797
0
    const auto pc_post = pc + 1 + 1 /* max_index */ + (max_index + 1) * REL_OFFSET_SIZE /* tbl */;
798
799
0
    if (case_ > max_index)
800
0
    {
801
0
        return pc_post;
802
0
    }
803
0
    else
804
0
    {
805
0
        const auto rel_offset =
806
0
            read_int16_be(&pc[2 + static_cast<uint16_t>(case_) * REL_OFFSET_SIZE]);
807
808
0
        return pc_post + rel_offset;
809
0
    }
810
0
}
811
812
inline code_iterator pc(StackTop stack, ExecutionState& state, code_iterator pos) noexcept
813
5.49M
{
814
5.49M
    stack.push(static_cast<uint64_t>(pos - state.analysis.baseline->executable_code().data()));
815
5.49M
    return pos + 1;
816
5.49M
}
817
818
inline void msize(StackTop stack, ExecutionState& state) noexcept
819
16.5k
{
820
16.5k
    stack.push(state.memory.size());
821
16.5k
}
822
823
inline Result gas(StackTop stack, int64_t gas_left, ExecutionState& /*state*/) noexcept
824
16.5M
{
825
16.5M
    stack.push(gas_left);
826
16.5M
    return {EVMC_SUCCESS, gas_left};
827
16.5M
}
828
829
inline void tload(StackTop stack, ExecutionState& state) noexcept
830
1.89M
{
831
1.89M
    auto& x = stack.top();
832
1.89M
    const auto key = intx::be::store<evmc::bytes32>(x);
833
1.89M
    const auto value = state.host.get_transient_storage(state.msg->recipient, key);
834
1.89M
    x = intx::be::load<uint256>(value);
835
1.89M
}
836
837
inline Result tstore(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
838
9.07M
{
839
9.07M
    if (state.in_static_mode())
840
84
        return {EVMC_STATIC_MODE_VIOLATION, 0};
841
842
9.07M
    const auto key = intx::be::store<evmc::bytes32>(stack.pop());
843
9.07M
    const auto value = intx::be::store<evmc::bytes32>(stack.pop());
844
9.07M
    state.host.set_transient_storage(state.msg->recipient, key, value);
845
9.07M
    return {EVMC_SUCCESS, gas_left};
846
9.07M
}
847
848
inline void push0(StackTop stack) noexcept
849
1.15M
{
850
1.15M
    stack.push({});
851
1.15M
}
852
853
854
template <size_t Len>
855
inline uint64_t load_partial_push_data(code_iterator pos) noexcept
856
590k
{
857
590k
    static_assert(Len > 4 && Len < 8);
858
859
    // It loads up to 3 additional bytes.
860
590k
    return intx::be::unsafe::load<uint64_t>(pos) >> (8 * (sizeof(uint64_t) - Len));
861
590k
}
unsigned long evmone::instr::core::load_partial_push_data<5ul>(unsigned char const*)
Line
Count
Source
856
176k
{
857
176k
    static_assert(Len > 4 && Len < 8);
858
859
    // It loads up to 3 additional bytes.
860
176k
    return intx::be::unsafe::load<uint64_t>(pos) >> (8 * (sizeof(uint64_t) - Len));
861
176k
}
unsigned long evmone::instr::core::load_partial_push_data<6ul>(unsigned char const*)
Line
Count
Source
856
207k
{
857
207k
    static_assert(Len > 4 && Len < 8);
858
859
    // It loads up to 3 additional bytes.
860
207k
    return intx::be::unsafe::load<uint64_t>(pos) >> (8 * (sizeof(uint64_t) - Len));
861
207k
}
unsigned long evmone::instr::core::load_partial_push_data<7ul>(unsigned char const*)
Line
Count
Source
856
206k
{
857
206k
    static_assert(Len > 4 && Len < 8);
858
859
    // It loads up to 3 additional bytes.
860
206k
    return intx::be::unsafe::load<uint64_t>(pos) >> (8 * (sizeof(uint64_t) - Len));
861
206k
}
862
863
template <>
864
inline uint64_t load_partial_push_data<1>(code_iterator pos) noexcept
865
76.2M
{
866
76.2M
    return pos[0];
867
76.2M
}
868
869
template <>
870
inline uint64_t load_partial_push_data<2>(code_iterator pos) noexcept
871
10.1M
{
872
10.1M
    return intx::be::unsafe::load<uint16_t>(pos);
873
10.1M
}
874
875
template <>
876
inline uint64_t load_partial_push_data<3>(code_iterator pos) noexcept
877
1.42M
{
878
    // It loads 1 additional byte.
879
1.42M
    return intx::be::unsafe::load<uint32_t>(pos) >> 8;
880
1.42M
}
881
882
template <>
883
inline uint64_t load_partial_push_data<4>(code_iterator pos) noexcept
884
2.42M
{
885
2.42M
    return intx::be::unsafe::load<uint32_t>(pos);
886
2.42M
}
887
888
/// PUSH instruction implementation.
889
/// @tparam Len The number of push data bytes, e.g. PUSH3 is push<3>.
890
///
891
/// It assumes that at least 32 bytes of data are available, so code padding is required.
892
template <size_t Len>
893
inline code_iterator push(StackTop stack, ExecutionState& /*state*/, code_iterator pos) noexcept
894
91.3M
{
895
91.3M
    using word_type = uint256::word_type;
896
91.3M
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
91.3M
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
91.3M
    stack.push({});
900
91.3M
    auto& r = stack.top();
901
91.3M
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
90.9M
    {
906
90.9M
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
90.9M
        pos += NUM_PARTIAL_BYTES;
908
90.9M
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
3.44M
    {
913
10.9M
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i7.52M
)
914
7.52M
        {
915
7.52M
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
7.52M
            pos += sizeof(word_type);
917
7.52M
        }
918
3.44M
    }
919
920
91.3M
    return pos;
921
91.3M
}
unsigned char const* evmone::instr::core::push<1ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
76.2M
{
895
76.2M
    using word_type = uint256::word_type;
896
76.2M
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
76.2M
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
76.2M
    stack.push({});
900
76.2M
    auto& r = stack.top();
901
76.2M
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
76.2M
    {
906
76.2M
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
76.2M
        pos += NUM_PARTIAL_BYTES;
908
76.2M
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
    {
913
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
914
        {
915
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
            pos += sizeof(word_type);
917
        }
918
    }
919
920
76.2M
    return pos;
921
76.2M
}
unsigned char const* evmone::instr::core::push<2ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
10.0M
{
895
10.0M
    using word_type = uint256::word_type;
896
10.0M
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
10.0M
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
10.0M
    stack.push({});
900
10.0M
    auto& r = stack.top();
901
10.0M
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
10.0M
    {
906
10.0M
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
10.0M
        pos += NUM_PARTIAL_BYTES;
908
10.0M
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
    {
913
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
914
        {
915
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
            pos += sizeof(word_type);
917
        }
918
    }
919
920
10.0M
    return pos;
921
10.0M
}
unsigned char const* evmone::instr::core::push<3ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
1.32M
{
895
1.32M
    using word_type = uint256::word_type;
896
1.32M
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
1.32M
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
1.32M
    stack.push({});
900
1.32M
    auto& r = stack.top();
901
1.32M
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
1.32M
    {
906
1.32M
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
1.32M
        pos += NUM_PARTIAL_BYTES;
908
1.32M
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
    {
913
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
914
        {
915
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
            pos += sizeof(word_type);
917
        }
918
    }
919
920
1.32M
    return pos;
921
1.32M
}
unsigned char const* evmone::instr::core::push<4ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
119k
{
895
119k
    using word_type = uint256::word_type;
896
119k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
119k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
119k
    stack.push({});
900
119k
    auto& r = stack.top();
901
119k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
119k
    {
906
119k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
119k
        pos += NUM_PARTIAL_BYTES;
908
119k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
    {
913
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
914
        {
915
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
            pos += sizeof(word_type);
917
        }
918
    }
919
920
119k
    return pos;
921
119k
}
unsigned char const* evmone::instr::core::push<5ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
58.1k
{
895
58.1k
    using word_type = uint256::word_type;
896
58.1k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
58.1k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
58.1k
    stack.push({});
900
58.1k
    auto& r = stack.top();
901
58.1k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
58.1k
    {
906
58.1k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
58.1k
        pos += NUM_PARTIAL_BYTES;
908
58.1k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
    {
913
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
914
        {
915
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
            pos += sizeof(word_type);
917
        }
918
    }
919
920
58.1k
    return pos;
921
58.1k
}
unsigned char const* evmone::instr::core::push<6ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
111k
{
895
111k
    using word_type = uint256::word_type;
896
111k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
111k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
111k
    stack.push({});
900
111k
    auto& r = stack.top();
901
111k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
111k
    {
906
111k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
111k
        pos += NUM_PARTIAL_BYTES;
908
111k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
    {
913
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
914
        {
915
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
            pos += sizeof(word_type);
917
        }
918
    }
919
920
111k
    return pos;
921
111k
}
unsigned char const* evmone::instr::core::push<7ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
46.6k
{
895
46.6k
    using word_type = uint256::word_type;
896
46.6k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
46.6k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
46.6k
    stack.push({});
900
46.6k
    auto& r = stack.top();
901
46.6k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
46.6k
    {
906
46.6k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
46.6k
        pos += NUM_PARTIAL_BYTES;
908
46.6k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
    {
913
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
914
        {
915
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
            pos += sizeof(word_type);
917
        }
918
    }
919
920
46.6k
    return pos;
921
46.6k
}
unsigned char const* evmone::instr::core::push<8ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
47.3k
{
895
47.3k
    using word_type = uint256::word_type;
896
47.3k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
47.3k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
47.3k
    stack.push({});
900
47.3k
    auto& r = stack.top();
901
47.3k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
    {
906
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
        pos += NUM_PARTIAL_BYTES;
908
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
47.3k
    {
913
94.6k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i47.3k
)
914
47.3k
        {
915
47.3k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
47.3k
            pos += sizeof(word_type);
917
47.3k
        }
918
47.3k
    }
919
920
47.3k
    return pos;
921
47.3k
}
unsigned char const* evmone::instr::core::push<9ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
40.3k
{
895
40.3k
    using word_type = uint256::word_type;
896
40.3k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
40.3k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
40.3k
    stack.push({});
900
40.3k
    auto& r = stack.top();
901
40.3k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
40.3k
    {
906
40.3k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
40.3k
        pos += NUM_PARTIAL_BYTES;
908
40.3k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
40.3k
    {
913
80.7k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i40.3k
)
914
40.3k
        {
915
40.3k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
40.3k
            pos += sizeof(word_type);
917
40.3k
        }
918
40.3k
    }
919
920
40.3k
    return pos;
921
40.3k
}
unsigned char const* evmone::instr::core::push<10ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
34.6k
{
895
34.6k
    using word_type = uint256::word_type;
896
34.6k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
34.6k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
34.6k
    stack.push({});
900
34.6k
    auto& r = stack.top();
901
34.6k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
34.6k
    {
906
34.6k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
34.6k
        pos += NUM_PARTIAL_BYTES;
908
34.6k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
34.6k
    {
913
69.3k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i34.6k
)
914
34.6k
        {
915
34.6k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
34.6k
            pos += sizeof(word_type);
917
34.6k
        }
918
34.6k
    }
919
920
34.6k
    return pos;
921
34.6k
}
unsigned char const* evmone::instr::core::push<11ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
28.8k
{
895
28.8k
    using word_type = uint256::word_type;
896
28.8k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
28.8k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
28.8k
    stack.push({});
900
28.8k
    auto& r = stack.top();
901
28.8k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
28.8k
    {
906
28.8k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
28.8k
        pos += NUM_PARTIAL_BYTES;
908
28.8k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
28.8k
    {
913
57.6k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i28.8k
)
914
28.8k
        {
915
28.8k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
28.8k
            pos += sizeof(word_type);
917
28.8k
        }
918
28.8k
    }
919
920
28.8k
    return pos;
921
28.8k
}
unsigned char const* evmone::instr::core::push<12ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
40.4k
{
895
40.4k
    using word_type = uint256::word_type;
896
40.4k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
40.4k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
40.4k
    stack.push({});
900
40.4k
    auto& r = stack.top();
901
40.4k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
40.4k
    {
906
40.4k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
40.4k
        pos += NUM_PARTIAL_BYTES;
908
40.4k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
40.4k
    {
913
80.9k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i40.4k
)
914
40.4k
        {
915
40.4k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
40.4k
            pos += sizeof(word_type);
917
40.4k
        }
918
40.4k
    }
919
920
40.4k
    return pos;
921
40.4k
}
unsigned char const* evmone::instr::core::push<13ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
38.7k
{
895
38.7k
    using word_type = uint256::word_type;
896
38.7k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
38.7k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
38.7k
    stack.push({});
900
38.7k
    auto& r = stack.top();
901
38.7k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
38.7k
    {
906
38.7k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
38.7k
        pos += NUM_PARTIAL_BYTES;
908
38.7k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
38.7k
    {
913
77.5k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i38.7k
)
914
38.7k
        {
915
38.7k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
38.7k
            pos += sizeof(word_type);
917
38.7k
        }
918
38.7k
    }
919
920
38.7k
    return pos;
921
38.7k
}
unsigned char const* evmone::instr::core::push<14ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
34.0k
{
895
34.0k
    using word_type = uint256::word_type;
896
34.0k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
34.0k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
34.0k
    stack.push({});
900
34.0k
    auto& r = stack.top();
901
34.0k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
34.0k
    {
906
34.0k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
34.0k
        pos += NUM_PARTIAL_BYTES;
908
34.0k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
34.0k
    {
913
68.1k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i34.0k
)
914
34.0k
        {
915
34.0k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
34.0k
            pos += sizeof(word_type);
917
34.0k
        }
918
34.0k
    }
919
920
34.0k
    return pos;
921
34.0k
}
unsigned char const* evmone::instr::core::push<15ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
29.0k
{
895
29.0k
    using word_type = uint256::word_type;
896
29.0k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
29.0k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
29.0k
    stack.push({});
900
29.0k
    auto& r = stack.top();
901
29.0k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
29.0k
    {
906
29.0k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
29.0k
        pos += NUM_PARTIAL_BYTES;
908
29.0k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
29.0k
    {
913
58.0k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i29.0k
)
914
29.0k
        {
915
29.0k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
29.0k
            pos += sizeof(word_type);
917
29.0k
        }
918
29.0k
    }
919
920
29.0k
    return pos;
921
29.0k
}
unsigned char const* evmone::instr::core::push<16ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
48.4k
{
895
48.4k
    using word_type = uint256::word_type;
896
48.4k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
48.4k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
48.4k
    stack.push({});
900
48.4k
    auto& r = stack.top();
901
48.4k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
    {
906
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
        pos += NUM_PARTIAL_BYTES;
908
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
48.4k
    {
913
145k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i96.9k
)
914
96.9k
        {
915
96.9k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
96.9k
            pos += sizeof(word_type);
917
96.9k
        }
918
48.4k
    }
919
920
48.4k
    return pos;
921
48.4k
}
unsigned char const* evmone::instr::core::push<17ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
21.2k
{
895
21.2k
    using word_type = uint256::word_type;
896
21.2k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
21.2k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
21.2k
    stack.push({});
900
21.2k
    auto& r = stack.top();
901
21.2k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
21.2k
    {
906
21.2k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
21.2k
        pos += NUM_PARTIAL_BYTES;
908
21.2k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
21.2k
    {
913
63.6k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i42.4k
)
914
42.4k
        {
915
42.4k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
42.4k
            pos += sizeof(word_type);
917
42.4k
        }
918
21.2k
    }
919
920
21.2k
    return pos;
921
21.2k
}
unsigned char const* evmone::instr::core::push<18ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
66.2k
{
895
66.2k
    using word_type = uint256::word_type;
896
66.2k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
66.2k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
66.2k
    stack.push({});
900
66.2k
    auto& r = stack.top();
901
66.2k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
66.2k
    {
906
66.2k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
66.2k
        pos += NUM_PARTIAL_BYTES;
908
66.2k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
66.2k
    {
913
198k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i132k
)
914
132k
        {
915
132k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
132k
            pos += sizeof(word_type);
917
132k
        }
918
66.2k
    }
919
920
66.2k
    return pos;
921
66.2k
}
unsigned char const* evmone::instr::core::push<19ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
30.7k
{
895
30.7k
    using word_type = uint256::word_type;
896
30.7k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
30.7k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
30.7k
    stack.push({});
900
30.7k
    auto& r = stack.top();
901
30.7k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
30.7k
    {
906
30.7k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
30.7k
        pos += NUM_PARTIAL_BYTES;
908
30.7k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
30.7k
    {
913
92.1k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i61.4k
)
914
61.4k
        {
915
61.4k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
61.4k
            pos += sizeof(word_type);
917
61.4k
        }
918
30.7k
    }
919
920
30.7k
    return pos;
921
30.7k
}
unsigned char const* evmone::instr::core::push<20ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
2.23M
{
895
2.23M
    using word_type = uint256::word_type;
896
2.23M
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
2.23M
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
2.23M
    stack.push({});
900
2.23M
    auto& r = stack.top();
901
2.23M
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
2.23M
    {
906
2.23M
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
2.23M
        pos += NUM_PARTIAL_BYTES;
908
2.23M
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
2.23M
    {
913
6.71M
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i4.47M
)
914
4.47M
        {
915
4.47M
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
4.47M
            pos += sizeof(word_type);
917
4.47M
        }
918
2.23M
    }
919
920
2.23M
    return pos;
921
2.23M
}
unsigned char const* evmone::instr::core::push<21ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
44.9k
{
895
44.9k
    using word_type = uint256::word_type;
896
44.9k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
44.9k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
44.9k
    stack.push({});
900
44.9k
    auto& r = stack.top();
901
44.9k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
44.9k
    {
906
44.9k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
44.9k
        pos += NUM_PARTIAL_BYTES;
908
44.9k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
44.9k
    {
913
134k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i89.9k
)
914
89.9k
        {
915
89.9k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
89.9k
            pos += sizeof(word_type);
917
89.9k
        }
918
44.9k
    }
919
920
44.9k
    return pos;
921
44.9k
}
unsigned char const* evmone::instr::core::push<22ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
37.3k
{
895
37.3k
    using word_type = uint256::word_type;
896
37.3k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
37.3k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
37.3k
    stack.push({});
900
37.3k
    auto& r = stack.top();
901
37.3k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
37.3k
    {
906
37.3k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
37.3k
        pos += NUM_PARTIAL_BYTES;
908
37.3k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
37.3k
    {
913
112k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i74.6k
)
914
74.6k
        {
915
74.6k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
74.6k
            pos += sizeof(word_type);
917
74.6k
        }
918
37.3k
    }
919
920
37.3k
    return pos;
921
37.3k
}
unsigned char const* evmone::instr::core::push<23ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
37.9k
{
895
37.9k
    using word_type = uint256::word_type;
896
37.9k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
37.9k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
37.9k
    stack.push({});
900
37.9k
    auto& r = stack.top();
901
37.9k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
37.9k
    {
906
37.9k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
37.9k
        pos += NUM_PARTIAL_BYTES;
908
37.9k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
37.9k
    {
913
113k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i75.8k
)
914
75.8k
        {
915
75.8k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
75.8k
            pos += sizeof(word_type);
917
75.8k
        }
918
37.9k
    }
919
920
37.9k
    return pos;
921
37.9k
}
unsigned char const* evmone::instr::core::push<24ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
31.8k
{
895
31.8k
    using word_type = uint256::word_type;
896
31.8k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
31.8k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
31.8k
    stack.push({});
900
31.8k
    auto& r = stack.top();
901
31.8k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
    {
906
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
        pos += NUM_PARTIAL_BYTES;
908
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
31.8k
    {
913
127k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i95.4k
)
914
95.4k
        {
915
95.4k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
95.4k
            pos += sizeof(word_type);
917
95.4k
        }
918
31.8k
    }
919
920
31.8k
    return pos;
921
31.8k
}
unsigned char const* evmone::instr::core::push<25ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
30.1k
{
895
30.1k
    using word_type = uint256::word_type;
896
30.1k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
30.1k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
30.1k
    stack.push({});
900
30.1k
    auto& r = stack.top();
901
30.1k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
30.1k
    {
906
30.1k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
30.1k
        pos += NUM_PARTIAL_BYTES;
908
30.1k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
30.1k
    {
913
120k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i90.3k
)
914
90.3k
        {
915
90.3k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
90.3k
            pos += sizeof(word_type);
917
90.3k
        }
918
30.1k
    }
919
920
30.1k
    return pos;
921
30.1k
}
unsigned char const* evmone::instr::core::push<26ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
41.0k
{
895
41.0k
    using word_type = uint256::word_type;
896
41.0k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
41.0k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
41.0k
    stack.push({});
900
41.0k
    auto& r = stack.top();
901
41.0k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
41.0k
    {
906
41.0k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
41.0k
        pos += NUM_PARTIAL_BYTES;
908
41.0k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
41.0k
    {
913
164k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i123k
)
914
123k
        {
915
123k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
123k
            pos += sizeof(word_type);
917
123k
        }
918
41.0k
    }
919
920
41.0k
    return pos;
921
41.0k
}
unsigned char const* evmone::instr::core::push<27ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
42.0k
{
895
42.0k
    using word_type = uint256::word_type;
896
42.0k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
42.0k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
42.0k
    stack.push({});
900
42.0k
    auto& r = stack.top();
901
42.0k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
42.0k
    {
906
42.0k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
42.0k
        pos += NUM_PARTIAL_BYTES;
908
42.0k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
42.0k
    {
913
168k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i126k
)
914
126k
        {
915
126k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
126k
            pos += sizeof(word_type);
917
126k
        }
918
42.0k
    }
919
920
42.0k
    return pos;
921
42.0k
}
unsigned char const* evmone::instr::core::push<28ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
28.7k
{
895
28.7k
    using word_type = uint256::word_type;
896
28.7k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
28.7k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
28.7k
    stack.push({});
900
28.7k
    auto& r = stack.top();
901
28.7k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
28.7k
    {
906
28.7k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
28.7k
        pos += NUM_PARTIAL_BYTES;
908
28.7k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
28.7k
    {
913
114k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i86.1k
)
914
86.1k
        {
915
86.1k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
86.1k
            pos += sizeof(word_type);
917
86.1k
        }
918
28.7k
    }
919
920
28.7k
    return pos;
921
28.7k
}
unsigned char const* evmone::instr::core::push<29ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
34.3k
{
895
34.3k
    using word_type = uint256::word_type;
896
34.3k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
34.3k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
34.3k
    stack.push({});
900
34.3k
    auto& r = stack.top();
901
34.3k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
34.3k
    {
906
34.3k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
34.3k
        pos += NUM_PARTIAL_BYTES;
908
34.3k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
34.3k
    {
913
137k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i103k
)
914
103k
        {
915
103k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
103k
            pos += sizeof(word_type);
917
103k
        }
918
34.3k
    }
919
920
34.3k
    return pos;
921
34.3k
}
unsigned char const* evmone::instr::core::push<30ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
24.9k
{
895
24.9k
    using word_type = uint256::word_type;
896
24.9k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
24.9k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
24.9k
    stack.push({});
900
24.9k
    auto& r = stack.top();
901
24.9k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
24.9k
    {
906
24.9k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
24.9k
        pos += NUM_PARTIAL_BYTES;
908
24.9k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
24.9k
    {
913
99.7k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i74.8k
)
914
74.8k
        {
915
74.8k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
74.8k
            pos += sizeof(word_type);
917
74.8k
        }
918
24.9k
    }
919
920
24.9k
    return pos;
921
24.9k
}
unsigned char const* evmone::instr::core::push<31ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
93.2k
{
895
93.2k
    using word_type = uint256::word_type;
896
93.2k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
93.2k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
93.2k
    stack.push({});
900
93.2k
    auto& r = stack.top();
901
93.2k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
93.2k
    {
906
93.2k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
93.2k
        pos += NUM_PARTIAL_BYTES;
908
93.2k
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
93.2k
    {
913
373k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i279k
)
914
279k
        {
915
279k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
279k
            pos += sizeof(word_type);
917
279k
        }
918
93.2k
    }
919
920
93.2k
    return pos;
921
93.2k
}
unsigned char const* evmone::instr::core::push<32ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
894
301k
{
895
301k
    using word_type = uint256::word_type;
896
301k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
897
301k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
898
899
301k
    stack.push({});
900
301k
    auto& r = stack.top();
901
301k
    pos += 1;  // Skip the opcode.
902
903
    // Load the top partial word.
904
    if constexpr (NUM_PARTIAL_BYTES != 0)
905
    {
906
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
907
        pos += NUM_PARTIAL_BYTES;
908
    }
909
910
    // Load full words.
911
    if constexpr (NUM_FULL_WORDS != 0)
912
301k
    {
913
1.50M
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i1.20M
)
914
1.20M
        {
915
1.20M
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
916
1.20M
            pos += sizeof(word_type);
917
1.20M
        }
918
301k
    }
919
920
301k
    return pos;
921
301k
}
922
923
/// DUP instruction implementation.
924
/// @tparam N  The number as in the instruction definition, e.g. DUP3 is dup<3>.
925
template <int N>
926
inline void dup(StackTop stack) noexcept
927
8.93M
{
928
8.93M
    static_assert(N >= 1 && N <= 16);
929
8.93M
    stack.push(stack[N - 1]);
930
8.93M
}
void evmone::instr::core::dup<1>(evmone::StackTop)
Line
Count
Source
927
5.87M
{
928
5.87M
    static_assert(N >= 1 && N <= 16);
929
5.87M
    stack.push(stack[N - 1]);
930
5.87M
}
void evmone::instr::core::dup<2>(evmone::StackTop)
Line
Count
Source
927
1.25M
{
928
1.25M
    static_assert(N >= 1 && N <= 16);
929
1.25M
    stack.push(stack[N - 1]);
930
1.25M
}
void evmone::instr::core::dup<3>(evmone::StackTop)
Line
Count
Source
927
617k
{
928
617k
    static_assert(N >= 1 && N <= 16);
929
617k
    stack.push(stack[N - 1]);
930
617k
}
void evmone::instr::core::dup<4>(evmone::StackTop)
Line
Count
Source
927
291k
{
928
291k
    static_assert(N >= 1 && N <= 16);
929
291k
    stack.push(stack[N - 1]);
930
291k
}
void evmone::instr::core::dup<5>(evmone::StackTop)
Line
Count
Source
927
126k
{
928
126k
    static_assert(N >= 1 && N <= 16);
929
126k
    stack.push(stack[N - 1]);
930
126k
}
void evmone::instr::core::dup<6>(evmone::StackTop)
Line
Count
Source
927
64.8k
{
928
64.8k
    static_assert(N >= 1 && N <= 16);
929
64.8k
    stack.push(stack[N - 1]);
930
64.8k
}
void evmone::instr::core::dup<7>(evmone::StackTop)
Line
Count
Source
927
47.8k
{
928
47.8k
    static_assert(N >= 1 && N <= 16);
929
47.8k
    stack.push(stack[N - 1]);
930
47.8k
}
void evmone::instr::core::dup<8>(evmone::StackTop)
Line
Count
Source
927
443k
{
928
443k
    static_assert(N >= 1 && N <= 16);
929
443k
    stack.push(stack[N - 1]);
930
443k
}
void evmone::instr::core::dup<9>(evmone::StackTop)
Line
Count
Source
927
26.9k
{
928
26.9k
    static_assert(N >= 1 && N <= 16);
929
26.9k
    stack.push(stack[N - 1]);
930
26.9k
}
void evmone::instr::core::dup<10>(evmone::StackTop)
Line
Count
Source
927
53.2k
{
928
53.2k
    static_assert(N >= 1 && N <= 16);
929
53.2k
    stack.push(stack[N - 1]);
930
53.2k
}
void evmone::instr::core::dup<11>(evmone::StackTop)
Line
Count
Source
927
24.9k
{
928
24.9k
    static_assert(N >= 1 && N <= 16);
929
24.9k
    stack.push(stack[N - 1]);
930
24.9k
}
void evmone::instr::core::dup<12>(evmone::StackTop)
Line
Count
Source
927
16.5k
{
928
16.5k
    static_assert(N >= 1 && N <= 16);
929
16.5k
    stack.push(stack[N - 1]);
930
16.5k
}
void evmone::instr::core::dup<13>(evmone::StackTop)
Line
Count
Source
927
30.5k
{
928
30.5k
    static_assert(N >= 1 && N <= 16);
929
30.5k
    stack.push(stack[N - 1]);
930
30.5k
}
void evmone::instr::core::dup<14>(evmone::StackTop)
Line
Count
Source
927
15.0k
{
928
15.0k
    static_assert(N >= 1 && N <= 16);
929
15.0k
    stack.push(stack[N - 1]);
930
15.0k
}
void evmone::instr::core::dup<15>(evmone::StackTop)
Line
Count
Source
927
25.1k
{
928
25.1k
    static_assert(N >= 1 && N <= 16);
929
25.1k
    stack.push(stack[N - 1]);
930
25.1k
}
void evmone::instr::core::dup<16>(evmone::StackTop)
Line
Count
Source
927
17.3k
{
928
17.3k
    static_assert(N >= 1 && N <= 16);
929
17.3k
    stack.push(stack[N - 1]);
930
17.3k
}
931
932
/// SWAP instruction implementation.
933
/// @tparam N  The number as in the instruction definition, e.g. SWAP3 is swap<3>.
934
template <int N>
935
inline void swap(StackTop stack) noexcept
936
1.57M
{
937
1.57M
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
1.57M
    auto& a = stack[N];
944
1.57M
    auto& t = stack.top();
945
1.57M
    auto t0 = t[0];
946
1.57M
    auto t1 = t[1];
947
1.57M
    auto t2 = t[2];
948
1.57M
    auto t3 = t[3];
949
1.57M
    t = a;
950
1.57M
    a[0] = t0;
951
1.57M
    a[1] = t1;
952
1.57M
    a[2] = t2;
953
1.57M
    a[3] = t3;
954
1.57M
}
void evmone::instr::core::swap<1>(evmone::StackTop)
Line
Count
Source
936
722k
{
937
722k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
722k
    auto& a = stack[N];
944
722k
    auto& t = stack.top();
945
722k
    auto t0 = t[0];
946
722k
    auto t1 = t[1];
947
722k
    auto t2 = t[2];
948
722k
    auto t3 = t[3];
949
722k
    t = a;
950
722k
    a[0] = t0;
951
722k
    a[1] = t1;
952
722k
    a[2] = t2;
953
722k
    a[3] = t3;
954
722k
}
void evmone::instr::core::swap<2>(evmone::StackTop)
Line
Count
Source
936
402k
{
937
402k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
402k
    auto& a = stack[N];
944
402k
    auto& t = stack.top();
945
402k
    auto t0 = t[0];
946
402k
    auto t1 = t[1];
947
402k
    auto t2 = t[2];
948
402k
    auto t3 = t[3];
949
402k
    t = a;
950
402k
    a[0] = t0;
951
402k
    a[1] = t1;
952
402k
    a[2] = t2;
953
402k
    a[3] = t3;
954
402k
}
void evmone::instr::core::swap<3>(evmone::StackTop)
Line
Count
Source
936
271k
{
937
271k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
271k
    auto& a = stack[N];
944
271k
    auto& t = stack.top();
945
271k
    auto t0 = t[0];
946
271k
    auto t1 = t[1];
947
271k
    auto t2 = t[2];
948
271k
    auto t3 = t[3];
949
271k
    t = a;
950
271k
    a[0] = t0;
951
271k
    a[1] = t1;
952
271k
    a[2] = t2;
953
271k
    a[3] = t3;
954
271k
}
void evmone::instr::core::swap<4>(evmone::StackTop)
Line
Count
Source
936
87.2k
{
937
87.2k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
87.2k
    auto& a = stack[N];
944
87.2k
    auto& t = stack.top();
945
87.2k
    auto t0 = t[0];
946
87.2k
    auto t1 = t[1];
947
87.2k
    auto t2 = t[2];
948
87.2k
    auto t3 = t[3];
949
87.2k
    t = a;
950
87.2k
    a[0] = t0;
951
87.2k
    a[1] = t1;
952
87.2k
    a[2] = t2;
953
87.2k
    a[3] = t3;
954
87.2k
}
void evmone::instr::core::swap<5>(evmone::StackTop)
Line
Count
Source
936
36.9k
{
937
36.9k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
36.9k
    auto& a = stack[N];
944
36.9k
    auto& t = stack.top();
945
36.9k
    auto t0 = t[0];
946
36.9k
    auto t1 = t[1];
947
36.9k
    auto t2 = t[2];
948
36.9k
    auto t3 = t[3];
949
36.9k
    t = a;
950
36.9k
    a[0] = t0;
951
36.9k
    a[1] = t1;
952
36.9k
    a[2] = t2;
953
36.9k
    a[3] = t3;
954
36.9k
}
void evmone::instr::core::swap<6>(evmone::StackTop)
Line
Count
Source
936
8.20k
{
937
8.20k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
8.20k
    auto& a = stack[N];
944
8.20k
    auto& t = stack.top();
945
8.20k
    auto t0 = t[0];
946
8.20k
    auto t1 = t[1];
947
8.20k
    auto t2 = t[2];
948
8.20k
    auto t3 = t[3];
949
8.20k
    t = a;
950
8.20k
    a[0] = t0;
951
8.20k
    a[1] = t1;
952
8.20k
    a[2] = t2;
953
8.20k
    a[3] = t3;
954
8.20k
}
void evmone::instr::core::swap<7>(evmone::StackTop)
Line
Count
Source
936
3.79k
{
937
3.79k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
3.79k
    auto& a = stack[N];
944
3.79k
    auto& t = stack.top();
945
3.79k
    auto t0 = t[0];
946
3.79k
    auto t1 = t[1];
947
3.79k
    auto t2 = t[2];
948
3.79k
    auto t3 = t[3];
949
3.79k
    t = a;
950
3.79k
    a[0] = t0;
951
3.79k
    a[1] = t1;
952
3.79k
    a[2] = t2;
953
3.79k
    a[3] = t3;
954
3.79k
}
void evmone::instr::core::swap<8>(evmone::StackTop)
Line
Count
Source
936
7.70k
{
937
7.70k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
7.70k
    auto& a = stack[N];
944
7.70k
    auto& t = stack.top();
945
7.70k
    auto t0 = t[0];
946
7.70k
    auto t1 = t[1];
947
7.70k
    auto t2 = t[2];
948
7.70k
    auto t3 = t[3];
949
7.70k
    t = a;
950
7.70k
    a[0] = t0;
951
7.70k
    a[1] = t1;
952
7.70k
    a[2] = t2;
953
7.70k
    a[3] = t3;
954
7.70k
}
void evmone::instr::core::swap<9>(evmone::StackTop)
Line
Count
Source
936
5.83k
{
937
5.83k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
5.83k
    auto& a = stack[N];
944
5.83k
    auto& t = stack.top();
945
5.83k
    auto t0 = t[0];
946
5.83k
    auto t1 = t[1];
947
5.83k
    auto t2 = t[2];
948
5.83k
    auto t3 = t[3];
949
5.83k
    t = a;
950
5.83k
    a[0] = t0;
951
5.83k
    a[1] = t1;
952
5.83k
    a[2] = t2;
953
5.83k
    a[3] = t3;
954
5.83k
}
void evmone::instr::core::swap<10>(evmone::StackTop)
Line
Count
Source
936
2.22k
{
937
2.22k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
2.22k
    auto& a = stack[N];
944
2.22k
    auto& t = stack.top();
945
2.22k
    auto t0 = t[0];
946
2.22k
    auto t1 = t[1];
947
2.22k
    auto t2 = t[2];
948
2.22k
    auto t3 = t[3];
949
2.22k
    t = a;
950
2.22k
    a[0] = t0;
951
2.22k
    a[1] = t1;
952
2.22k
    a[2] = t2;
953
2.22k
    a[3] = t3;
954
2.22k
}
void evmone::instr::core::swap<11>(evmone::StackTop)
Line
Count
Source
936
2.65k
{
937
2.65k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
2.65k
    auto& a = stack[N];
944
2.65k
    auto& t = stack.top();
945
2.65k
    auto t0 = t[0];
946
2.65k
    auto t1 = t[1];
947
2.65k
    auto t2 = t[2];
948
2.65k
    auto t3 = t[3];
949
2.65k
    t = a;
950
2.65k
    a[0] = t0;
951
2.65k
    a[1] = t1;
952
2.65k
    a[2] = t2;
953
2.65k
    a[3] = t3;
954
2.65k
}
void evmone::instr::core::swap<12>(evmone::StackTop)
Line
Count
Source
936
6.70k
{
937
6.70k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
6.70k
    auto& a = stack[N];
944
6.70k
    auto& t = stack.top();
945
6.70k
    auto t0 = t[0];
946
6.70k
    auto t1 = t[1];
947
6.70k
    auto t2 = t[2];
948
6.70k
    auto t3 = t[3];
949
6.70k
    t = a;
950
6.70k
    a[0] = t0;
951
6.70k
    a[1] = t1;
952
6.70k
    a[2] = t2;
953
6.70k
    a[3] = t3;
954
6.70k
}
void evmone::instr::core::swap<13>(evmone::StackTop)
Line
Count
Source
936
4.16k
{
937
4.16k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
4.16k
    auto& a = stack[N];
944
4.16k
    auto& t = stack.top();
945
4.16k
    auto t0 = t[0];
946
4.16k
    auto t1 = t[1];
947
4.16k
    auto t2 = t[2];
948
4.16k
    auto t3 = t[3];
949
4.16k
    t = a;
950
4.16k
    a[0] = t0;
951
4.16k
    a[1] = t1;
952
4.16k
    a[2] = t2;
953
4.16k
    a[3] = t3;
954
4.16k
}
void evmone::instr::core::swap<14>(evmone::StackTop)
Line
Count
Source
936
3.57k
{
937
3.57k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
3.57k
    auto& a = stack[N];
944
3.57k
    auto& t = stack.top();
945
3.57k
    auto t0 = t[0];
946
3.57k
    auto t1 = t[1];
947
3.57k
    auto t2 = t[2];
948
3.57k
    auto t3 = t[3];
949
3.57k
    t = a;
950
3.57k
    a[0] = t0;
951
3.57k
    a[1] = t1;
952
3.57k
    a[2] = t2;
953
3.57k
    a[3] = t3;
954
3.57k
}
void evmone::instr::core::swap<15>(evmone::StackTop)
Line
Count
Source
936
2.33k
{
937
2.33k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
2.33k
    auto& a = stack[N];
944
2.33k
    auto& t = stack.top();
945
2.33k
    auto t0 = t[0];
946
2.33k
    auto t1 = t[1];
947
2.33k
    auto t2 = t[2];
948
2.33k
    auto t3 = t[3];
949
2.33k
    t = a;
950
2.33k
    a[0] = t0;
951
2.33k
    a[1] = t1;
952
2.33k
    a[2] = t2;
953
2.33k
    a[3] = t3;
954
2.33k
}
void evmone::instr::core::swap<16>(evmone::StackTop)
Line
Count
Source
936
2.34k
{
937
2.34k
    static_assert(N >= 1 && N <= 16);
938
939
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
940
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
941
    // TODO(clang): Check if #59116 bug fix has been released.
942
943
2.34k
    auto& a = stack[N];
944
2.34k
    auto& t = stack.top();
945
2.34k
    auto t0 = t[0];
946
2.34k
    auto t1 = t[1];
947
2.34k
    auto t2 = t[2];
948
2.34k
    auto t3 = t[3];
949
2.34k
    t = a;
950
2.34k
    a[0] = t0;
951
2.34k
    a[1] = t1;
952
2.34k
    a[2] = t2;
953
2.34k
    a[3] = t3;
954
2.34k
}
955
956
inline code_iterator dupn(StackTop stack, code_iterator pos) noexcept
957
0
{
958
0
    stack.push(stack[pos[1]]);
959
0
    return pos + 2;
960
0
}
961
962
inline code_iterator swapn(StackTop stack, code_iterator pos) noexcept
963
0
{
964
    // TODO: This may not be optimal, see instr::core::swap().
965
0
    std::swap(stack.top(), stack[pos[1] + 1]);
966
0
    return pos + 2;
967
0
}
968
969
inline code_iterator exchange(StackTop stack, code_iterator pos) noexcept
970
0
{
971
0
    const auto n = (pos[1] >> 4) + 1;
972
0
    const auto m = (pos[1] & 0x0f) + 1;
973
    // TODO: This may not be optimal, see instr::core::swap().
974
0
    std::swap(stack[n], stack[n + m]);
975
0
    return pos + 2;
976
0
}
977
978
inline Result mcopy(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
979
1.52k
{
980
1.52k
    const auto& dst_u256 = stack.pop();
981
1.52k
    const auto& src_u256 = stack.pop();
982
1.52k
    const auto& size_u256 = stack.pop();
983
984
1.52k
    if (!check_memory(gas_left, state.memory, std::max(dst_u256, src_u256), size_u256))
985
150
        return {EVMC_OUT_OF_GAS, gas_left};
986
987
1.37k
    const auto dst = static_cast<size_t>(dst_u256);
988
1.37k
    const auto src = static_cast<size_t>(src_u256);
989
1.37k
    const auto size = static_cast<size_t>(size_u256);
990
991
1.37k
    if (const auto cost = copy_cost(size); (gas_left -= cost) < 0)
992
72
        return {EVMC_OUT_OF_GAS, gas_left};
993
994
1.30k
    if (size > 0)
995
1.12k
        std::memmove(&state.memory[dst], &state.memory[src], size);
996
997
1.30k
    return {EVMC_SUCCESS, gas_left};
998
1.37k
}
999
1000
inline void dataload(StackTop stack, ExecutionState& state) noexcept
1001
0
{
1002
0
    const auto data = state.analysis.baseline->eof_data();
1003
0
    auto& index = stack.top();
1004
1005
0
    if (data.size() < index)
1006
0
        index = 0;
1007
0
    else
1008
0
    {
1009
0
        const auto begin = static_cast<size_t>(index);
1010
0
        const auto end = std::min(begin + 32, data.size());
1011
1012
0
        uint8_t d[32] = {};
1013
0
        for (size_t i = 0; i < (end - begin); ++i)
1014
0
            d[i] = data[begin + i];
1015
1016
0
        index = intx::be::unsafe::load<uint256>(d);
1017
0
    }
1018
0
}
1019
1020
inline void datasize(StackTop stack, ExecutionState& state) noexcept
1021
0
{
1022
0
    stack.push(state.analysis.baseline->eof_data().size());
1023
0
}
1024
1025
inline code_iterator dataloadn(StackTop stack, ExecutionState& state, code_iterator pos) noexcept
1026
0
{
1027
0
    const auto index = read_uint16_be(&pos[1]);
1028
1029
0
    stack.push(intx::be::unsafe::load<uint256>(&state.analysis.baseline->eof_data()[index]));
1030
0
    return pos + 3;
1031
0
}
1032
1033
inline Result datacopy(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
1034
0
{
1035
0
    const auto data = state.analysis.baseline->eof_data();
1036
0
    const auto& mem_index = stack.pop();
1037
0
    const auto& data_index = stack.pop();
1038
0
    const auto& size = stack.pop();
1039
1040
0
    if (!check_memory(gas_left, state.memory, mem_index, size))
1041
0
        return {EVMC_OUT_OF_GAS, gas_left};
1042
1043
0
    const auto dst = static_cast<size_t>(mem_index);
1044
    // TODO why?
1045
0
    const auto src = data.size() < data_index ? data.size() : static_cast<size_t>(data_index);
1046
0
    const auto s = static_cast<size_t>(size);
1047
0
    const auto copy_size = std::min(s, data.size() - src);
1048
1049
0
    if (const auto cost = copy_cost(s); (gas_left -= cost) < 0)
1050
0
        return {EVMC_OUT_OF_GAS, gas_left};
1051
1052
0
    if (copy_size > 0)
1053
0
        std::memcpy(&state.memory[dst], &data[src], copy_size);
1054
1055
0
    if (s - copy_size > 0)
1056
0
        std::memset(&state.memory[dst + copy_size], 0, s - copy_size);
1057
1058
0
    return {EVMC_SUCCESS, gas_left};
1059
0
}
1060
1061
template <size_t NumTopics>
1062
inline Result log(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
1063
29.6k
{
1064
29.6k
    static_assert(NumTopics <= 4);
1065
1066
29.6k
    if (state.in_static_mode())
1067
215
        return {EVMC_STATIC_MODE_VIOLATION, 0};
1068
1069
29.4k
    const auto& offset = stack.pop();
1070
29.4k
    const auto& size = stack.pop();
1071
1072
29.4k
    if (!check_memory(gas_left, state.memory, offset, size))
1073
536
        return {EVMC_OUT_OF_GAS, gas_left};
1074
1075
28.8k
    const auto o = static_cast<size_t>(offset);
1076
28.8k
    const auto s = static_cast<size_t>(size);
1077
1078
28.8k
    const auto cost = int64_t(s) * 8;
1079
28.8k
    if ((gas_left -= cost) < 0)
1080
14
        return {EVMC_OUT_OF_GAS, gas_left};
1081
1082
28.8k
    std::array<evmc::bytes32, NumTopics> topics;  // NOLINT(cppcoreguidelines-pro-type-member-init)
1083
28.8k
    for (auto& topic : topics)
1084
39.3k
        topic = intx::be::store<evmc::bytes32>(stack.pop());
1085
1086
28.8k
    const auto data = s != 0 ? 
&state.memory[o]28.5k
:
nullptr304
;
1087
28.8k
    state.host.emit_log(state.msg->recipient, data, s, topics.data(), NumTopics);
1088
28.8k
    return {EVMC_SUCCESS, gas_left};
1089
28.8k
}
evmone::Result evmone::instr::core::log<0ul>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
1063
9.36k
{
1064
9.36k
    static_assert(NumTopics <= 4);
1065
1066
9.36k
    if (state.in_static_mode())
1067
161
        return {EVMC_STATIC_MODE_VIOLATION, 0};
1068
1069
9.20k
    const auto& offset = stack.pop();
1070
9.20k
    const auto& size = stack.pop();
1071
1072
9.20k
    if (!check_memory(gas_left, state.memory, offset, size))
1073
90
        return {EVMC_OUT_OF_GAS, gas_left};
1074
1075
9.11k
    const auto o = static_cast<size_t>(offset);
1076
9.11k
    const auto s = static_cast<size_t>(size);
1077
1078
9.11k
    const auto cost = int64_t(s) * 8;
1079
9.11k
    if ((gas_left -= cost) < 0)
1080
6
        return {EVMC_OUT_OF_GAS, gas_left};
1081
1082
9.10k
    std::array<evmc::bytes32, NumTopics> topics;  // NOLINT(cppcoreguidelines-pro-type-member-init)
1083
9.10k
    for (auto& topic : topics)
1084
0
        topic = intx::be::store<evmc::bytes32>(stack.pop());
1085
1086
9.10k
    const auto data = s != 0 ? 
&state.memory[o]9.05k
:
nullptr54
;
1087
9.10k
    state.host.emit_log(state.msg->recipient, data, s, topics.data(), NumTopics);
1088
9.10k
    return {EVMC_SUCCESS, gas_left};
1089
9.11k
}
evmone::Result evmone::instr::core::log<1ul>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
1063
8.20k
{
1064
8.20k
    static_assert(NumTopics <= 4);
1065
1066
8.20k
    if (state.in_static_mode())
1067
36
        return {EVMC_STATIC_MODE_VIOLATION, 0};
1068
1069
8.17k
    const auto& offset = stack.pop();
1070
8.17k
    const auto& size = stack.pop();
1071
1072
8.17k
    if (!check_memory(gas_left, state.memory, offset, size))
1073
112
        return {EVMC_OUT_OF_GAS, gas_left};
1074
1075
8.05k
    const auto o = static_cast<size_t>(offset);
1076
8.05k
    const auto s = static_cast<size_t>(size);
1077
1078
8.05k
    const auto cost = int64_t(s) * 8;
1079
8.05k
    if ((gas_left -= cost) < 0)
1080
4
        return {EVMC_OUT_OF_GAS, gas_left};
1081
1082
8.05k
    std::array<evmc::bytes32, NumTopics> topics;  // NOLINT(cppcoreguidelines-pro-type-member-init)
1083
8.05k
    for (auto& topic : topics)
1084
8.05k
        topic = intx::be::store<evmc::bytes32>(stack.pop());
1085
1086
8.05k
    const auto data = s != 0 ? 
&state.memory[o]7.99k
:
nullptr60
;
1087
8.05k
    state.host.emit_log(state.msg->recipient, data, s, topics.data(), NumTopics);
1088
8.05k
    return {EVMC_SUCCESS, gas_left};
1089
8.05k
}
evmone::Result evmone::instr::core::log<2ul>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
1063
4.57k
{
1064
4.57k
    static_assert(NumTopics <= 4);
1065
1066
4.57k
    if (state.in_static_mode())
1067
6
        return {EVMC_STATIC_MODE_VIOLATION, 0};
1068
1069
4.57k
    const auto& offset = stack.pop();
1070
4.57k
    const auto& size = stack.pop();
1071
1072
4.57k
    if (!check_memory(gas_left, state.memory, offset, size))
1073
114
        return {EVMC_OUT_OF_GAS, gas_left};
1074
1075
4.45k
    const auto o = static_cast<size_t>(offset);
1076
4.45k
    const auto s = static_cast<size_t>(size);
1077
1078
4.45k
    const auto cost = int64_t(s) * 8;
1079
4.45k
    if ((gas_left -= cost) < 0)
1080
0
        return {EVMC_OUT_OF_GAS, gas_left};
1081
1082
4.45k
    std::array<evmc::bytes32, NumTopics> topics;  // NOLINT(cppcoreguidelines-pro-type-member-init)
1083
4.45k
    for (auto& topic : topics)
1084
8.91k
        topic = intx::be::store<evmc::bytes32>(stack.pop());
1085
1086
4.45k
    const auto data = s != 0 ? 
&state.memory[o]4.37k
:
nullptr84
;
1087
4.45k
    state.host.emit_log(state.msg->recipient, data, s, topics.data(), NumTopics);
1088
4.45k
    return {EVMC_SUCCESS, gas_left};
1089
4.45k
}
evmone::Result evmone::instr::core::log<3ul>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
1063
6.76k
{
1064
6.76k
    static_assert(NumTopics <= 4);
1065
1066
6.76k
    if (state.in_static_mode())
1067
6
        return {EVMC_STATIC_MODE_VIOLATION, 0};
1068
1069
6.76k
    const auto& offset = stack.pop();
1070
6.76k
    const auto& size = stack.pop();
1071
1072
6.76k
    if (!check_memory(gas_left, state.memory, offset, size))
1073
108
        return {EVMC_OUT_OF_GAS, gas_left};
1074
1075
6.65k
    const auto o = static_cast<size_t>(offset);
1076
6.65k
    const auto s = static_cast<size_t>(size);
1077
1078
6.65k
    const auto cost = int64_t(s) * 8;
1079
6.65k
    if ((gas_left -= cost) < 0)
1080
4
        return {EVMC_OUT_OF_GAS, gas_left};
1081
1082
6.64k
    std::array<evmc::bytes32, NumTopics> topics;  // NOLINT(cppcoreguidelines-pro-type-member-init)
1083
6.64k
    for (auto& topic : topics)
1084
19.9k
        topic = intx::be::store<evmc::bytes32>(stack.pop());
1085
1086
6.64k
    const auto data = s != 0 ? 
&state.memory[o]6.59k
:
nullptr58
;
1087
6.64k
    state.host.emit_log(state.msg->recipient, data, s, topics.data(), NumTopics);
1088
6.64k
    return {EVMC_SUCCESS, gas_left};
1089
6.65k
}
evmone::Result evmone::instr::core::log<4ul>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
1063
731
{
1064
731
    static_assert(NumTopics <= 4);
1065
1066
731
    if (state.in_static_mode())
1067
6
        return {EVMC_STATIC_MODE_VIOLATION, 0};
1068
1069
725
    const auto& offset = stack.pop();
1070
725
    const auto& size = stack.pop();
1071
1072
725
    if (!check_memory(gas_left, state.memory, offset, size))
1073
112
        return {EVMC_OUT_OF_GAS, gas_left};
1074
1075
613
    const auto o = static_cast<size_t>(offset);
1076
613
    const auto s = static_cast<size_t>(size);
1077
1078
613
    const auto cost = int64_t(s) * 8;
1079
613
    if ((gas_left -= cost) < 0)
1080
0
        return {EVMC_OUT_OF_GAS, gas_left};
1081
1082
613
    std::array<evmc::bytes32, NumTopics> topics;  // NOLINT(cppcoreguidelines-pro-type-member-init)
1083
613
    for (auto& topic : topics)
1084
2.45k
        topic = intx::be::store<evmc::bytes32>(stack.pop());
1085
1086
613
    const auto data = s != 0 ? 
&state.memory[o]565
:
nullptr48
;
1087
613
    state.host.emit_log(state.msg->recipient, data, s, topics.data(), NumTopics);
1088
613
    return {EVMC_SUCCESS, gas_left};
1089
613
}
1090
1091
1092
template <Opcode Op>
1093
Result call_impl(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
1094
inline constexpr auto call = call_impl<OP_CALL>;
1095
inline constexpr auto callcode = call_impl<OP_CALLCODE>;
1096
inline constexpr auto delegatecall = call_impl<OP_DELEGATECALL>;
1097
inline constexpr auto staticcall = call_impl<OP_STATICCALL>;
1098
1099
template <Opcode Op>
1100
Result extcall_impl(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
1101
inline constexpr auto extcall = extcall_impl<OP_EXTCALL>;
1102
inline constexpr auto extdelegatecall = extcall_impl<OP_EXTDELEGATECALL>;
1103
inline constexpr auto extstaticcall = extcall_impl<OP_EXTSTATICCALL>;
1104
1105
template <Opcode Op>
1106
Result create_impl(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
1107
inline constexpr auto create = create_impl<OP_CREATE>;
1108
inline constexpr auto create2 = create_impl<OP_CREATE2>;
1109
1110
template <Opcode Op>
1111
Result create_eof_impl(
1112
    StackTop stack, int64_t gas_left, ExecutionState& state, code_iterator& pos) noexcept;
1113
inline constexpr auto eofcreate = create_eof_impl<OP_EOFCREATE>;
1114
inline constexpr auto txcreate = create_eof_impl<OP_TXCREATE>;
1115
1116
inline code_iterator callf(StackTop stack, ExecutionState& state, code_iterator pos) noexcept
1117
0
{
1118
0
    const auto index = read_uint16_be(&pos[1]);
1119
0
    const auto& header = state.analysis.baseline->eof_header();
1120
0
    const auto stack_size = stack.end() - state.stack_space.bottom();
1121
0
    const auto callee_type = header.get_type(state.original_code, index);
1122
0
    if (stack_size + callee_type.max_stack_increase > StackSpace::limit)
1123
0
    {
1124
0
        state.status = EVMC_STACK_OVERFLOW;
1125
0
        return nullptr;
1126
0
    }
1127
1128
0
    if (state.call_stack.size() >= StackSpace::limit)
1129
0
    {
1130
        // TODO: Add different error code.
1131
0
        state.status = EVMC_STACK_OVERFLOW;
1132
0
        return nullptr;
1133
0
    }
1134
0
    state.call_stack.push_back(pos + 3);
1135
1136
0
    const auto offset = header.code_offsets[index] - header.code_offsets[0];
1137
0
    return state.analysis.baseline->executable_code().data() + offset;
1138
0
}
1139
1140
inline code_iterator retf(StackTop /*stack*/, ExecutionState& state, code_iterator /*pos*/) noexcept
1141
0
{
1142
0
    const auto p = state.call_stack.back();
1143
0
    state.call_stack.pop_back();
1144
0
    return p;
1145
0
}
1146
1147
inline code_iterator jumpf(StackTop stack, ExecutionState& state, code_iterator pos) noexcept
1148
0
{
1149
0
    const auto index = read_uint16_be(&pos[1]);
1150
0
    const auto& header = state.analysis.baseline->eof_header();
1151
0
    const auto stack_size = stack.end() - state.stack_space.bottom();
1152
0
    const auto callee_type = header.get_type(state.original_code, index);
1153
0
    if (stack_size + callee_type.max_stack_increase > StackSpace::limit)
1154
0
    {
1155
0
        state.status = EVMC_STACK_OVERFLOW;
1156
0
        return nullptr;
1157
0
    }
1158
1159
0
    const auto offset = header.code_offsets[index] - header.code_offsets[0];
1160
0
    return state.analysis.baseline->executable_code().data() + offset;
1161
0
}
1162
1163
template <evmc_status_code StatusCode>
1164
inline TermResult return_impl(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
1165
551k
{
1166
551k
    const auto& offset = stack[0];
1167
551k
    const auto& size = stack[1];
1168
1169
551k
    if (!check_memory(gas_left, state.memory, offset, size))
1170
198
        return {EVMC_OUT_OF_GAS, gas_left};
1171
1172
551k
    state.output_size = static_cast<size_t>(size);
1173
551k
    if (state.output_size != 0)
1174
455k
        state.output_offset = static_cast<size_t>(offset);
1175
551k
    return {StatusCode, gas_left};
1176
551k
}
evmone::TermResult evmone::instr::core::return_impl<(evmc_status_code)0>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
1165
525k
{
1166
525k
    const auto& offset = stack[0];
1167
525k
    const auto& size = stack[1];
1168
1169
525k
    if (!check_memory(gas_left, state.memory, offset, size))
1170
114
        return {EVMC_OUT_OF_GAS, gas_left};
1171
1172
525k
    state.output_size = static_cast<size_t>(size);
1173
525k
    if (state.output_size != 0)
1174
431k
        state.output_offset = static_cast<size_t>(offset);
1175
525k
    return {StatusCode, gas_left};
1176
525k
}
evmone::TermResult evmone::instr::core::return_impl<(evmc_status_code)2>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
1165
25.3k
{
1166
25.3k
    const auto& offset = stack[0];
1167
25.3k
    const auto& size = stack[1];
1168
1169
25.3k
    if (!check_memory(gas_left, state.memory, offset, size))
1170
84
        return {EVMC_OUT_OF_GAS, gas_left};
1171
1172
25.2k
    state.output_size = static_cast<size_t>(size);
1173
25.2k
    if (state.output_size != 0)
1174
24.2k
        state.output_offset = static_cast<size_t>(offset);
1175
25.2k
    return {StatusCode, gas_left};
1176
25.3k
}
1177
inline constexpr auto return_ = return_impl<EVMC_SUCCESS>;
1178
inline constexpr auto revert = return_impl<EVMC_REVERT>;
1179
1180
inline TermResult returncode(
1181
    StackTop stack, int64_t gas_left, ExecutionState& state, code_iterator pos) noexcept
1182
0
{
1183
0
    const auto& offset = stack[0];
1184
0
    const auto& size = stack[1];
1185
1186
0
    if (!check_memory(gas_left, state.memory, offset, size))
1187
0
        return {EVMC_OUT_OF_GAS, gas_left};
1188
1189
0
    const auto deploy_container_index = size_t{pos[1]};
1190
0
    bytes deploy_container{state.analysis.baseline->eof_header().get_container(
1191
0
        state.original_code, deploy_container_index)};
1192
1193
    // Append (offset, size) to data section
1194
0
    if (!append_data_section(deploy_container,
1195
0
            {&state.memory[static_cast<size_t>(offset)], static_cast<size_t>(size)}))
1196
0
        return {EVMC_OUT_OF_GAS, gas_left};
1197
1198
0
    state.deploy_container = std::move(deploy_container);
1199
1200
0
    return {EVMC_SUCCESS, gas_left};
1201
0
}
1202
1203
inline TermResult selfdestruct(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
1204
7.75k
{
1205
7.75k
    if (state.in_static_mode())
1206
441
        return {EVMC_STATIC_MODE_VIOLATION, gas_left};
1207
1208
7.30k
    const auto beneficiary = intx::be::trunc<evmc::address>(stack[0]);
1209
1210
7.30k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(beneficiary) == EVMC_ACCESS_COLD7.15k
)
  MC/DC Decision Region (1210:9) to (1210:95)
+
+  Number of Conditions: 2
+     Condition C1 --> (1210:9)
+     Condition C2 --> (1210:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
1211
2.13k
    {
1212
2.13k
        if ((gas_left -= instr::cold_account_access_cost) < 0)
1213
12
            return {EVMC_OUT_OF_GAS, gas_left};
1214
2.13k
    }
1215
1216
7.29k
    if (state.rev >= EVMC_TANGERINE_WHISTLE)
1217
7.25k
    {
1218
7.25k
        if (state.rev == EVMC_TANGERINE_WHISTLE || state.host.get_balance(state.msg->recipient))
  MC/DC Decision Region (1218:13) to (1218:96)
+
+  Number of Conditions: 2
+     Condition C1 --> (1218:13)
+     Condition C2 --> (1218:52)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+
+  C1-Pair: not covered
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 50.00%
+
1219
3.48k
        {
1220
            // After TANGERINE_WHISTLE apply additional cost of
1221
            // sending value to a non-existing account.
1222
3.48k
            if (!state.host.account_exists(beneficiary))
1223
771
            {
1224
771
                if ((gas_left -= 25000) < 0)
1225
24
                    return {EVMC_OUT_OF_GAS, gas_left};
1226
771
            }
1227
3.48k
        }
1228
7.25k
    }
1229
1230
7.27k
    if (state.host.selfdestruct(state.msg->recipient, beneficiary))
1231
4.14k
    {
1232
4.14k
        if (state.rev < EVMC_LONDON)
1233
162
            state.gas_refund += 24000;
1234
4.14k
    }
1235
7.27k
    return {EVMC_SUCCESS, gas_left};
1236
7.29k
}
1237
1238
1239
/// Maps an opcode to the instruction implementation.
1240
///
1241
/// The set of template specializations which map opcodes `Op` to the function
1242
/// implementing the instruction identified by the opcode.
1243
///     instr::impl<OP_DUP1>(/*...*/);
1244
/// The unspecialized template is invalid and should never to used.
1245
template <Opcode Op>
1246
inline constexpr auto impl = nullptr;
1247
1248
#undef ON_OPCODE_IDENTIFIER
1249
#define ON_OPCODE_IDENTIFIER(OPCODE, IDENTIFIER) \
1250
    template <>                                  \
1251
    inline constexpr auto impl<OPCODE> = IDENTIFIER;  // opcode -> implementation
1252
MAP_OPCODES
1253
#undef ON_OPCODE_IDENTIFIER
1254
710M
#define ON_OPCODE_IDENTIFIER ON_OPCODE_IDENTIFIER_DEFAULT
1255
}  // namespace instr::core
1256
}  // namespace evmone
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions_calls.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions_calls.cpp.html new file mode 100644 index 0000000000..9f4dcd27d7 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions_calls.cpp.html @@ -0,0 +1,799 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone/instructions_calls.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2019 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "delegation.hpp"
6
#include "eof.hpp"
7
#include "instructions.hpp"
8
#include <variant>
9
10
constexpr int64_t MIN_RETAINED_GAS = 5000;
11
constexpr int64_t MIN_CALLEE_GAS = 2300;
12
constexpr int64_t CALL_VALUE_COST = 9000;
13
constexpr int64_t ACCOUNT_CREATION_COST = 25000;
14
15
constexpr auto EXTCALL_SUCCESS = 0;
16
constexpr auto EXTCALL_REVERT = 1;
17
constexpr auto EXTCALL_ABORT = 2;
18
19
namespace evmone::instr::core
20
{
21
namespace
22
{
23
/// Get target address of a code executing instruction.
24
///
25
/// Returns EIP-7702 delegate address if addr is delegated, or addr itself otherwise.
26
/// Applies gas charge for accessing delegate account and may fail with out of gas.
27
inline std::variant<evmc::address, Result> get_target_address(
28
    const evmc::address& addr, int64_t& gas_left, ExecutionState& state) noexcept
29
4.12M
{
30
4.12M
    if (state.rev < EVMC_PRAGUE)
31
1.78M
        return addr;
32
33
2.33M
    const auto delegate_addr = get_delegate_address(state.host, addr);
34
2.33M
    if (!delegate_addr)
35
2.33M
        return addr;
36
37
4.88k
    const auto delegate_account_access_cost =
38
4.88k
        (state.host.access_account(*delegate_addr) == EVMC_ACCESS_COLD ?
39
330
                instr::cold_account_access_cost :
40
4.88k
                
instr::warm_storage_read_cost4.55k
);
41
42
4.88k
    if ((gas_left -= delegate_account_access_cost) < 0)
43
18
        return Result{EVMC_OUT_OF_GAS, gas_left};
44
45
4.87k
    return *delegate_addr;
46
4.88k
}
47
}  // namespace
48
49
/// Converts an opcode to matching EVMC call kind.
50
/// NOLINTNEXTLINE(misc-use-internal-linkage) fixed in clang-tidy 20.
51
consteval evmc_call_kind to_call_kind(Opcode op) noexcept
52
{
53
    switch (op)
54
    {
55
    case OP_CALL:
56
    case OP_EXTCALL:
57
    case OP_STATICCALL:
58
    case OP_EXTSTATICCALL:
59
        return EVMC_CALL;
60
    case OP_CALLCODE:
61
        return EVMC_CALLCODE;
62
    case OP_DELEGATECALL:
63
    case OP_EXTDELEGATECALL:
64
        return EVMC_DELEGATECALL;
65
    case OP_CREATE:
66
        return EVMC_CREATE;
67
    case OP_CREATE2:
68
        return EVMC_CREATE2;
69
    case OP_EOFCREATE:
70
    case OP_TXCREATE:
71
        return EVMC_EOFCREATE;
72
    default:
73
        intx::unreachable();
74
    }
75
}
76
77
template <Opcode Op>
78
Result call_impl(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
79
4.12M
{
80
4.12M
    static_assert(
81
4.12M
        Op == OP_CALL || Op == OP_CALLCODE || Op == OP_DELEGATECALL || Op == OP_STATICCALL);
82
83
4.12M
    const auto gas = stack.pop();
84
4.12M
    const auto dst = intx::be::trunc<evmc::address>(stack.pop());
85
4.12M
    const auto value = (Op == OP_STATICCALL || 
Op == OP_DELEGATECALL1.06M
) ?
03.16M
:
stack.pop()958k
;
  MC/DC Decision Region (85:25) to (85:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (85:25)
+     Condition C2 --> (85:48)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (85:25) to (85:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (85:25)
+     Condition C2 --> (85:48)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (85:25) to (85:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (85:25)
+     Condition C2 --> (85:48)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (85:25) to (85:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (85:25)
+     Condition C2 --> (85:48)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
86
4.12M
    const auto has_value = value != 0;
87
4.12M
    const auto input_offset_u256 = stack.pop();
88
4.12M
    const auto input_size_u256 = stack.pop();
89
4.12M
    const auto output_offset_u256 = stack.pop();
90
4.12M
    const auto output_size_u256 = stack.pop();
91
92
4.12M
    stack.push(0);  // Assume failure.
93
4.12M
    state.return_data.clear();
94
95
4.12M
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(dst) == EVMC_ACCESS_COLD4.07M
)
  MC/DC Decision Region (95:9) to (95:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (95:9)
+     Condition C2 --> (95:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
  MC/DC Decision Region (95:9) to (95:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (95:9)
+     Condition C2 --> (95:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
  MC/DC Decision Region (95:9) to (95:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (95:9)
+     Condition C2 --> (95:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
  MC/DC Decision Region (95:9) to (95:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (95:9)
+     Condition C2 --> (95:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
96
185k
    {
97
185k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
98
894
            return {EVMC_OUT_OF_GAS, gas_left};
99
185k
    }
100
101
4.12M
    const auto target_addr_or_result = get_target_address(dst, gas_left, state);
102
4.12M
    if (const auto* result = std::get_if<Result>(&target_addr_or_result))
103
18
        return *result;
104
105
4.12M
    const auto& code_addr = std::get<evmc::address>(target_addr_or_result);
106
107
4.12M
    if (!check_memory(gas_left, state.memory, input_offset_u256, input_size_u256))
108
604
        return {EVMC_OUT_OF_GAS, gas_left};
109
110
4.12M
    if (!check_memory(gas_left, state.memory, output_offset_u256, output_size_u256))
111
276
        return {EVMC_OUT_OF_GAS, gas_left};
112
113
4.12M
    const auto input_offset = static_cast<size_t>(input_offset_u256);
114
4.12M
    const auto input_size = static_cast<size_t>(input_size_u256);
115
4.12M
    const auto output_offset = static_cast<size_t>(output_offset_u256);
116
4.12M
    const auto output_size = static_cast<size_t>(output_size_u256);
117
118
4.12M
    evmc_message msg{.kind = to_call_kind(Op)};
119
4.12M
    msg.flags = (Op == OP_STATICCALL) ? 
uint32_t{EVMC_STATIC}3.06M
:
state.msg->flags1.05M
;
120
4.12M
    if (dst != code_addr)
121
4.84k
        msg.flags |= EVMC_DELEGATED;
122
4.11M
    else
123
4.11M
        msg.flags &= ~std::underlying_type_t<evmc_flags>{EVMC_DELEGATED};
124
4.12M
    msg.depth = state.msg->depth + 1;
125
4.12M
    msg.recipient = (Op == OP_CALL || 
Op == OP_STATICCALL3.24M
) ?
dst3.93M
:
state.msg->recipient183k
;
  MC/DC Decision Region (125:22) to (125:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (125:22)
+     Condition C2 --> (125:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (125:22) to (125:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (125:22)
+     Condition C2 --> (125:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (125:22) to (125:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (125:22)
+     Condition C2 --> (125:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (125:22) to (125:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (125:22)
+     Condition C2 --> (125:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
126
4.12M
    msg.code_address = code_addr;
127
4.12M
    msg.sender = (Op == OP_DELEGATECALL) ? 
state.msg->sender100k
:
state.msg->recipient4.02M
;
128
4.12M
    msg.value =
129
4.12M
        (Op == OP_DELEGATECALL) ? 
state.msg->value100k
:
intx::be::store<evmc::uint256be>(value)4.02M
;
130
131
4.12M
    if (input_size > 0)
132
3.06M
    {
133
        // input_offset may be garbage if input_size == 0.
134
3.06M
        msg.input_data = &state.memory[input_offset];
135
3.06M
        msg.input_size = input_size;
136
3.06M
    }
137
138
4.12M
    auto cost = has_value ? 
CALL_VALUE_COST101k
:
04.02M
;
139
140
    if constexpr (Op == OP_CALL)
141
875k
    {
142
875k
        if (has_value && 
state.in_static_mode()91.1k
)
  MC/DC Decision Region (142:13) to (142:48)
+
+  Number of Conditions: 2
+     Condition C1 --> (142:13)
+     Condition C2 --> (142:26)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
143
180
            return {EVMC_STATIC_MODE_VIOLATION, gas_left};
144
145
875k
        if ((has_value || 
state.rev < EVMC_SPURIOUS_DRAGON784k
) &&
!state.host.account_exists(dst)100k
)
  MC/DC Decision Region (145:13) to (145:95)
+
+  Number of Conditions: 3
+     Condition C1 --> (145:14)
+     Condition C2 --> (145:27)
+     Condition C3 --> (145:64)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  F,  -  = F      }
+  2 { F,  T,  F  = F      }
+  3 { T,  -,  F  = F      }
+  4 { F,  T,  T  = T      }
+  5 { T,  -,  T  = T      }
+
+  C1-Pair: covered: (1,5)
+  C2-Pair: covered: (1,4)
+  C3-Pair: covered: (2,4)
+  MC/DC Coverage for Expression: 100.00%
+
146
971
            cost += ACCOUNT_CREATION_COST;
147
875k
    }
148
149
4.12M
    if ((gas_left -= cost) < 0)
150
122
        return {EVMC_OUT_OF_GAS, gas_left};
151
152
4.12M
    msg.gas = std::numeric_limits<int64_t>::max();
153
4.12M
    if (gas < msg.gas)
154
4.11M
        msg.gas = static_cast<int64_t>(gas);
155
156
4.12M
    if (state.rev >= EVMC_TANGERINE_WHISTLE)  // TODO: Always true for STATICCALL.
157
4.11M
        msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
158
11.6k
    else if (msg.gas > gas_left)
159
74
        return {EVMC_OUT_OF_GAS, gas_left};
160
161
4.12M
    if (has_value)
162
101k
    {
163
101k
        msg.gas += 2300;  // Add stipend.
164
101k
        gas_left += 2300;
165
101k
    }
166
167
4.12M
    if (state.msg->depth >= 1024)
168
150
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
169
170
4.12M
    if (has_value && 
intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < value101k
)
  MC/DC Decision Region (170:9) to (170:99)
+
+  Number of Conditions: 2
+     Condition C1 --> (170:9)
+     Condition C2 --> (170:22)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
  MC/DC Decision Region (170:9) to (170:99)
+
+  Number of Conditions: 2
+     Condition C1 --> (170:9)
+     Condition C2 --> (170:22)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { C,  -  = F      }
+
+  C1-Pair: constant folded
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (170:9) to (170:99)
+
+  Number of Conditions: 2
+     Condition C1 --> (170:9)
+     Condition C2 --> (170:22)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { C,  -  = F      }
+
+  C1-Pair: constant folded
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (170:9) to (170:99)
+
+  Number of Conditions: 2
+     Condition C1 --> (170:9)
+     Condition C2 --> (170:22)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
171
745
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
172
173
4.12M
    const auto result = state.host.call(msg);
174
4.12M
    state.return_data.assign(result.output_data, result.output_size);
175
4.12M
    stack.top() = result.status_code == EVMC_SUCCESS;
176
177
4.12M
    if (const auto copy_size = std::min(output_size, result.output_size); copy_size > 0)
178
135k
        std::memcpy(&state.memory[output_offset], result.output_data, copy_size);
179
180
4.12M
    const auto gas_used = msg.gas - result.gas_left;
181
4.12M
    gas_left -= gas_used;
182
4.12M
    state.gas_refund += result.gas_refund;
183
4.12M
    return {EVMC_SUCCESS, gas_left};
184
4.12M
}
evmone::Result evmone::instr::core::call_impl<(evmone::Opcode)241>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
79
875k
{
80
875k
    static_assert(
81
875k
        Op == OP_CALL || Op == OP_CALLCODE || Op == OP_DELEGATECALL || Op == OP_STATICCALL);
82
83
875k
    const auto gas = stack.pop();
84
875k
    const auto dst = intx::be::trunc<evmc::address>(stack.pop());
85
875k
    const auto value = (Op == OP_STATICCALL || Op == OP_DELEGATECALL) ? 
00
: stack.pop();
  MC/DC Decision Region (85:25) to (85:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (85:25)
+     Condition C2 --> (85:48)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
86
875k
    const auto has_value = value != 0;
87
875k
    const auto input_offset_u256 = stack.pop();
88
875k
    const auto input_size_u256 = stack.pop();
89
875k
    const auto output_offset_u256 = stack.pop();
90
875k
    const auto output_size_u256 = stack.pop();
91
92
875k
    stack.push(0);  // Assume failure.
93
875k
    state.return_data.clear();
94
95
875k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(dst) == EVMC_ACCESS_COLD832k
)
  MC/DC Decision Region (95:9) to (95:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (95:9)
+     Condition C2 --> (95:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
96
103k
    {
97
103k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
98
198
            return {EVMC_OUT_OF_GAS, gas_left};
99
103k
    }
100
101
875k
    const auto target_addr_or_result = get_target_address(dst, gas_left, state);
102
875k
    if (const auto* result = std::get_if<Result>(&target_addr_or_result))
103
6
        return *result;
104
105
875k
    const auto& code_addr = std::get<evmc::address>(target_addr_or_result);
106
107
875k
    if (!check_memory(gas_left, state.memory, input_offset_u256, input_size_u256))
108
162
        return {EVMC_OUT_OF_GAS, gas_left};
109
110
875k
    if (!check_memory(gas_left, state.memory, output_offset_u256, output_size_u256))
111
72
        return {EVMC_OUT_OF_GAS, gas_left};
112
113
875k
    const auto input_offset = static_cast<size_t>(input_offset_u256);
114
875k
    const auto input_size = static_cast<size_t>(input_size_u256);
115
875k
    const auto output_offset = static_cast<size_t>(output_offset_u256);
116
875k
    const auto output_size = static_cast<size_t>(output_size_u256);
117
118
875k
    evmc_message msg{.kind = to_call_kind(Op)};
119
875k
    msg.flags = (Op == OP_STATICCALL) ? 
uint32_t{EVMC_STATIC}0
: state.msg->flags;
120
875k
    if (dst != code_addr)
121
4.48k
        msg.flags |= EVMC_DELEGATED;
122
870k
    else
123
870k
        msg.flags &= ~std::underlying_type_t<evmc_flags>{EVMC_DELEGATED};
124
875k
    msg.depth = state.msg->depth + 1;
125
875k
    msg.recipient = (Op == OP_CALL || 
Op == OP_STATICCALL0
) ? dst :
state.msg->recipient0
;
  MC/DC Decision Region (125:22) to (125:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (125:22)
+     Condition C2 --> (125:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
126
875k
    msg.code_address = code_addr;
127
875k
    msg.sender = (Op == OP_DELEGATECALL) ? 
state.msg->sender0
: state.msg->recipient;
128
875k
    msg.value =
129
875k
        (Op == OP_DELEGATECALL) ? 
state.msg->value0
: intx::be::store<evmc::uint256be>(value);
130
131
875k
    if (input_size > 0)
132
635k
    {
133
        // input_offset may be garbage if input_size == 0.
134
635k
        msg.input_data = &state.memory[input_offset];
135
635k
        msg.input_size = input_size;
136
635k
    }
137
138
875k
    auto cost = has_value ? 
CALL_VALUE_COST91.1k
:
0784k
;
139
140
    if constexpr (Op == OP_CALL)
141
875k
    {
142
875k
        if (has_value && 
state.in_static_mode()91.1k
)
  MC/DC Decision Region (142:13) to (142:48)
+
+  Number of Conditions: 2
+     Condition C1 --> (142:13)
+     Condition C2 --> (142:26)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
143
180
            return {EVMC_STATIC_MODE_VIOLATION, gas_left};
144
145
875k
        if ((has_value || 
state.rev < EVMC_SPURIOUS_DRAGON784k
) &&
!state.host.account_exists(dst)100k
)
  MC/DC Decision Region (145:13) to (145:95)
+
+  Number of Conditions: 3
+     Condition C1 --> (145:14)
+     Condition C2 --> (145:27)
+     Condition C3 --> (145:64)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  F,  -  = F      }
+  2 { F,  T,  F  = F      }
+  3 { T,  -,  F  = F      }
+  4 { F,  T,  T  = T      }
+  5 { T,  -,  T  = T      }
+
+  C1-Pair: covered: (1,5)
+  C2-Pair: covered: (1,4)
+  C3-Pair: covered: (2,4)
+  MC/DC Coverage for Expression: 100.00%
+
146
971
            cost += ACCOUNT_CREATION_COST;
147
875k
    }
148
149
875k
    if ((gas_left -= cost) < 0)
150
98
        return {EVMC_OUT_OF_GAS, gas_left};
151
152
875k
    msg.gas = std::numeric_limits<int64_t>::max();
153
875k
    if (gas < msg.gas)
154
873k
        msg.gas = static_cast<int64_t>(gas);
155
156
875k
    if (state.rev >= EVMC_TANGERINE_WHISTLE)  // TODO: Always true for STATICCALL.
157
864k
        msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
158
10.7k
    else if (msg.gas > gas_left)
159
74
        return {EVMC_OUT_OF_GAS, gas_left};
160
161
875k
    if (has_value)
162
90.9k
    {
163
90.9k
        msg.gas += 2300;  // Add stipend.
164
90.9k
        gas_left += 2300;
165
90.9k
    }
166
167
875k
    if (state.msg->depth >= 1024)
168
62
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
169
170
875k
    if (has_value && 
intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < value90.8k
)
  MC/DC Decision Region (170:9) to (170:99)
+
+  Number of Conditions: 2
+     Condition C1 --> (170:9)
+     Condition C2 --> (170:22)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
171
611
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
172
173
874k
    const auto result = state.host.call(msg);
174
874k
    state.return_data.assign(result.output_data, result.output_size);
175
874k
    stack.top() = result.status_code == EVMC_SUCCESS;
176
177
874k
    if (const auto copy_size = std::min(output_size, result.output_size); copy_size > 0)
178
99.1k
        std::memcpy(&state.memory[output_offset], result.output_data, copy_size);
179
180
874k
    const auto gas_used = msg.gas - result.gas_left;
181
874k
    gas_left -= gas_used;
182
874k
    state.gas_refund += result.gas_refund;
183
874k
    return {EVMC_SUCCESS, gas_left};
184
875k
}
evmone::Result evmone::instr::core::call_impl<(evmone::Opcode)250>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
79
3.06M
{
80
3.06M
    static_assert(
81
3.06M
        Op == OP_CALL || Op == OP_CALLCODE || Op == OP_DELEGATECALL || Op == OP_STATICCALL);
82
83
3.06M
    const auto gas = stack.pop();
84
3.06M
    const auto dst = intx::be::trunc<evmc::address>(stack.pop());
85
3.06M
    const auto value = (Op == OP_STATICCALL || 
Op == OP_DELEGATECALL0
) ? 0 :
stack.pop()0
;
  MC/DC Decision Region (85:25) to (85:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (85:25)
+     Condition C2 --> (85:48)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
86
3.06M
    const auto has_value = value != 0;
87
3.06M
    const auto input_offset_u256 = stack.pop();
88
3.06M
    const auto input_size_u256 = stack.pop();
89
3.06M
    const auto output_offset_u256 = stack.pop();
90
3.06M
    const auto output_size_u256 = stack.pop();
91
92
3.06M
    stack.push(0);  // Assume failure.
93
3.06M
    state.return_data.clear();
94
95
3.06M
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(dst) == EVMC_ACCESS_COLD3.06M
)
  MC/DC Decision Region (95:9) to (95:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (95:9)
+     Condition C2 --> (95:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
96
20.0k
    {
97
20.0k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
98
168
            return {EVMC_OUT_OF_GAS, gas_left};
99
20.0k
    }
100
101
3.06M
    const auto target_addr_or_result = get_target_address(dst, gas_left, state);
102
3.06M
    if (const auto* result = std::get_if<Result>(&target_addr_or_result))
103
4
        return *result;
104
105
3.06M
    const auto& code_addr = std::get<evmc::address>(target_addr_or_result);
106
107
3.06M
    if (!check_memory(gas_left, state.memory, input_offset_u256, input_size_u256))
108
142
        return {EVMC_OUT_OF_GAS, gas_left};
109
110
3.06M
    if (!check_memory(gas_left, state.memory, output_offset_u256, output_size_u256))
111
66
        return {EVMC_OUT_OF_GAS, gas_left};
112
113
3.06M
    const auto input_offset = static_cast<size_t>(input_offset_u256);
114
3.06M
    const auto input_size = static_cast<size_t>(input_size_u256);
115
3.06M
    const auto output_offset = static_cast<size_t>(output_offset_u256);
116
3.06M
    const auto output_size = static_cast<size_t>(output_size_u256);
117
118
3.06M
    evmc_message msg{.kind = to_call_kind(Op)};
119
3.06M
    msg.flags = (Op == OP_STATICCALL) ? uint32_t{EVMC_STATIC} : 
state.msg->flags0
;
120
3.06M
    if (dst != code_addr)
121
102
        msg.flags |= EVMC_DELEGATED;
122
3.06M
    else
123
3.06M
        msg.flags &= ~std::underlying_type_t<evmc_flags>{EVMC_DELEGATED};
124
3.06M
    msg.depth = state.msg->depth + 1;
125
3.06M
    msg.recipient = (Op == OP_CALL || Op == OP_STATICCALL) ? dst : 
state.msg->recipient0
;
  MC/DC Decision Region (125:22) to (125:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (125:22)
+     Condition C2 --> (125:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
126
3.06M
    msg.code_address = code_addr;
127
3.06M
    msg.sender = (Op == OP_DELEGATECALL) ? 
state.msg->sender0
: state.msg->recipient;
128
3.06M
    msg.value =
129
3.06M
        (Op == OP_DELEGATECALL) ? 
state.msg->value0
: intx::be::store<evmc::uint256be>(value);
130
131
3.06M
    if (input_size > 0)
132
2.34M
    {
133
        // input_offset may be garbage if input_size == 0.
134
2.34M
        msg.input_data = &state.memory[input_offset];
135
2.34M
        msg.input_size = input_size;
136
2.34M
    }
137
138
3.06M
    auto cost = has_value ? 
CALL_VALUE_COST0
: 0;
139
140
    if constexpr (Op == OP_CALL)
141
    {
142
        if (has_value && state.in_static_mode())
143
            return {EVMC_STATIC_MODE_VIOLATION, gas_left};
144
145
        if ((has_value || state.rev < EVMC_SPURIOUS_DRAGON) && !state.host.account_exists(dst))
146
            cost += ACCOUNT_CREATION_COST;
147
    }
148
149
3.06M
    if ((gas_left -= cost) < 0)
150
0
        return {EVMC_OUT_OF_GAS, gas_left};
151
152
3.06M
    msg.gas = std::numeric_limits<int64_t>::max();
153
3.06M
    if (gas < msg.gas)
154
3.06M
        msg.gas = static_cast<int64_t>(gas);
155
156
3.06M
    if (state.rev >= EVMC_TANGERINE_WHISTLE)  // TODO: Always true for STATICCALL.
157
3.06M
        msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
158
0
    else if (msg.gas > gas_left)
159
0
        return {EVMC_OUT_OF_GAS, gas_left};
160
161
3.06M
    if (has_value)
162
0
    {
163
0
        msg.gas += 2300;  // Add stipend.
164
0
        gas_left += 2300;
165
0
    }
166
167
3.06M
    if (state.msg->depth >= 1024)
168
56
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
169
170
3.06M
    if (has_value && 
intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < value0
)
  MC/DC Decision Region (170:9) to (170:99)
+
+  Number of Conditions: 2
+     Condition C1 --> (170:9)
+     Condition C2 --> (170:22)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { C,  -  = F      }
+
+  C1-Pair: constant folded
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
171
0
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
172
173
3.06M
    const auto result = state.host.call(msg);
174
3.06M
    state.return_data.assign(result.output_data, result.output_size);
175
3.06M
    stack.top() = result.status_code == EVMC_SUCCESS;
176
177
3.06M
    if (const auto copy_size = std::min(output_size, result.output_size); copy_size > 0)
178
23.0k
        std::memcpy(&state.memory[output_offset], result.output_data, copy_size);
179
180
3.06M
    const auto gas_used = msg.gas - result.gas_left;
181
3.06M
    gas_left -= gas_used;
182
3.06M
    state.gas_refund += result.gas_refund;
183
3.06M
    return {EVMC_SUCCESS, gas_left};
184
3.06M
}
evmone::Result evmone::instr::core::call_impl<(evmone::Opcode)244>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
79
101k
{
80
101k
    static_assert(
81
101k
        Op == OP_CALL || Op == OP_CALLCODE || Op == OP_DELEGATECALL || Op == OP_STATICCALL);
82
83
101k
    const auto gas = stack.pop();
84
101k
    const auto dst = intx::be::trunc<evmc::address>(stack.pop());
85
101k
    const auto value = (Op == OP_STATICCALL || Op == OP_DELEGATECALL) ? 0 : 
stack.pop()0
;
  MC/DC Decision Region (85:25) to (85:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (85:25)
+     Condition C2 --> (85:48)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
86
101k
    const auto has_value = value != 0;
87
101k
    const auto input_offset_u256 = stack.pop();
88
101k
    const auto input_size_u256 = stack.pop();
89
101k
    const auto output_offset_u256 = stack.pop();
90
101k
    const auto output_size_u256 = stack.pop();
91
92
101k
    stack.push(0);  // Assume failure.
93
101k
    state.return_data.clear();
94
95
101k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(dst) == EVMC_ACCESS_COLD99.9k
)
  MC/DC Decision Region (95:9) to (95:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (95:9)
+     Condition C2 --> (95:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
96
30.9k
    {
97
30.9k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
98
168
            return {EVMC_OUT_OF_GAS, gas_left};
99
30.9k
    }
100
101
101k
    const auto target_addr_or_result = get_target_address(dst, gas_left, state);
102
101k
    if (const auto* result = std::get_if<Result>(&target_addr_or_result))
103
4
        return *result;
104
105
101k
    const auto& code_addr = std::get<evmc::address>(target_addr_or_result);
106
107
101k
    if (!check_memory(gas_left, state.memory, input_offset_u256, input_size_u256))
108
132
        return {EVMC_OUT_OF_GAS, gas_left};
109
110
101k
    if (!check_memory(gas_left, state.memory, output_offset_u256, output_size_u256))
111
72
        return {EVMC_OUT_OF_GAS, gas_left};
112
113
100k
    const auto input_offset = static_cast<size_t>(input_offset_u256);
114
100k
    const auto input_size = static_cast<size_t>(input_size_u256);
115
100k
    const auto output_offset = static_cast<size_t>(output_offset_u256);
116
100k
    const auto output_size = static_cast<size_t>(output_size_u256);
117
118
100k
    evmc_message msg{.kind = to_call_kind(Op)};
119
100k
    msg.flags = (Op == OP_STATICCALL) ? 
uint32_t{EVMC_STATIC}0
: state.msg->flags;
120
100k
    if (dst != code_addr)
121
150
        msg.flags |= EVMC_DELEGATED;
122
100k
    else
123
100k
        msg.flags &= ~std::underlying_type_t<evmc_flags>{EVMC_DELEGATED};
124
100k
    msg.depth = state.msg->depth + 1;
125
100k
    msg.recipient = (Op == OP_CALL || Op == OP_STATICCALL) ? 
dst0
: state.msg->recipient;
  MC/DC Decision Region (125:22) to (125:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (125:22)
+     Condition C2 --> (125:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
126
100k
    msg.code_address = code_addr;
127
100k
    msg.sender = (Op == OP_DELEGATECALL) ? state.msg->sender : 
state.msg->recipient0
;
128
100k
    msg.value =
129
100k
        (Op == OP_DELEGATECALL) ? state.msg->value : 
intx::be::store<evmc::uint256be>(value)0
;
130
131
100k
    if (input_size > 0)
132
41.5k
    {
133
        // input_offset may be garbage if input_size == 0.
134
41.5k
        msg.input_data = &state.memory[input_offset];
135
41.5k
        msg.input_size = input_size;
136
41.5k
    }
137
138
100k
    auto cost = has_value ? 
CALL_VALUE_COST0
: 0;
139
140
    if constexpr (Op == OP_CALL)
141
    {
142
        if (has_value && state.in_static_mode())
143
            return {EVMC_STATIC_MODE_VIOLATION, gas_left};
144
145
        if ((has_value || state.rev < EVMC_SPURIOUS_DRAGON) && !state.host.account_exists(dst))
146
            cost += ACCOUNT_CREATION_COST;
147
    }
148
149
100k
    if ((gas_left -= cost) < 0)
150
0
        return {EVMC_OUT_OF_GAS, gas_left};
151
152
100k
    msg.gas = std::numeric_limits<int64_t>::max();
153
100k
    if (gas < msg.gas)
154
100k
        msg.gas = static_cast<int64_t>(gas);
155
156
100k
    if (state.rev >= EVMC_TANGERINE_WHISTLE)  // TODO: Always true for STATICCALL.
157
100k
        msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
158
274
    else if (msg.gas > gas_left)
159
0
        return {EVMC_OUT_OF_GAS, gas_left};
160
161
100k
    if (has_value)
162
0
    {
163
0
        msg.gas += 2300;  // Add stipend.
164
0
        gas_left += 2300;
165
0
    }
166
167
100k
    if (state.msg->depth >= 1024)
168
28
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
169
170
100k
    if (has_value && 
intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < value0
)
  MC/DC Decision Region (170:9) to (170:99)
+
+  Number of Conditions: 2
+     Condition C1 --> (170:9)
+     Condition C2 --> (170:22)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { C,  -  = F      }
+
+  C1-Pair: constant folded
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
171
0
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
172
173
100k
    const auto result = state.host.call(msg);
174
100k
    state.return_data.assign(result.output_data, result.output_size);
175
100k
    stack.top() = result.status_code == EVMC_SUCCESS;
176
177
100k
    if (const auto copy_size = std::min(output_size, result.output_size); copy_size > 0)
178
4.16k
        std::memcpy(&state.memory[output_offset], result.output_data, copy_size);
179
180
100k
    const auto gas_used = msg.gas - result.gas_left;
181
100k
    gas_left -= gas_used;
182
100k
    state.gas_refund += result.gas_refund;
183
100k
    return {EVMC_SUCCESS, gas_left};
184
100k
}
evmone::Result evmone::instr::core::call_impl<(evmone::Opcode)242>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
79
82.9k
{
80
82.9k
    static_assert(
81
82.9k
        Op == OP_CALL || Op == OP_CALLCODE || Op == OP_DELEGATECALL || Op == OP_STATICCALL);
82
83
82.9k
    const auto gas = stack.pop();
84
82.9k
    const auto dst = intx::be::trunc<evmc::address>(stack.pop());
85
82.9k
    const auto value = (Op == OP_STATICCALL || Op == OP_DELEGATECALL) ? 
00
: stack.pop();
  MC/DC Decision Region (85:25) to (85:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (85:25)
+     Condition C2 --> (85:48)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
86
82.9k
    const auto has_value = value != 0;
87
82.9k
    const auto input_offset_u256 = stack.pop();
88
82.9k
    const auto input_size_u256 = stack.pop();
89
82.9k
    const auto output_offset_u256 = stack.pop();
90
82.9k
    const auto output_size_u256 = stack.pop();
91
92
82.9k
    stack.push(0);  // Assume failure.
93
82.9k
    state.return_data.clear();
94
95
82.9k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(dst) == EVMC_ACCESS_COLD80.8k
)
  MC/DC Decision Region (95:9) to (95:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (95:9)
+     Condition C2 --> (95:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
96
31.4k
    {
97
31.4k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
98
360
            return {EVMC_OUT_OF_GAS, gas_left};
99
31.4k
    }
100
101
82.6k
    const auto target_addr_or_result = get_target_address(dst, gas_left, state);
102
82.6k
    if (const auto* result = std::get_if<Result>(&target_addr_or_result))
103
4
        return *result;
104
105
82.6k
    const auto& code_addr = std::get<evmc::address>(target_addr_or_result);
106
107
82.6k
    if (!check_memory(gas_left, state.memory, input_offset_u256, input_size_u256))
108
168
        return {EVMC_OUT_OF_GAS, gas_left};
109
110
82.4k
    if (!check_memory(gas_left, state.memory, output_offset_u256, output_size_u256))
111
66
        return {EVMC_OUT_OF_GAS, gas_left};
112
113
82.3k
    const auto input_offset = static_cast<size_t>(input_offset_u256);
114
82.3k
    const auto input_size = static_cast<size_t>(input_size_u256);
115
82.3k
    const auto output_offset = static_cast<size_t>(output_offset_u256);
116
82.3k
    const auto output_size = static_cast<size_t>(output_size_u256);
117
118
82.3k
    evmc_message msg{.kind = to_call_kind(Op)};
119
82.3k
    msg.flags = (Op == OP_STATICCALL) ? 
uint32_t{EVMC_STATIC}0
: state.msg->flags;
120
82.3k
    if (dst != code_addr)
121
110
        msg.flags |= EVMC_DELEGATED;
122
82.2k
    else
123
82.2k
        msg.flags &= ~std::underlying_type_t<evmc_flags>{EVMC_DELEGATED};
124
82.3k
    msg.depth = state.msg->depth + 1;
125
82.3k
    msg.recipient = (Op == OP_CALL || Op == OP_STATICCALL) ? 
dst0
: state.msg->recipient;
  MC/DC Decision Region (125:22) to (125:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (125:22)
+     Condition C2 --> (125:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
126
82.3k
    msg.code_address = code_addr;
127
82.3k
    msg.sender = (Op == OP_DELEGATECALL) ? 
state.msg->sender0
: state.msg->recipient;
128
82.3k
    msg.value =
129
82.3k
        (Op == OP_DELEGATECALL) ? 
state.msg->value0
: intx::be::store<evmc::uint256be>(value);
130
131
82.3k
    if (input_size > 0)
132
47.6k
    {
133
        // input_offset may be garbage if input_size == 0.
134
47.6k
        msg.input_data = &state.memory[input_offset];
135
47.6k
        msg.input_size = input_size;
136
47.6k
    }
137
138
82.3k
    auto cost = has_value ? 
CALL_VALUE_COST10.2k
:
072.1k
;
139
140
    if constexpr (Op == OP_CALL)
141
    {
142
        if (has_value && state.in_static_mode())
143
            return {EVMC_STATIC_MODE_VIOLATION, gas_left};
144
145
        if ((has_value || state.rev < EVMC_SPURIOUS_DRAGON) && !state.host.account_exists(dst))
146
            cost += ACCOUNT_CREATION_COST;
147
    }
148
149
82.3k
    if ((gas_left -= cost) < 0)
150
24
        return {EVMC_OUT_OF_GAS, gas_left};
151
152
82.3k
    msg.gas = std::numeric_limits<int64_t>::max();
153
82.3k
    if (gas < msg.gas)
154
82.1k
        msg.gas = static_cast<int64_t>(gas);
155
156
82.3k
    if (state.rev >= EVMC_TANGERINE_WHISTLE)  // TODO: Always true for STATICCALL.
157
81.7k
        msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
158
616
    else if (msg.gas > gas_left)
159
0
        return {EVMC_OUT_OF_GAS, gas_left};
160
161
82.3k
    if (has_value)
162
10.2k
    {
163
10.2k
        msg.gas += 2300;  // Add stipend.
164
10.2k
        gas_left += 2300;
165
10.2k
    }
166
167
82.3k
    if (state.msg->depth >= 1024)
168
4
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
169
170
82.3k
    if (has_value && 
intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < value10.2k
)
  MC/DC Decision Region (170:9) to (170:99)
+
+  Number of Conditions: 2
+     Condition C1 --> (170:9)
+     Condition C2 --> (170:22)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
171
134
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
172
173
82.2k
    const auto result = state.host.call(msg);
174
82.2k
    state.return_data.assign(result.output_data, result.output_size);
175
82.2k
    stack.top() = result.status_code == EVMC_SUCCESS;
176
177
82.2k
    if (const auto copy_size = std::min(output_size, result.output_size); copy_size > 0)
178
9.27k
        std::memcpy(&state.memory[output_offset], result.output_data, copy_size);
179
180
82.2k
    const auto gas_used = msg.gas - result.gas_left;
181
82.2k
    gas_left -= gas_used;
182
82.2k
    state.gas_refund += result.gas_refund;
183
82.2k
    return {EVMC_SUCCESS, gas_left};
184
82.3k
}
185
186
template Result call_impl<OP_CALL>(
187
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
188
template Result call_impl<OP_STATICCALL>(
189
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
190
template Result call_impl<OP_DELEGATECALL>(
191
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
192
template Result call_impl<OP_CALLCODE>(
193
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
194
195
template <Opcode Op>
196
Result extcall_impl(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
197
0
{
198
0
    static_assert(Op == OP_EXTCALL || Op == OP_EXTDELEGATECALL || Op == OP_EXTSTATICCALL);
199
200
0
    const auto dst_u256 = stack.pop();
201
0
    const auto input_offset_u256 = stack.pop();
202
0
    const auto input_size_u256 = stack.pop();
203
0
    const auto value = (Op == OP_EXTSTATICCALL || Op == OP_EXTDELEGATECALL) ? 0 : stack.pop();
  MC/DC Decision Region (203:25) to (203:75)
+
+  Number of Conditions: 2
+     Condition C1 --> (203:25)
+     Condition C2 --> (203:51)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (203:25) to (203:75)
+
+  Number of Conditions: 2
+     Condition C1 --> (203:25)
+     Condition C2 --> (203:51)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (203:25) to (203:75)
+
+  Number of Conditions: 2
+     Condition C1 --> (203:25)
+     Condition C2 --> (203:51)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
204
0
    const auto has_value = value != 0;
205
206
0
    stack.push(EXTCALL_ABORT);  // Assume (hard) failure.
207
0
    state.return_data.clear();
208
209
    // Address space expansion ready check.
210
0
    static constexpr auto ADDRESS_MAX = (uint256{1} << 160) - 1;
211
0
    if (dst_u256 > ADDRESS_MAX)
212
0
        return {EVMC_ARGUMENT_OUT_OF_RANGE, gas_left};
213
214
0
    const auto dst = intx::be::trunc<evmc::address>(dst_u256);
215
216
0
    if (state.host.access_account(dst) == EVMC_ACCESS_COLD)
217
0
    {
218
0
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
219
0
            return {EVMC_OUT_OF_GAS, gas_left};
220
0
    }
221
222
0
    const auto target_addr_or_result = get_target_address(dst, gas_left, state);
223
0
    if (const auto* result = std::get_if<Result>(&target_addr_or_result))
224
0
        return *result;
225
226
0
    const auto& code_addr = std::get<evmc::address>(target_addr_or_result);
227
228
0
    if (!check_memory(gas_left, state.memory, input_offset_u256, input_size_u256))
229
0
        return {EVMC_OUT_OF_GAS, gas_left};
230
231
0
    const auto input_offset = static_cast<size_t>(input_offset_u256);
232
0
    const auto input_size = static_cast<size_t>(input_size_u256);
233
234
0
    evmc_message msg{.kind = to_call_kind(Op)};
235
0
    msg.flags = (Op == OP_EXTSTATICCALL) ? uint32_t{EVMC_STATIC} : state.msg->flags;
236
0
    if (dst != code_addr)
237
0
        msg.flags |= EVMC_DELEGATED;
238
0
    else
239
0
        msg.flags &= ~std::underlying_type_t<evmc_flags>{EVMC_DELEGATED};
240
0
    msg.depth = state.msg->depth + 1;
241
0
    msg.recipient = (Op != OP_EXTDELEGATECALL) ? dst : state.msg->recipient;
242
0
    msg.code_address = code_addr;
243
0
    msg.sender = (Op == OP_EXTDELEGATECALL) ? state.msg->sender : state.msg->recipient;
244
0
    msg.value =
245
0
        (Op == OP_EXTDELEGATECALL) ? state.msg->value : intx::be::store<evmc::uint256be>(value);
246
247
0
    if (input_size > 0)
248
0
    {
249
        // input_offset may be garbage if input_size == 0.
250
0
        msg.input_data = &state.memory[input_offset];
251
0
        msg.input_size = input_size;
252
0
    }
253
254
0
    auto cost = has_value ? CALL_VALUE_COST : 0;
255
256
    if constexpr (Op == OP_EXTCALL)
257
0
    {
258
0
        if (has_value && state.in_static_mode())
  MC/DC Decision Region (258:13) to (258:48)
+
+  Number of Conditions: 2
+     Condition C1 --> (258:13)
+     Condition C2 --> (258:26)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
259
0
            return {EVMC_STATIC_MODE_VIOLATION, gas_left};
260
261
0
        if (has_value && !state.host.account_exists(dst))
  MC/DC Decision Region (261:13) to (261:57)
+
+  Number of Conditions: 2
+     Condition C1 --> (261:13)
+     Condition C2 --> (261:26)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
262
0
            cost += ACCOUNT_CREATION_COST;
263
0
    }
264
265
0
    if ((gas_left -= cost) < 0)
266
0
        return {EVMC_OUT_OF_GAS, gas_left};
267
268
0
    msg.gas = gas_left - std::max(gas_left / 64, MIN_RETAINED_GAS);
269
270
0
    if (msg.gas < MIN_CALLEE_GAS || state.msg->depth >= 1024 ||
271
0
        (has_value &&
272
0
            intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < value))
  MC/DC Decision Region (270:9) to (272:91)
+
+  Number of Conditions: 4
+     Condition C1 --> (270:9)
+     Condition C2 --> (270:37)
+     Condition C3 --> (271:10)
+     Condition C4 --> (272:13)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  C3-Pair: not covered
+  C4-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (270:9) to (272:91)
+
+  Number of Conditions: 4
+     Condition C1 --> (270:9)
+     Condition C2 --> (270:37)
+     Condition C3 --> (271:10)
+     Condition C4 --> (272:13)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  C3-Pair: constant folded
+  C4-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (270:9) to (272:91)
+
+  Number of Conditions: 4
+     Condition C1 --> (270:9)
+     Condition C2 --> (270:37)
+     Condition C3 --> (271:10)
+     Condition C4 --> (272:13)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  C3-Pair: constant folded
+  C4-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
273
0
    {
274
0
        stack.top() = EXTCALL_REVERT;
275
0
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
276
0
    }
277
278
    if constexpr (Op == OP_EXTDELEGATECALL)
279
0
    {
280
        // The code targeted by EXTDELEGATECALL must also be an EOF.
281
        // This restriction has been added to EIP-3540 in
282
        // https://github.com/ethereum/EIPs/pull/7131
283
0
        uint8_t target_code_prefix[2];
284
0
        const auto s = state.host.copy_code(
285
0
            msg.code_address, 0, target_code_prefix, std::size(target_code_prefix));
286
0
        if (!is_eof_container({target_code_prefix, s}))
287
0
        {
288
0
            stack.top() = EXTCALL_REVERT;
289
0
            return {EVMC_SUCCESS, gas_left};  // "Light" failure.
290
0
        }
291
0
    }
292
293
0
    const auto result = state.host.call(msg);
294
0
    state.return_data.assign(result.output_data, result.output_size);
295
0
    if (result.status_code == EVMC_SUCCESS)
296
0
        stack.top() = EXTCALL_SUCCESS;
297
0
    else if (result.status_code == EVMC_REVERT)
298
0
        stack.top() = EXTCALL_REVERT;
299
0
    else
300
0
        stack.top() = EXTCALL_ABORT;
301
302
0
    const auto gas_used = msg.gas - result.gas_left;
303
0
    gas_left -= gas_used;
304
0
    state.gas_refund += result.gas_refund;
305
0
    return {EVMC_SUCCESS, gas_left};
306
0
}
Unexecuted instantiation: evmone::Result evmone::instr::core::extcall_impl<(evmone::Opcode)248>(evmone::StackTop, long, evmone::ExecutionState&)
Unexecuted instantiation: evmone::Result evmone::instr::core::extcall_impl<(evmone::Opcode)251>(evmone::StackTop, long, evmone::ExecutionState&)
Unexecuted instantiation: evmone::Result evmone::instr::core::extcall_impl<(evmone::Opcode)249>(evmone::StackTop, long, evmone::ExecutionState&)
307
308
template Result extcall_impl<OP_EXTCALL>(
309
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
310
template Result extcall_impl<OP_EXTSTATICCALL>(
311
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
312
template Result extcall_impl<OP_EXTDELEGATECALL>(
313
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
314
315
template <Opcode Op>
316
Result create_impl(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
317
46.9k
{
318
46.9k
    static_assert(Op == OP_CREATE || Op == OP_CREATE2);
319
320
46.9k
    if (state.in_static_mode())
321
62
        return {EVMC_STATIC_MODE_VIOLATION, gas_left};
322
323
46.9k
    const auto endowment = stack.pop();
324
46.9k
    const auto init_code_offset_u256 = stack.pop();
325
46.9k
    const auto init_code_size_u256 = stack.pop();
326
46.9k
    const auto salt = (Op == OP_CREATE2) ? 
stack.pop()25.0k
:
uint256{}21.9k
;
327
328
46.9k
    stack.push(0);  // Assume failure.
329
46.9k
    state.return_data.clear();
330
331
46.9k
    if (!check_memory(gas_left, state.memory, init_code_offset_u256, init_code_size_u256))
332
246
        return {EVMC_OUT_OF_GAS, gas_left};
333
334
46.6k
    const auto init_code_offset = static_cast<size_t>(init_code_offset_u256);
335
46.6k
    const auto init_code_size = static_cast<size_t>(init_code_size_u256);
336
337
46.6k
    if (state.rev >= EVMC_SHANGHAI && 
init_code_size > 0xC00037.4k
)
  MC/DC Decision Region (337:9) to (337:62)
+
+  Number of Conditions: 2
+     Condition C1 --> (337:9)
+     Condition C2 --> (337:39)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
  MC/DC Decision Region (337:9) to (337:62)
+
+  Number of Conditions: 2
+     Condition C1 --> (337:9)
+     Condition C2 --> (337:39)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
338
56
        return {EVMC_OUT_OF_GAS, gas_left};
339
340
46.6k
    const auto init_code_word_cost = 6 * (Op == OP_CREATE2) + 2 * (state.rev >= EVMC_SHANGHAI);
341
46.6k
    const auto init_code_cost = num_words(init_code_size) * init_code_word_cost;
342
46.6k
    if ((gas_left -= init_code_cost) < 0)
343
60
        return {EVMC_OUT_OF_GAS, gas_left};
344
345
46.5k
    if (state.msg->depth >= 1024)
346
12
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
347
348
46.5k
    if (endowment != 0 &&
349
46.5k
        
intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < endowment4.48k
)
  MC/DC Decision Region (348:9) to (349:90)
+
+  Number of Conditions: 2
+     Condition C1 --> (348:9)
+     Condition C2 --> (349:9)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
  MC/DC Decision Region (348:9) to (349:90)
+
+  Number of Conditions: 2
+     Condition C1 --> (348:9)
+     Condition C2 --> (349:9)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
350
72
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
351
352
46.4k
    evmc_message msg{.kind = to_call_kind(Op)};
353
46.4k
    msg.gas = gas_left;
354
46.4k
    if (state.rev >= EVMC_TANGERINE_WHISTLE)
355
45.2k
        msg.gas = msg.gas - msg.gas / 64;
356
357
46.4k
    if (init_code_size > 0)
358
45.8k
    {
359
        // init_code_offset may be garbage if init_code_size == 0.
360
45.8k
        msg.input_data = &state.memory[init_code_offset];
361
45.8k
        msg.input_size = init_code_size;
362
363
45.8k
        if (state.rev >= EVMC_EXPERIMENTAL)
364
0
        {
365
            // EOF initcode is not allowed for legacy creation
366
0
            if (is_eof_container({msg.input_data, msg.input_size}))
367
0
                return {EVMC_SUCCESS, gas_left};  // "Light" failure.
368
0
        }
369
45.8k
    }
370
46.4k
    msg.sender = state.msg->recipient;
371
46.4k
    msg.depth = state.msg->depth + 1;
372
46.4k
    msg.create2_salt = intx::be::store<evmc::bytes32>(salt);
373
46.4k
    msg.value = intx::be::store<evmc::uint256be>(endowment);
374
375
46.4k
    const auto result = state.host.call(msg);
376
46.4k
    gas_left -= msg.gas - result.gas_left;
377
46.4k
    state.gas_refund += result.gas_refund;
378
379
46.4k
    state.return_data.assign(result.output_data, result.output_size);
380
46.4k
    if (result.status_code == EVMC_SUCCESS)
381
44.6k
        stack.top() = intx::be::load<uint256>(result.create_address);
382
383
46.4k
    return {EVMC_SUCCESS, gas_left};
384
46.4k
}
evmone::Result evmone::instr::core::create_impl<(evmone::Opcode)240>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
317
21.9k
{
318
21.9k
    static_assert(Op == OP_CREATE || Op == OP_CREATE2);
319
320
21.9k
    if (state.in_static_mode())
321
44
        return {EVMC_STATIC_MODE_VIOLATION, gas_left};
322
323
21.9k
    const auto endowment = stack.pop();
324
21.9k
    const auto init_code_offset_u256 = stack.pop();
325
21.9k
    const auto init_code_size_u256 = stack.pop();
326
21.9k
    const auto salt = (Op == OP_CREATE2) ? 
stack.pop()0
: uint256{};
327
328
21.9k
    stack.push(0);  // Assume failure.
329
21.9k
    state.return_data.clear();
330
331
21.9k
    if (!check_memory(gas_left, state.memory, init_code_offset_u256, init_code_size_u256))
332
138
        return {EVMC_OUT_OF_GAS, gas_left};
333
334
21.7k
    const auto init_code_offset = static_cast<size_t>(init_code_offset_u256);
335
21.7k
    const auto init_code_size = static_cast<size_t>(init_code_size_u256);
336
337
21.7k
    if (state.rev >= EVMC_SHANGHAI && 
init_code_size > 0xC00016.1k
)
  MC/DC Decision Region (337:9) to (337:62)
+
+  Number of Conditions: 2
+     Condition C1 --> (337:9)
+     Condition C2 --> (337:39)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
338
34
        return {EVMC_OUT_OF_GAS, gas_left};
339
340
21.7k
    const auto init_code_word_cost = 6 * (Op == OP_CREATE2) + 2 * (state.rev >= EVMC_SHANGHAI);
341
21.7k
    const auto init_code_cost = num_words(init_code_size) * init_code_word_cost;
342
21.7k
    if ((gas_left -= init_code_cost) < 0)
343
24
        return {EVMC_OUT_OF_GAS, gas_left};
344
345
21.7k
    if (state.msg->depth >= 1024)
346
4
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
347
348
21.7k
    if (endowment != 0 &&
349
21.7k
        
intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < endowment2.45k
)
  MC/DC Decision Region (348:9) to (349:90)
+
+  Number of Conditions: 2
+     Condition C1 --> (348:9)
+     Condition C2 --> (349:9)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
350
60
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
351
352
21.6k
    evmc_message msg{.kind = to_call_kind(Op)};
353
21.6k
    msg.gas = gas_left;
354
21.6k
    if (state.rev >= EVMC_TANGERINE_WHISTLE)
355
20.3k
        msg.gas = msg.gas - msg.gas / 64;
356
357
21.6k
    if (init_code_size > 0)
358
21.4k
    {
359
        // init_code_offset may be garbage if init_code_size == 0.
360
21.4k
        msg.input_data = &state.memory[init_code_offset];
361
21.4k
        msg.input_size = init_code_size;
362
363
21.4k
        if (state.rev >= EVMC_EXPERIMENTAL)
364
0
        {
365
            // EOF initcode is not allowed for legacy creation
366
0
            if (is_eof_container({msg.input_data, msg.input_size}))
367
0
                return {EVMC_SUCCESS, gas_left};  // "Light" failure.
368
0
        }
369
21.4k
    }
370
21.6k
    msg.sender = state.msg->recipient;
371
21.6k
    msg.depth = state.msg->depth + 1;
372
21.6k
    msg.create2_salt = intx::be::store<evmc::bytes32>(salt);
373
21.6k
    msg.value = intx::be::store<evmc::uint256be>(endowment);
374
375
21.6k
    const auto result = state.host.call(msg);
376
21.6k
    gas_left -= msg.gas - result.gas_left;
377
21.6k
    state.gas_refund += result.gas_refund;
378
379
21.6k
    state.return_data.assign(result.output_data, result.output_size);
380
21.6k
    if (result.status_code == EVMC_SUCCESS)
381
20.7k
        stack.top() = intx::be::load<uint256>(result.create_address);
382
383
21.6k
    return {EVMC_SUCCESS, gas_left};
384
21.6k
}
evmone::Result evmone::instr::core::create_impl<(evmone::Opcode)245>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
317
25.0k
{
318
25.0k
    static_assert(Op == OP_CREATE || Op == OP_CREATE2);
319
320
25.0k
    if (state.in_static_mode())
321
18
        return {EVMC_STATIC_MODE_VIOLATION, gas_left};
322
323
25.0k
    const auto endowment = stack.pop();
324
25.0k
    const auto init_code_offset_u256 = stack.pop();
325
25.0k
    const auto init_code_size_u256 = stack.pop();
326
25.0k
    const auto salt = (Op == OP_CREATE2) ? stack.pop() : 
uint256{}0
;
327
328
25.0k
    stack.push(0);  // Assume failure.
329
25.0k
    state.return_data.clear();
330
331
25.0k
    if (!check_memory(gas_left, state.memory, init_code_offset_u256, init_code_size_u256))
332
108
        return {EVMC_OUT_OF_GAS, gas_left};
333
334
24.8k
    const auto init_code_offset = static_cast<size_t>(init_code_offset_u256);
335
24.8k
    const auto init_code_size = static_cast<size_t>(init_code_size_u256);
336
337
24.8k
    if (state.rev >= EVMC_SHANGHAI && 
init_code_size > 0xC00021.2k
)
  MC/DC Decision Region (337:9) to (337:62)
+
+  Number of Conditions: 2
+     Condition C1 --> (337:9)
+     Condition C2 --> (337:39)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
338
22
        return {EVMC_OUT_OF_GAS, gas_left};
339
340
24.8k
    const auto init_code_word_cost = 6 * (Op == OP_CREATE2) + 2 * (state.rev >= EVMC_SHANGHAI);
341
24.8k
    const auto init_code_cost = num_words(init_code_size) * init_code_word_cost;
342
24.8k
    if ((gas_left -= init_code_cost) < 0)
343
36
        return {EVMC_OUT_OF_GAS, gas_left};
344
345
24.8k
    if (state.msg->depth >= 1024)
346
8
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
347
348
24.8k
    if (endowment != 0 &&
349
24.8k
        
intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < endowment2.03k
)
  MC/DC Decision Region (348:9) to (349:90)
+
+  Number of Conditions: 2
+     Condition C1 --> (348:9)
+     Condition C2 --> (349:9)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
350
12
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
351
352
24.8k
    evmc_message msg{.kind = to_call_kind(Op)};
353
24.8k
    msg.gas = gas_left;
354
24.8k
    if (state.rev >= EVMC_TANGERINE_WHISTLE)
355
24.8k
        msg.gas = msg.gas - msg.gas / 64;
356
357
24.8k
    if (init_code_size > 0)
358
24.4k
    {
359
        // init_code_offset may be garbage if init_code_size == 0.
360
24.4k
        msg.input_data = &state.memory[init_code_offset];
361
24.4k
        msg.input_size = init_code_size;
362
363
24.4k
        if (state.rev >= EVMC_EXPERIMENTAL)
364
0
        {
365
            // EOF initcode is not allowed for legacy creation
366
0
            if (is_eof_container({msg.input_data, msg.input_size}))
367
0
                return {EVMC_SUCCESS, gas_left};  // "Light" failure.
368
0
        }
369
24.4k
    }
370
24.8k
    msg.sender = state.msg->recipient;
371
24.8k
    msg.depth = state.msg->depth + 1;
372
24.8k
    msg.create2_salt = intx::be::store<evmc::bytes32>(salt);
373
24.8k
    msg.value = intx::be::store<evmc::uint256be>(endowment);
374
375
24.8k
    const auto result = state.host.call(msg);
376
24.8k
    gas_left -= msg.gas - result.gas_left;
377
24.8k
    state.gas_refund += result.gas_refund;
378
379
24.8k
    state.return_data.assign(result.output_data, result.output_size);
380
24.8k
    if (result.status_code == EVMC_SUCCESS)
381
23.9k
        stack.top() = intx::be::load<uint256>(result.create_address);
382
383
24.8k
    return {EVMC_SUCCESS, gas_left};
384
24.8k
}
385
386
template <Opcode Op>
387
Result create_eof_impl(
388
    StackTop stack, int64_t gas_left, ExecutionState& state, code_iterator& pos) noexcept
389
0
{
390
0
    static_assert(Op == OP_EOFCREATE || Op == OP_TXCREATE);
391
392
0
    if (state.in_static_mode())
393
0
        return {EVMC_STATIC_MODE_VIOLATION, gas_left};
394
395
0
    const auto initcode_hash =
396
0
        (Op == OP_TXCREATE) ? intx::be::store<evmc::bytes32>(stack.pop()) : evmc::bytes32{};
397
0
    const auto salt = stack.pop();
398
0
    const auto input_offset_u256 = stack.pop();
399
0
    const auto input_size_u256 = stack.pop();
400
0
    const auto endowment = stack.pop();
401
402
0
    stack.push(0);  // Assume failure.
403
0
    state.return_data.clear();
404
405
0
    if (!check_memory(gas_left, state.memory, input_offset_u256, input_size_u256))
406
0
        return {EVMC_OUT_OF_GAS, gas_left};
407
408
0
    constexpr auto pos_advance = (Op == OP_EOFCREATE ? 2 : 1);
409
0
    pos += pos_advance;
410
411
0
    if (state.msg->depth >= 1024)
412
0
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
413
414
0
    if (endowment != 0 &&
415
0
        intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < endowment)
  MC/DC Decision Region (414:9) to (415:90)
+
+  Number of Conditions: 2
+     Condition C1 --> (414:9)
+     Condition C2 --> (415:9)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (414:9) to (415:90)
+
+  Number of Conditions: 2
+     Condition C1 --> (414:9)
+     Condition C2 --> (415:9)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
416
0
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
417
418
0
    bytes_view initcontainer;
419
    if constexpr (Op == OP_EOFCREATE)
420
0
    {
421
0
        const auto initcontainer_index = pos[-1];
422
0
        const auto& container = state.original_code;
423
0
        const auto& eof_header = state.analysis.baseline->eof_header();
424
0
        initcontainer = eof_header.get_container(container, initcontainer_index);
425
    }
426
    else
427
0
    {
428
0
        auto* tx_initcode = state.get_tx_initcode_by_hash(initcode_hash);
429
        // In case initcode was not found, nullptr was returned.
430
0
        if (tx_initcode == nullptr)
431
0
            return {EVMC_SUCCESS, gas_left};  // "Light" failure
432
0
        initcontainer = tx_initcode->code;
433
434
0
        if (!tx_initcode->is_valid.has_value())
435
0
        {
436
0
            const auto error_subcont =
437
0
                validate_eof(state.rev, ContainerKind::initcode, initcontainer);
438
0
            tx_initcode->is_valid = (error_subcont == EOFValidationError::success);
439
0
        }
440
441
0
        if (!*tx_initcode->is_valid)
442
0
            return {EVMC_SUCCESS, gas_left};  // "Light" failure.
443
0
    }
444
445
0
    const auto input_offset = static_cast<size_t>(input_offset_u256);
446
0
    const auto input_size = static_cast<size_t>(input_size_u256);
447
448
0
    evmc_message msg{.kind = to_call_kind(Op)};
449
0
    msg.gas = gas_left - gas_left / 64;
450
0
    if (input_size > 0)
451
0
    {
452
        // input_data may be garbage if init_code_size == 0.
453
0
        msg.input_data = &state.memory[input_offset];
454
0
        msg.input_size = input_size;
455
0
    }
456
457
0
    msg.sender = state.msg->recipient;
458
0
    msg.depth = state.msg->depth + 1;
459
0
    msg.create2_salt = intx::be::store<evmc::bytes32>(salt);
460
0
    msg.value = intx::be::store<evmc::uint256be>(endowment);
461
    // init_code is guaranteed to be non-empty by validation of container sections
462
0
    msg.code = initcontainer.data();
463
0
    msg.code_size = initcontainer.size();
464
465
0
    const auto result = state.host.call(msg);
466
0
    gas_left -= msg.gas - result.gas_left;
467
0
    state.gas_refund += result.gas_refund;
468
469
0
    state.return_data.assign(result.output_data, result.output_size);
470
0
    if (result.status_code == EVMC_SUCCESS)
471
0
        stack.top() = intx::be::load<uint256>(result.create_address);
472
473
0
    return {EVMC_SUCCESS, gas_left};
474
0
}
Unexecuted instantiation: evmone::Result evmone::instr::core::create_eof_impl<(evmone::Opcode)236>(evmone::StackTop, long, evmone::ExecutionState&, unsigned char const*&)
Unexecuted instantiation: evmone::Result evmone::instr::core::create_eof_impl<(evmone::Opcode)237>(evmone::StackTop, long, evmone::ExecutionState&, unsigned char const*&)
475
476
template Result create_impl<OP_CREATE>(
477
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
478
template Result create_impl<OP_CREATE2>(
479
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
480
template Result create_eof_impl<OP_EOFCREATE>(
481
    StackTop stack, int64_t gas_left, ExecutionState& state, code_iterator& pos) noexcept;
482
template Result create_eof_impl<OP_TXCREATE>(
483
    StackTop stack, int64_t gas_left, ExecutionState& state, code_iterator& pos) noexcept;
484
}  // namespace evmone::instr::core
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions_storage.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions_storage.cpp.html new file mode 100644 index 0000000000..6538339f57 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions_storage.cpp.html @@ -0,0 +1,49 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone/instructions_storage.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2019 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "instructions.hpp"
6
7
namespace evmone::instr::core
8
{
9
namespace
10
{
11
/// The gas cost specification for storage instructions.
12
struct StorageCostSpec
13
{
14
    bool net_cost;        ///< Is this net gas cost metering schedule?
15
    int16_t warm_access;  ///< Storage warm access cost, YP: G_{warmaccess}
16
    int16_t set;          ///< Storage addition cost, YP: G_{sset}
17
    int16_t reset;        ///< Storage modification cost, YP: G_{sreset}
18
    int16_t clear;        ///< Storage deletion refund, YP: R_{sclear}
19
};
20
21
/// Table of gas cost specification for storage instructions per EVM revision.
22
/// TODO: This can be moved to instruction traits and be used in other places: e.g.
23
///       SLOAD cost, replacement for warm_storage_read_cost.
24
constexpr auto storage_cost_spec = []() noexcept {
25
    std::array<StorageCostSpec, EVMC_MAX_REVISION + 1> tbl{};
26
27
    // Legacy cost schedule.
28
    for (auto rev : {EVMC_FRONTIER, EVMC_HOMESTEAD, EVMC_TANGERINE_WHISTLE, EVMC_SPURIOUS_DRAGON,
29
             EVMC_BYZANTIUM, EVMC_PETERSBURG})
30
        tbl[rev] = {false, 200, 20000, 5000, 15000};
31
32
    // Net cost schedule.
33
    tbl[EVMC_CONSTANTINOPLE] = {true, 200, 20000, 5000, 15000};
34
    tbl[EVMC_ISTANBUL] = {true, 800, 20000, 5000, 15000};
35
    tbl[EVMC_BERLIN] = {
36
        true, instr::warm_storage_read_cost, 20000, 5000 - instr::cold_sload_cost, 15000};
37
    tbl[EVMC_LONDON] = {
38
        true, instr::warm_storage_read_cost, 20000, 5000 - instr::cold_sload_cost, 4800};
39
    tbl[EVMC_PARIS] = tbl[EVMC_LONDON];
40
    tbl[EVMC_SHANGHAI] = tbl[EVMC_LONDON];
41
    tbl[EVMC_CANCUN] = tbl[EVMC_LONDON];
42
    tbl[EVMC_PRAGUE] = tbl[EVMC_LONDON];
43
    tbl[EVMC_OSAKA] = tbl[EVMC_LONDON];
44
    tbl[EVMC_EXPERIMENTAL] = tbl[EVMC_LONDON];
45
    return tbl;
46
}();
47
48
49
struct StorageStoreCost
50
{
51
    int16_t gas_cost;
52
    int16_t gas_refund;
53
};
54
55
// The lookup table of SSTORE costs by the storage update status.
56
constexpr auto sstore_costs = []() noexcept {
57
    std::array<std::array<StorageStoreCost, EVMC_STORAGE_MODIFIED_RESTORED + 1>,
58
        EVMC_MAX_REVISION + 1>
59
        tbl{};
60
61
    for (size_t rev = EVMC_FRONTIER; rev <= EVMC_MAX_REVISION; ++rev)
62
    {
63
        auto& e = tbl[rev];
64
        if (const auto c = storage_cost_spec[rev]; !c.net_cost)  // legacy
65
        {
66
            e[EVMC_STORAGE_ADDED] = {c.set, 0};
67
            e[EVMC_STORAGE_DELETED] = {c.reset, c.clear};
68
            e[EVMC_STORAGE_MODIFIED] = {c.reset, 0};
69
            e[EVMC_STORAGE_ASSIGNED] = e[EVMC_STORAGE_MODIFIED];
70
            e[EVMC_STORAGE_DELETED_ADDED] = e[EVMC_STORAGE_ADDED];
71
            e[EVMC_STORAGE_MODIFIED_DELETED] = e[EVMC_STORAGE_DELETED];
72
            e[EVMC_STORAGE_DELETED_RESTORED] = e[EVMC_STORAGE_ADDED];
73
            e[EVMC_STORAGE_ADDED_DELETED] = e[EVMC_STORAGE_DELETED];
74
            e[EVMC_STORAGE_MODIFIED_RESTORED] = e[EVMC_STORAGE_MODIFIED];
75
        }
76
        else  // net cost
77
        {
78
            e[EVMC_STORAGE_ASSIGNED] = {c.warm_access, 0};
79
            e[EVMC_STORAGE_ADDED] = {c.set, 0};
80
            e[EVMC_STORAGE_DELETED] = {c.reset, c.clear};
81
            e[EVMC_STORAGE_MODIFIED] = {c.reset, 0};
82
            e[EVMC_STORAGE_DELETED_ADDED] = {c.warm_access, static_cast<int16_t>(-c.clear)};
83
            e[EVMC_STORAGE_MODIFIED_DELETED] = {c.warm_access, c.clear};
84
            e[EVMC_STORAGE_DELETED_RESTORED] = {
85
                c.warm_access, static_cast<int16_t>(c.reset - c.warm_access - c.clear)};
86
            e[EVMC_STORAGE_ADDED_DELETED] = {
87
                c.warm_access, static_cast<int16_t>(c.set - c.warm_access)};
88
            e[EVMC_STORAGE_MODIFIED_RESTORED] = {
89
                c.warm_access, static_cast<int16_t>(c.reset - c.warm_access)};
90
        }
91
    }
92
93
    return tbl;
94
}();
95
}  // namespace
96
97
Result sload(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
98
1.01M
{
99
1.01M
    auto& x = stack.top();
100
1.01M
    const auto key = intx::be::store<evmc::bytes32>(x);
101
102
1.01M
    if (state.rev >= EVMC_BERLIN &&
103
1.01M
        
state.host.access_storage(state.msg->recipient, key) == EVMC_ACCESS_COLD1.01M
)
  MC/DC Decision Region (102:9) to (103:81)
+
+  Number of Conditions: 2
+     Condition C1 --> (102:9)
+     Condition C2 --> (103:9)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
104
614k
    {
105
        // The warm storage access cost is already applied (from the cost table).
106
        // Here we need to apply additional cold storage access cost.
107
614k
        constexpr auto additional_cold_sload_cost =
108
614k
            instr::cold_sload_cost - instr::warm_storage_read_cost;
109
614k
        if ((gas_left -= additional_cold_sload_cost) < 0)
110
23
            return {EVMC_OUT_OF_GAS, gas_left};
111
614k
    }
112
113
1.01M
    x = intx::be::load<uint256>(state.host.get_storage(state.msg->recipient, key));
114
115
1.01M
    return {EVMC_SUCCESS, gas_left};
116
1.01M
}
117
118
Result sstore(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
119
4.69M
{
120
4.69M
    if (state.in_static_mode())
121
221k
        return {EVMC_STATIC_MODE_VIOLATION, gas_left};
122
123
4.46M
    if (state.rev >= EVMC_ISTANBUL && 
gas_left <= 23004.44M
)
  MC/DC Decision Region (123:9) to (123:55)
+
+  Number of Conditions: 2
+     Condition C1 --> (123:9)
+     Condition C2 --> (123:39)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
124
33.4k
        return {EVMC_OUT_OF_GAS, gas_left};
125
126
4.43M
    const auto key = intx::be::store<evmc::bytes32>(stack.pop());
127
4.43M
    const auto value = intx::be::store<evmc::bytes32>(stack.pop());
128
129
4.43M
    const auto gas_cost_cold =
130
4.43M
        (state.rev >= EVMC_BERLIN &&
131
4.43M
            
state.host.access_storage(state.msg->recipient, key) == EVMC_ACCESS_COLD4.40M
) ?
  MC/DC Decision Region (130:10) to (131:85)
+
+  Number of Conditions: 2
+     Condition C1 --> (130:10)
+     Condition C2 --> (131:13)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
132
1.44M
            instr::cold_sload_cost :
133
4.43M
            
02.98M
;
134
4.43M
    const auto status = state.host.set_storage(state.msg->recipient, key, value);
135
136
4.43M
    const auto [gas_cost_warm, gas_refund] = sstore_costs[state.rev][status];
137
4.43M
    const auto gas_cost = gas_cost_warm + gas_cost_cold;
138
4.43M
    if ((gas_left -= gas_cost) < 0)
139
33.9k
        return {EVMC_OUT_OF_GAS, gas_left};
140
4.40M
    state.gas_refund += gas_refund;
141
4.40M
    return {EVMC_SUCCESS, gas_left};
142
4.43M
}
143
}  // namespace evmone::instr::core
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions_xmacro.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions_xmacro.hpp.html new file mode 100644 index 0000000000..203b3b4cdb --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone/instructions_xmacro.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone/instructions_xmacro.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
/// The default macro for ON_OPCODE_IDENTIFIER. It redirects to ON_OPCODE.
7
713M
#define ON_OPCODE_IDENTIFIER_DEFAULT(OPCODE, NAME) ON_OPCODE(OPCODE)
8
9
/// The default macro for ON_OPCODE_UNDEFINED. Empty implementation to ignore undefined opcodes.
10
#define ON_OPCODE_UNDEFINED_DEFAULT(OPCODE)
11
12
13
#define ON_OPCODE_IDENTIFIER ON_OPCODE_IDENTIFIER_DEFAULT
14
#define ON_OPCODE_UNDEFINED ON_OPCODE_UNDEFINED_DEFAULT
15
16
17
/// The "X Macro" for opcodes and their matching identifiers.
18
///
19
/// The MAP_OPCODES is an extended variant of X Macro idiom.
20
/// It has 3 knobs for users.
21
///
22
/// 1. The ON_OPCODE(OPCODE) macro must be defined. It will receive all defined opcodes from
23
///    the evmc_opcode enum.
24
/// 2. The ON_OPCODE_UNDEFINED(OPCODE) macro may be defined to receive
25
///    the values of all undefined opcodes.
26
///    This macro is by default alias to ON_OPCODE_UNDEFINED_DEFAULT therefore users must first
27
///    undef it and restore the alias after usage.
28
/// 3. The ON_OPCODE_IDENTIFIER(OPCODE, IDENTIFIER) macro may be defined to receive
29
///    the pairs of all defined opcodes and their matching identifiers.
30
///    This macro is by default alias to ON_OPCODE_IDENTIFIER_DEFAULT therefore users must first
31
///    undef it and restore the alias after usage.
32
///
33
/// See for more about X Macros: https://en.wikipedia.org/wiki/X_Macro.
34
#define MAP_OPCODES                                           \
35
2.75M
    ON_OPCODE_IDENTIFIER(OP_STOP, stop)                       \
36
18.4M
    ON_OPCODE_IDENTIFIER(OP_ADD, add)                         \
37
15.6M
    
ON_OPCODE_IDENTIFIER2.98M
(OP_MUL, mul) \
38
5.87M
    ON_OPCODE_IDENTIFIER(OP_SUB, sub)                         \
39
3.12M
    
ON_OPCODE_IDENTIFIER2.79M
(OP_DIV, div) \
40
2.75M
    ON_OPCODE_IDENTIFIER(OP_SDIV, sdiv)                       \
41
2.90M
    ON_OPCODE_IDENTIFIER(OP_MOD, mod)                         \
42
2.75M
    ON_OPCODE_IDENTIFIER(OP_SMOD, smod)                       \
43
2.75M
    ON_OPCODE_IDENTIFIER(OP_ADDMOD, addmod)                   \
44
2.75M
    ON_OPCODE_IDENTIFIER(OP_MULMOD, mulmod)                   \
45
2.78M
    ON_OPCODE_IDENTIFIER(OP_EXP, exp)                         \
46
2.75M
    ON_OPCODE_IDENTIFIER(OP_SIGNEXTEND, signextend)           \
47
2.75M
    ON_OPCODE_UNDEFINED(0x0c)                                 \
48
2.75M
    ON_OPCODE_UNDEFINED(0x0d)                                 \
49
2.75M
    ON_OPCODE_UNDEFINED(0x0e)                                 \
50
2.75M
    ON_OPCODE_UNDEFINED(0x0f)                                 \
51
2.52k
                                                              \
52
5.69M
    ON_OPCODE_IDENTIFIER(OP_LT, lt)                           \
53
3.14M
    ON_OPCODE_IDENTIFIER(OP_GT, gt)                           \
54
2.75M
    ON_OPCODE_IDENTIFIER(OP_SLT, slt)                         \
55
2.75M
    ON_OPCODE_IDENTIFIER(OP_SGT, sgt)                         \
56
3.57M
    ON_OPCODE_IDENTIFIER(OP_EQ, eq)                           \
57
7.85M
    ON_OPCODE_IDENTIFIER(OP_ISZERO, iszero)                   \
58
5.10M
    
ON_OPCODE_IDENTIFIER2.88M
(OP_AND, and_) \
59
2.80M
    ON_OPCODE_IDENTIFIER(OP_OR, or_)                          \
60
2.75M
    ON_OPCODE_IDENTIFIER(OP_XOR, xor_)                        \
61
2.82M
    ON_OPCODE_IDENTIFIER(OP_NOT, not_)                        \
62
2.82M
    ON_OPCODE_IDENTIFIER(OP_BYTE, byte)                       \
63
6.22M
    ON_OPCODE_IDENTIFIER(OP_SHL, shl)                         \
64
3.46M
    
ON_OPCODE_IDENTIFIER2.77M
(OP_SHR, shr) \
65
2.75M
    ON_OPCODE_IDENTIFIER(OP_SAR, sar)                         \
66
2.75M
    ON_OPCODE_IDENTIFIER(OP_CLZ, clz)                         \
67
2.75M
    ON_OPCODE_UNDEFINED(0x1f)                                 \
68
2.81k
                                                              \
69
2.76M
    ON_OPCODE_IDENTIFIER(OP_KECCAK256, keccak256)             \
70
2.75M
    ON_OPCODE_UNDEFINED(0x21)                                 \
71
2.75M
    ON_OPCODE_UNDEFINED(0x22)                                 \
72
2.75M
    ON_OPCODE_UNDEFINED(0x23)                                 \
73
2.75M
    ON_OPCODE_UNDEFINED(0x24)                                 \
74
2.75M
    ON_OPCODE_UNDEFINED(0x25)                                 \
75
2.75M
    ON_OPCODE_UNDEFINED(0x26)                                 \
76
2.75M
    ON_OPCODE_UNDEFINED(0x27)                                 \
77
2.75M
    ON_OPCODE_UNDEFINED(0x28)                                 \
78
2.75M
    ON_OPCODE_UNDEFINED(0x29)                                 \
79
2.75M
    ON_OPCODE_UNDEFINED(0x2a)                                 \
80
2.75M
    ON_OPCODE_UNDEFINED(0x2b)                                 \
81
2.75M
    ON_OPCODE_UNDEFINED(0x2c)                                 \
82
2.75M
    ON_OPCODE_UNDEFINED(0x2d)                                 \
83
2.75M
    ON_OPCODE_UNDEFINED(0x2e)                                 \
84
2.75M
    ON_OPCODE_UNDEFINED(0x2f)                                 \
85
12.7k
                                                              \
86
2.80M
    ON_OPCODE_IDENTIFIER(OP_ADDRESS, address)                 \
87
2.75M
    ON_OPCODE_IDENTIFIER(OP_BALANCE, balance)                 \
88
2.77M
    ON_OPCODE_IDENTIFIER(OP_ORIGIN, origin)                   \
89
3.02M
    ON_OPCODE_IDENTIFIER(OP_CALLER, caller)                   \
90
2.77M
    ON_OPCODE_IDENTIFIER(OP_CALLVALUE, callvalue)             \
91
4.57M
    ON_OPCODE_IDENTIFIER(OP_CALLDATALOAD, calldataload)       \
92
2.85M
    ON_OPCODE_IDENTIFIER(OP_CALLDATASIZE, calldatasize)       \
93
2.87M
    ON_OPCODE_IDENTIFIER(OP_CALLDATACOPY, calldatacopy)       \
94
2.77M
    ON_OPCODE_IDENTIFIER(OP_CODESIZE, codesize)               \
95
2.77M
    ON_OPCODE_IDENTIFIER(OP_CODECOPY, codecopy)               \
96
2.76M
    ON_OPCODE_IDENTIFIER(OP_GASPRICE, gasprice)               \
97
3.22M
    ON_OPCODE_IDENTIFIER(OP_EXTCODESIZE, extcodesize)         \
98
2.76M
    ON_OPCODE_IDENTIFIER(OP_EXTCODECOPY, extcodecopy)         \
99
2.81M
    ON_OPCODE_IDENTIFIER(OP_RETURNDATASIZE, returndatasize)   \
100
2.75M
    ON_OPCODE_IDENTIFIER(OP_RETURNDATACOPY, returndatacopy)   \
101
2.75M
    ON_OPCODE_IDENTIFIER(OP_EXTCODEHASH, extcodehash)         \
102
3.33k
                                                              \
103
2.82M
    ON_OPCODE_IDENTIFIER(OP_BLOCKHASH, blockhash)             \
104
2.76M
    ON_OPCODE_IDENTIFIER(OP_COINBASE, coinbase)               \
105
2.89M
    ON_OPCODE_IDENTIFIER(OP_TIMESTAMP, timestamp)             \
106
2.88M
    ON_OPCODE_IDENTIFIER(OP_NUMBER, number)                   \
107
2.76M
    ON_OPCODE_IDENTIFIER(OP_PREVRANDAO, prevrandao)           \
108
2.76M
    ON_OPCODE_IDENTIFIER(OP_GASLIMIT, gaslimit)               \
109
2.75M
    ON_OPCODE_IDENTIFIER(OP_CHAINID, chainid)                 \
110
2.75M
    ON_OPCODE_IDENTIFIER(OP_SELFBALANCE, selfbalance)         \
111
2.75M
    ON_OPCODE_IDENTIFIER(OP_BASEFEE, basefee)                 \
112
2.75M
    ON_OPCODE_IDENTIFIER(OP_BLOBHASH, blobhash)               \
113
2.76M
    ON_OPCODE_IDENTIFIER(OP_BLOBBASEFEE, blobbasefee)         \
114
2.75M
    ON_OPCODE_UNDEFINED(0x4b)                                 \
115
2.75M
    ON_OPCODE_UNDEFINED(0x4c)                                 \
116
2.75M
    ON_OPCODE_UNDEFINED(0x4d)                                 \
117
2.75M
    ON_OPCODE_UNDEFINED(0x4e)                                 \
118
2.75M
    ON_OPCODE_UNDEFINED(0x4f)                                 \
119
12.7k
                                                              \
120
7.27M
    ON_OPCODE_IDENTIFIER(OP_POP, pop)                         \
121
14.7M
    ON_OPCODE_IDENTIFIER(OP_MLOAD, mload)                     \
122
11.9M
    
ON_OPCODE_IDENTIFIER11.3M
(OP_MSTORE, mstore) \
123
8.58M
    
ON_OPCODE_IDENTIFIER2.90M
(OP_MSTORE8, mstore8) \
124
3.76M
    ON_OPCODE_IDENTIFIER(OP_SLOAD, sload)                     \
125
7.15M
    ON_OPCODE_IDENTIFIER(OP_SSTORE, sstore)                   \
126
8.08M
    ON_OPCODE_IDENTIFIER(OP_JUMP, jump)                       \
127
9.68M
    ON_OPCODE_IDENTIFIER(OP_JUMPI, jumpi)                     \
128
8.25M
    ON_OPCODE_IDENTIFIER(OP_PC, pc)                           \
129
5.49M
    
ON_OPCODE_IDENTIFIER2.76M
(OP_MSIZE, msize) \
130
19.3M
    ON_OPCODE_IDENTIFIER(OP_GAS, gas)                         \
131
26.6M
    ON_OPCODE_IDENTIFIER(OP_JUMPDEST, jumpdest)               \
132
23.8M
    
ON_OPCODE_IDENTIFIER4.64M
(OP_TLOAD, tload) \
133
11.8M
    ON_OPCODE_IDENTIFIER(OP_TSTORE, tstore)                   \
134
9.07M
    
ON_OPCODE_IDENTIFIER2.75M
(OP_MCOPY, mcopy) \
135
3.90M
    ON_OPCODE_IDENTIFIER(OP_PUSH0, push0)                     \
136
1.15M
                                                              \
137
78.9M
    ON_OPCODE_IDENTIFIER(OP_PUSH1, push<1>)                   \
138
76.2M
    
ON_OPCODE_IDENTIFIER12.7M
(OP_PUSH2, push<2>) \
139
10.0M
    
ON_OPCODE_IDENTIFIER4.07M
(OP_PUSH3, push<3>) \
140
2.87M
    ON_OPCODE_IDENTIFIER(OP_PUSH4, push<4>)                   \
141
2.80M
    ON_OPCODE_IDENTIFIER(OP_PUSH5, push<5>)                   \
142
2.86M
    ON_OPCODE_IDENTIFIER(OP_PUSH6, push<6>)                   \
143
2.79M
    ON_OPCODE_IDENTIFIER(OP_PUSH7, push<7>)                   \
144
2.79M
    ON_OPCODE_IDENTIFIER(OP_PUSH8, push<8>)                   \
145
2.79M
    ON_OPCODE_IDENTIFIER(OP_PUSH9, push<9>)                   \
146
2.78M
    ON_OPCODE_IDENTIFIER(OP_PUSH10, push<10>)                 \
147
2.78M
    ON_OPCODE_IDENTIFIER(OP_PUSH11, push<11>)                 \
148
2.79M
    ON_OPCODE_IDENTIFIER(OP_PUSH12, push<12>)                 \
149
2.79M
    ON_OPCODE_IDENTIFIER(OP_PUSH13, push<13>)                 \
150
2.78M
    ON_OPCODE_IDENTIFIER(OP_PUSH14, push<14>)                 \
151
2.78M
    ON_OPCODE_IDENTIFIER(OP_PUSH15, push<15>)                 \
152
29.0k
                                                              \
153
2.80M
    ON_OPCODE_IDENTIFIER(OP_PUSH16, push<16>)                 \
154
2.77M
    ON_OPCODE_IDENTIFIER(OP_PUSH17, push<17>)                 \
155
2.81M
    ON_OPCODE_IDENTIFIER(OP_PUSH18, push<18>)                 \
156
2.78M
    ON_OPCODE_IDENTIFIER(OP_PUSH19, push<19>)                 \
157
4.99M
    ON_OPCODE_IDENTIFIER(OP_PUSH20, push<20>)                 \
158
2.79M
    ON_OPCODE_IDENTIFIER(OP_PUSH21, push<21>)                 \
159
2.78M
    ON_OPCODE_IDENTIFIER(OP_PUSH22, push<22>)                 \
160
2.78M
    ON_OPCODE_IDENTIFIER(OP_PUSH23, push<23>)                 \
161
2.78M
    ON_OPCODE_IDENTIFIER(OP_PUSH24, push<24>)                 \
162
2.78M
    ON_OPCODE_IDENTIFIER(OP_PUSH25, push<25>)                 \
163
2.79M
    ON_OPCODE_IDENTIFIER(OP_PUSH26, push<26>)                 \
164
2.79M
    ON_OPCODE_IDENTIFIER(OP_PUSH27, push<27>)                 \
165
2.78M
    ON_OPCODE_IDENTIFIER(OP_PUSH28, push<28>)                 \
166
2.78M
    ON_OPCODE_IDENTIFIER(OP_PUSH29, push<29>)                 \
167
2.77M
    ON_OPCODE_IDENTIFIER(OP_PUSH30, push<30>)                 \
168
2.84M
    ON_OPCODE_IDENTIFIER(OP_PUSH31, push<31>)                 \
169
3.05M
    ON_OPCODE_IDENTIFIER(OP_PUSH32, push<32>)                 \
170
301k
                                                              \
171
8.63M
    ON_OPCODE_IDENTIFIER(OP_DUP1, dup<1>)                     \
172
5.87M
    
ON_OPCODE_IDENTIFIER4.00M
(OP_DUP2, dup<2>) \
173
3.36M
    ON_OPCODE_IDENTIFIER(OP_DUP3, dup<3>)                     \
174
3.04M
    ON_OPCODE_IDENTIFIER(OP_DUP4, dup<4>)                     \
175
2.87M
    ON_OPCODE_IDENTIFIER(OP_DUP5, dup<5>)                     \
176
2.81M
    ON_OPCODE_IDENTIFIER(OP_DUP6, dup<6>)                     \
177
2.79M
    ON_OPCODE_IDENTIFIER(OP_DUP7, dup<7>)                     \
178
3.19M
    ON_OPCODE_IDENTIFIER(OP_DUP8, dup<8>)                     \
179
2.77M
    ON_OPCODE_IDENTIFIER(OP_DUP9, dup<9>)                     \
180
2.80M
    ON_OPCODE_IDENTIFIER(OP_DUP10, dup<10>)                   \
181
2.77M
    ON_OPCODE_IDENTIFIER(OP_DUP11, dup<11>)                   \
182
2.76M
    ON_OPCODE_IDENTIFIER(OP_DUP12, dup<12>)                   \
183
2.78M
    ON_OPCODE_IDENTIFIER(OP_DUP13, dup<13>)                   \
184
2.76M
    ON_OPCODE_IDENTIFIER(OP_DUP14, dup<14>)                   \
185
2.77M
    ON_OPCODE_IDENTIFIER(OP_DUP15, dup<15>)                   \
186
2.76M
    ON_OPCODE_IDENTIFIER(OP_DUP16, dup<16>)                   \
187
17.3k
                                                              \
188
3.47M
    ON_OPCODE_IDENTIFIER(OP_SWAP1, swap<1>)                   \
189
3.15M
    ON_OPCODE_IDENTIFIER(OP_SWAP2, swap<2>)                   \
190
3.02M
    ON_OPCODE_IDENTIFIER(OP_SWAP3, swap<3>)                   \
191
2.83M
    ON_OPCODE_IDENTIFIER(OP_SWAP4, swap<4>)                   \
192
2.78M
    ON_OPCODE_IDENTIFIER(OP_SWAP5, swap<5>)                   \
193
2.75M
    ON_OPCODE_IDENTIFIER(OP_SWAP6, swap<6>)                   \
194
2.75M
    ON_OPCODE_IDENTIFIER(OP_SWAP7, swap<7>)                   \
195
2.75M
    ON_OPCODE_IDENTIFIER(OP_SWAP8, swap<8>)                   \
196
2.75M
    ON_OPCODE_IDENTIFIER(OP_SWAP9, swap<9>)                   \
197
2.75M
    ON_OPCODE_IDENTIFIER(OP_SWAP10, swap<10>)                 \
198
2.75M
    ON_OPCODE_IDENTIFIER(OP_SWAP11, swap<11>)                 \
199
2.75M
    ON_OPCODE_IDENTIFIER(OP_SWAP12, swap<12>)                 \
200
2.75M
    ON_OPCODE_IDENTIFIER(OP_SWAP13, swap<13>)                 \
201
2.75M
    ON_OPCODE_IDENTIFIER(OP_SWAP14, swap<14>)                 \
202
2.75M
    ON_OPCODE_IDENTIFIER(OP_SWAP15, swap<15>)                 \
203
2.75M
    ON_OPCODE_IDENTIFIER(OP_SWAP16, swap<16>)                 \
204
2.34k
                                                              \
205
2.76M
    ON_OPCODE_IDENTIFIER(OP_LOG0, log<0>)                     \
206
2.75M
    ON_OPCODE_IDENTIFIER(OP_LOG1, log<1>)                     \
207
2.75M
    ON_OPCODE_IDENTIFIER(OP_LOG2, log<2>)                     \
208
2.75M
    ON_OPCODE_IDENTIFIER(OP_LOG3, log<3>)                     \
209
2.75M
    ON_OPCODE_IDENTIFIER(OP_LOG4, log<4>)                     \
210
2.75M
    ON_OPCODE_UNDEFINED(0xa5)                                 \
211
2.75M
    ON_OPCODE_UNDEFINED(0xa6)                                 \
212
2.75M
    ON_OPCODE_UNDEFINED(0xa7)                                 \
213
2.75M
    ON_OPCODE_UNDEFINED(0xa8)                                 \
214
2.75M
    ON_OPCODE_UNDEFINED(0xa9)                                 \
215
2.75M
    ON_OPCODE_UNDEFINED(0xaa)                                 \
216
2.75M
    ON_OPCODE_UNDEFINED(0xab)                                 \
217
2.75M
    ON_OPCODE_UNDEFINED(0xac)                                 \
218
2.75M
    ON_OPCODE_UNDEFINED(0xad)                                 \
219
2.75M
    ON_OPCODE_UNDEFINED(0xae)                                 \
220
2.75M
    ON_OPCODE_UNDEFINED(0xaf)                                 \
221
613
                                                              \
222
2.75M
    ON_OPCODE_UNDEFINED(0xb0)                                 \
223
2.75M
    ON_OPCODE_UNDEFINED(0xb1)                                 \
224
2.75M
    ON_OPCODE_UNDEFINED(0xb2)                                 \
225
2.75M
    ON_OPCODE_UNDEFINED(0xb3)                                 \
226
2.75M
    ON_OPCODE_UNDEFINED(0xb4)                                 \
227
2.75M
    ON_OPCODE_UNDEFINED(0xb5)                                 \
228
2.75M
    ON_OPCODE_UNDEFINED(0xb6)                                 \
229
2.75M
    ON_OPCODE_UNDEFINED(0xb7)                                 \
230
2.75M
    ON_OPCODE_UNDEFINED(0xb8)                                 \
231
2.75M
    ON_OPCODE_UNDEFINED(0xb9)                                 \
232
2.75M
    ON_OPCODE_UNDEFINED(0xba)                                 \
233
2.75M
    ON_OPCODE_UNDEFINED(0xbb)                                 \
234
2.75M
    ON_OPCODE_UNDEFINED(0xbc)                                 \
235
2.75M
    ON_OPCODE_UNDEFINED(0xbd)                                 \
236
2.75M
    ON_OPCODE_UNDEFINED(0xbe)                                 \
237
2.75M
    ON_OPCODE_UNDEFINED(0xbf)                                 \
238
613
                                                              \
239
2.75M
    ON_OPCODE_UNDEFINED(0xc0)                                 \
240
2.75M
    ON_OPCODE_UNDEFINED(0xc1)                                 \
241
2.75M
    ON_OPCODE_UNDEFINED(0xc2)                                 \
242
2.75M
    ON_OPCODE_UNDEFINED(0xc3)                                 \
243
2.75M
    ON_OPCODE_UNDEFINED(0xc4)                                 \
244
2.75M
    ON_OPCODE_UNDEFINED(0xc5)                                 \
245
2.75M
    ON_OPCODE_UNDEFINED(0xc6)                                 \
246
2.75M
    ON_OPCODE_UNDEFINED(0xc7)                                 \
247
2.75M
    ON_OPCODE_UNDEFINED(0xc8)                                 \
248
2.75M
    ON_OPCODE_UNDEFINED(0xc9)                                 \
249
2.75M
    ON_OPCODE_UNDEFINED(0xca)                                 \
250
2.75M
    ON_OPCODE_UNDEFINED(0xcb)                                 \
251
2.75M
    ON_OPCODE_UNDEFINED(0xcc)                                 \
252
2.75M
    ON_OPCODE_UNDEFINED(0xcd)                                 \
253
2.75M
    ON_OPCODE_UNDEFINED(0xce)                                 \
254
2.75M
    ON_OPCODE_UNDEFINED(0xcf)                                 \
255
613
                                                              \
256
2.75M
    ON_OPCODE_IDENTIFIER(OP_DATALOAD, dataload)               \
257
2.75M
    ON_OPCODE_IDENTIFIER(OP_DATALOADN, dataloadn)             \
258
2.75M
    ON_OPCODE_IDENTIFIER(OP_DATASIZE, datasize)               \
259
2.75M
    ON_OPCODE_IDENTIFIER(OP_DATACOPY, datacopy)               \
260
2.75M
    ON_OPCODE_UNDEFINED(0xd4)                                 \
261
2.75M
    ON_OPCODE_UNDEFINED(0xd5)                                 \
262
2.75M
    ON_OPCODE_UNDEFINED(0xd6)                                 \
263
2.75M
    ON_OPCODE_UNDEFINED(0xd7)                                 \
264
2.75M
    ON_OPCODE_UNDEFINED(0xd8)                                 \
265
2.75M
    ON_OPCODE_UNDEFINED(0xd9)                                 \
266
2.75M
    ON_OPCODE_UNDEFINED(0xda)                                 \
267
2.75M
    ON_OPCODE_UNDEFINED(0xdb)                                 \
268
2.75M
    ON_OPCODE_UNDEFINED(0xdc)                                 \
269
2.75M
    ON_OPCODE_UNDEFINED(0xdd)                                 \
270
2.75M
    ON_OPCODE_UNDEFINED(0xde)                                 \
271
2.75M
    ON_OPCODE_UNDEFINED(0xdf)                                 \
272
0
                                                              \
273
2.75M
    ON_OPCODE_IDENTIFIER(OP_RJUMP, rjump)                     \
274
2.75M
    ON_OPCODE_IDENTIFIER(OP_RJUMPI, rjumpi)                   \
275
2.75M
    ON_OPCODE_IDENTIFIER(OP_RJUMPV, rjumpv)                   \
276
2.75M
    ON_OPCODE_IDENTIFIER(OP_CALLF, callf)                     \
277
2.75M
    ON_OPCODE_IDENTIFIER(OP_RETF, retf)                       \
278
2.75M
    ON_OPCODE_IDENTIFIER(OP_JUMPF, jumpf)                     \
279
2.75M
    ON_OPCODE_IDENTIFIER(OP_DUPN, dupn)                       \
280
2.75M
    ON_OPCODE_IDENTIFIER(OP_SWAPN, swapn)                     \
281
2.75M
    ON_OPCODE_IDENTIFIER(OP_EXCHANGE, exchange)               \
282
2.75M
    ON_OPCODE_UNDEFINED(0xe9)                                 \
283
2.75M
    ON_OPCODE_UNDEFINED(0xea)                                 \
284
2.75M
    ON_OPCODE_UNDEFINED(0xeb)                                 \
285
2.75M
    ON_OPCODE_IDENTIFIER(OP_EOFCREATE, eofcreate)             \
286
2.75M
    ON_OPCODE_IDENTIFIER(OP_TXCREATE, txcreate)               \
287
2.75M
    ON_OPCODE_IDENTIFIER(OP_RETURNCODE, returncode)           \
288
2.75M
    ON_OPCODE_UNDEFINED(0xef)                                 \
289
0
                                                              \
290
2.77M
    ON_OPCODE_IDENTIFIER(OP_CREATE, create)                   \
291
3.62M
    ON_OPCODE_IDENTIFIER(OP_CALL, call)                       \
292
2.83M
    ON_OPCODE_IDENTIFIER(OP_CALLCODE, callcode)               \
293
2.75M
    ON_OPCODE_IDENTIFIER(OP_RETURN, return_)                  \
294
2.85M
    ON_OPCODE_IDENTIFIER(OP_DELEGATECALL, delegatecall)       \
295
2.77M
    ON_OPCODE_IDENTIFIER(OP_CREATE2, create2)                 \
296
2.75M
    ON_OPCODE_UNDEFINED(0xf6)                                 \
297
2.75M
    ON_OPCODE_IDENTIFIER(OP_RETURNDATALOAD, returndataload)   \
298
2.75M
    ON_OPCODE_IDENTIFIER(OP_EXTCALL, extcall)                 \
299
2.75M
    ON_OPCODE_IDENTIFIER(OP_EXTDELEGATECALL, extdelegatecall) \
300
5.81M
    ON_OPCODE_IDENTIFIER(OP_STATICCALL, staticcall)           \
301
3.06M
    
ON_OPCODE_IDENTIFIER2.75M
(OP_EXTSTATICCALL, extstaticcall) \
302
2.75M
    ON_OPCODE_UNDEFINED(0xfc)                                 \
303
2.75M
    ON_OPCODE_IDENTIFIER(OP_REVERT, revert)                   \
304
2.75M
    ON_OPCODE_IDENTIFIER(OP_INVALID, invalid)                 \
305
2.75M
    ON_OPCODE_IDENTIFIER(OP_SELFDESTRUCT, selfdestruct)
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/blake2b.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/blake2b.cpp.html new file mode 100644 index 0000000000..9ba441272c --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/blake2b.cpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/blake2b.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "blake2b.hpp"
6
#include <array>
7
8
namespace evmone::crypto
9
{
10
namespace
11
{
12
[[gnu::always_inline]]
13
inline uint64_t rotr(uint64_t x, unsigned r) noexcept
14
104M
{
15
104M
    return (x >> r) | (x << (64 - r));
16
104M
}
17
18
/// Mixing Function G.
19
/// https://datatracker.ietf.org/doc/html/rfc7693#section-3.1
20
///
21
/// The G primitive function mixes two input words, "x" and "y", into
22
/// four words indexed by "a", "b", "c", and "d" in the working vector v[0..15].
23
[[gnu::always_inline, clang::no_sanitize("coverage"), clang::no_sanitize("undefined")]]
24
void g(uint64_t v[16], size_t a, size_t b, size_t c, size_t d, uint64_t x, uint64_t y) noexcept
25
26.1M
{
26
26.1M
    v[a] = v[a] + v[b] + x;
27
26.1M
    v[d] = rotr(v[d] ^ v[a], 32);
28
26.1M
    v[c] = v[c] + v[d];
29
26.1M
    v[b] = rotr(v[b] ^ v[c], 24);
30
26.1M
    v[a] = v[a] + v[b] + y;
31
26.1M
    v[d] = rotr(v[d] ^ v[a], 16);
32
26.1M
    v[c] = v[c] + v[d];
33
26.1M
    v[b] = rotr(v[b] ^ v[c], 63);
34
26.1M
}
35
}  // namespace
36
37
[[clang::no_sanitize("undefined")]]
38
void blake2b_compress(
39
    uint32_t rounds, uint64_t h[8], const uint64_t m[16], const uint64_t t[2], bool last) noexcept
40
1.02k
{
41
    // Message Schedule SIGMA.
42
    // https://datatracker.ietf.org/doc/html/rfc7693#section-2.7
43
1.02k
    static constexpr uint8_t sigma[10][16]{
44
1.02k
        {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
45
1.02k
        {14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3},
46
1.02k
        {11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4},
47
1.02k
        {7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8},
48
1.02k
        {9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13},
49
1.02k
        {2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9},
50
1.02k
        {12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11},
51
1.02k
        {13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10},
52
1.02k
        {6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5},
53
1.02k
        {10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0},
54
1.02k
    };
55
56
57
    // Initialize local work vector v[0..15].
58
1.02k
    uint64_t v[16]{h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7],  // First half from state.
59
1.02k
        0x6a09e667f3bcc908, 0xbb67ae8584caa73b,                     // Second half from IV.
60
1.02k
        0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,
61
1.02k
        0x510e527fade682d1 ^ t[0],                  // Low word of the offset.
62
1.02k
        0x9b05688c2b3e6c1f ^ t[1],                  // High word.
63
1.02k
        0x1f83d9abfb41bd6b ^ (0 - uint64_t{last}),  // Last block flag? Invert all bits.
64
1.02k
        0x5be0cd19137e2179};
65
66
    // Cryptographic mixing.
67
3.27M
    for (size_t i = 0; i < rounds; 
++i3.27M
)
68
3.27M
    {
69
        // Message word selection permutation for this round.
70
3.27M
        const auto& s = sigma[i % std::size(sigma)];
71
72
3.27M
        g(v, 0, 4, 8, 12, m[s[0]], m[s[1]]);
73
3.27M
        g(v, 1, 5, 9, 13, m[s[2]], m[s[3]]);
74
3.27M
        g(v, 2, 6, 10, 14, m[s[4]], m[s[5]]);
75
3.27M
        g(v, 3, 7, 11, 15, m[s[6]], m[s[7]]);
76
3.27M
        g(v, 0, 5, 10, 15, m[s[8]], m[s[9]]);
77
3.27M
        g(v, 1, 6, 11, 12, m[s[10]], m[s[11]]);
78
3.27M
        g(v, 2, 7, 8, 13, m[s[12]], m[s[13]]);
79
3.27M
        g(v, 3, 4, 9, 14, m[s[14]], m[s[15]]);
80
3.27M
    }
81
82
9.21k
    for (size_t i = 0; i < 8; 
++i8.19k
) // XOR the two halves.
83
8.19k
        h[i] ^= v[i] ^ v[i + 8];
84
1.02k
}
85
}  // namespace evmone::crypto
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/bls.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/bls.cpp.html new file mode 100644 index 0000000000..9111f90f46 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/bls.cpp.html @@ -0,0 +1,49 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/bls.cpp
Line
Count
Source
1
#include "bls.hpp"
2
#include <blst.h>
3
#include <memory>
4
#include <optional>
5
#include <vector>
6
7
namespace evmone::crypto::bls
8
{
9
namespace
10
{
11
/// Offset of the beginning of field element. First 16 bytes must be zero according to spec
12
/// https://eips.ethereum.org/EIPS/eip-2537#field-elements-encoding
13
constexpr auto FP_BYTES_OFFSET = 64 - 48;
14
15
/// Validates that integer encoded in big endian is valid element of BLS12-381 Fp field
16
[[nodiscard]] std::optional<blst_fp> validate_fp(const uint8_t _p[64]) noexcept
17
565k
{
18
565k
    if (intx::be::unsafe::load<intx::uint512>(_p) >= BLS_FIELD_MODULUS)
19
540
        return std::nullopt;
20
21
564k
    blst_fp p;
22
564k
    blst_fp_from_bendian(&p, &_p[FP_BYTES_OFFSET]);
23
564k
    return p;
24
565k
}
25
26
/// Validates p1 affine point. Checks that point coordinates are from the BLS12-381 field and
27
/// that the point is on curve. https://eips.ethereum.org/EIPS/eip-2537#abi-for-g1-addition
28
[[nodiscard]] std::optional<blst_p1_affine> validate_p1(
29
    const uint8_t _x[64], const uint8_t _y[64]) noexcept
30
95.2k
{
31
95.2k
    const auto x = validate_fp(_x);
32
95.2k
    if (!x.has_value())
33
124
        return std::nullopt;
34
95.1k
    const auto y = validate_fp(_y);
35
95.1k
    if (!y.has_value())
36
60
        return std::nullopt;
37
38
95.1k
    const blst_p1_affine p0_affine{*x, *y};
39
95.1k
    if (!blst_p1_affine_on_curve(&p0_affine))
40
172
        return std::nullopt;
41
42
94.9k
    return p0_affine;
43
95.1k
}
44
45
/// Validates that integer encoded in big endian is valid element of BLS12-381 Fp2 extension field
46
[[nodiscard]] std::optional<blst_fp2> validate_fp2(const uint8_t _p[128]) noexcept
47
187k
{
48
187k
    const auto fp0 = validate_fp(_p);
49
187k
    if (!fp0.has_value())
50
192
        return std::nullopt;
51
187k
    const auto fp1 = validate_fp(&_p[64]);
52
187k
    if (!fp1.has_value())
53
128
        return std::nullopt;
54
55
187k
    return {{*fp0, *fp1}};
56
187k
}
57
58
/// Validates p2 affine point. Checks that point coordinates are from the BLS12-381 field and
59
/// that the point is on curve. https://eips.ethereum.org/EIPS/eip-2537#abi-for-g2-addition
60
[[nodiscard]] std::optional<blst_p2_affine> validate_p2(
61
    const uint8_t _x[128], const uint8_t _y[128]) noexcept
62
93.7k
{
63
93.7k
    const auto x = validate_fp2(_x);
64
93.7k
    if (!x.has_value())
65
168
        return std::nullopt;
66
67
93.6k
    const auto y = validate_fp2(_y);
68
93.6k
    if (!y.has_value())
69
96
        return std::nullopt;
70
71
93.5k
    const blst_p2_affine p_affine{*x, *y};
72
93.5k
    if (!blst_p2_affine_on_curve(&p_affine))
73
164
        return std::nullopt;
74
75
93.3k
    return p_affine;
76
93.5k
}
77
78
/// Stores fp in 64-bytes array with big endian encoding zero padded.
79
void store(uint8_t _rx[64], const blst_fp& _x) noexcept
80
2.52k
{
81
2.52k
    std::memset(_rx, 0, FP_BYTES_OFFSET);
82
2.52k
    blst_bendian_from_fp(&_rx[FP_BYTES_OFFSET], &_x);
83
2.52k
}
84
85
/// Stores fp2 in 128-bytes array with big endian encoding zero padded.
86
void store(uint8_t _rx[128], const blst_fp2& _x) noexcept
87
816
{
88
816
    store(_rx, _x.fp[0]);
89
816
    store(&_rx[64], _x.fp[1]);
90
816
}
91
92
}  // namespace
93
94
[[nodiscard]] bool g1_add(uint8_t _rx[64], uint8_t _ry[64], const uint8_t _x0[64],
95
    const uint8_t _y0[64], const uint8_t _x1[64], const uint8_t _y1[64]) noexcept
96
324
{
97
324
    const auto p0_affine = validate_p1(_x0, _y0);
98
324
    const auto p1_affine = validate_p1(_x1, _y1);
99
100
324
    if (!p0_affine.has_value() || 
!p1_affine.has_value()232
)
  MC/DC Decision Region (100:9) to (100:57)
+
+  Number of Conditions: 2
+     Condition C1 --> (100:9)
+     Condition C2 --> (100:35)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
101
144
        return false;
102
103
180
    blst_p1 p0;
104
180
    blst_p1_from_affine(&p0, &*p0_affine);
105
106
180
    blst_p1 out;
107
180
    blst_p1_add_or_double_affine(&out, &p0, &*p1_affine);
108
109
180
    blst_p1_affine result;
110
180
    blst_p1_to_affine(&result, &out);
111
180
    store(_rx, result.x);
112
180
    store(_ry, result.y);
113
114
180
    return true;
115
324
}
116
117
[[nodiscard]] bool g1_mul(uint8_t _rx[64], uint8_t _ry[64], const uint8_t _x[64],
118
    const uint8_t _y[64], const uint8_t _c[32]) noexcept
119
0
{
120
0
    blst_scalar scalar;
121
0
    blst_scalar_from_bendian(&scalar, _c);
122
123
0
    const auto p_affine = validate_p1(_x, _y);
124
0
    if (!p_affine.has_value())
125
0
        return false;
126
127
0
    blst_p1 p;
128
0
    blst_p1_from_affine(&p, &*p_affine);
129
130
0
    if (!blst_p1_in_g1(&p))
131
0
        return false;
132
133
0
    blst_p1 out;
134
0
    blst_p1_mult(&out, &p, scalar.b, 256);
135
136
0
    blst_p1_affine result;
137
0
    blst_p1_to_affine(&result, &out);
138
0
    store(_rx, result.x);
139
0
    store(_ry, result.y);
140
141
0
    return true;
142
0
}
143
144
[[nodiscard]] bool g2_add(uint8_t _rx[128], uint8_t _ry[128], const uint8_t _x0[128],
145
    const uint8_t _y0[128], const uint8_t _x1[128], const uint8_t _y1[128]) noexcept
146
348
{
147
348
    const auto p0_affine = validate_p2(_x0, _y0);
148
348
    const auto p1_affine = validate_p2(_x1, _y1);
149
150
348
    if (!p0_affine.has_value() || 
!p1_affine.has_value()240
)
  MC/DC Decision Region (150:9) to (150:57)
+
+  Number of Conditions: 2
+     Condition C1 --> (150:9)
+     Condition C2 --> (150:35)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
151
176
        return false;
152
153
172
    blst_p2 p0;
154
172
    blst_p2_from_affine(&p0, &*p0_affine);
155
156
172
    blst_p2 out;
157
172
    blst_p2_add_or_double_affine(&out, &p0, &*p1_affine);
158
159
172
    blst_p2_affine result;
160
172
    blst_p2_to_affine(&result, &out);
161
172
    store(_rx, result.x);
162
172
    store(_ry, result.y);
163
164
172
    return true;
165
348
}
166
167
[[nodiscard]] bool g2_mul(uint8_t _rx[128], uint8_t _ry[128], const uint8_t _x[128],
168
    const uint8_t _y[128], const uint8_t _c[32]) noexcept
169
0
{
170
0
    blst_scalar scalar;
171
0
    blst_scalar_from_bendian(&scalar, _c);
172
173
0
    const auto p_affine = validate_p2(_x, _y);
174
0
    if (!p_affine.has_value())
175
0
        return false;
176
177
0
    blst_p2 p;
178
0
    blst_p2_from_affine(&p, &*p_affine);
179
180
0
    if (!blst_p2_in_g2(&p))
181
0
        return false;
182
183
0
    blst_p2 out;
184
0
    blst_p2_mult(&out, &p, scalar.b, 256);
185
186
0
    blst_p2_affine result;
187
0
    blst_p2_to_affine(&result, &out);
188
0
    store(_rx, result.x);
189
0
    store(_ry, result.y);
190
191
0
    return true;
192
0
}
193
194
[[nodiscard]] bool g1_msm(
195
    uint8_t _rx[64], uint8_t _ry[64], const uint8_t* _xycs, size_t size) noexcept
196
1.58k
{
197
1.58k
    constexpr auto SINGLE_ENTRY_SIZE = (64 * 2 + 32);
198
1.58k
    assert(size % SINGLE_ENTRY_SIZE == 0);
199
1.58k
    const auto npoints = size / SINGLE_ENTRY_SIZE;
200
201
1.58k
    std::vector<blst_p1_affine> p1_affines;
202
1.58k
    std::vector<const blst_p1_affine*> p1_affine_ptrs;
203
1.58k
    p1_affines.reserve(npoints);
204
1.58k
    p1_affine_ptrs.reserve(npoints);
205
206
1.58k
    std::vector<blst_scalar> scalars;
207
1.58k
    std::vector<const uint8_t*> scalars_ptrs;
208
1.58k
    scalars.reserve(npoints);
209
1.58k
    scalars_ptrs.reserve(npoints);
210
211
1.58k
    const auto end = _xycs + size;
212
82.7k
    for (auto ptr = _xycs; ptr != end; 
ptr += SINGLE_ENTRY_SIZE81.1k
)
213
81.3k
    {
214
81.3k
        const auto p_affine = validate_p1(ptr, &ptr[64]);
215
81.3k
        if (!p_affine.has_value())
216
136
            return false;
217
218
81.2k
        if (!blst_p1_affine_in_g1(&*p_affine))
219
84
            return false;
220
221
        // Point at infinity must be filtered out for BLST library.
222
81.1k
        if (blst_p1_affine_is_inf(&*p_affine))
223
78.3k
            continue;
224
225
2.84k
        const auto& p = p1_affines.emplace_back(*p_affine);
226
2.84k
        p1_affine_ptrs.emplace_back(&p);
227
228
2.84k
        blst_scalar scalar;
229
2.84k
        blst_scalar_from_bendian(&scalar, &ptr[128]);
230
2.84k
        const auto& s = scalars.emplace_back(scalar);
231
2.84k
        scalars_ptrs.emplace_back(s.b);
232
2.84k
    }
233
234
1.36k
    if (p1_affine_ptrs.empty())
235
1.18k
    {
236
1.18k
        std::memset(_rx, 0, 64);
237
1.18k
        std::memset(_ry, 0, 64);
238
1.18k
        return true;
239
1.18k
    }
240
241
184
    const auto scratch_size =
242
184
        blst_p1s_mult_pippenger_scratch_sizeof(p1_affine_ptrs.size()) / sizeof(limb_t);
243
184
    const auto scratch_space = std::make_unique_for_overwrite<limb_t[]>(scratch_size);
244
184
    blst_p1 out;
245
184
    blst_p1s_mult_pippenger(&out, p1_affine_ptrs.data(), p1_affine_ptrs.size(), scalars_ptrs.data(),
246
184
        256, scratch_space.get());
247
248
184
    blst_p1_affine result;
249
184
    blst_p1_to_affine(&result, &out);
250
184
    store(_rx, result.x);
251
184
    store(_ry, result.y);
252
253
184
    return true;
254
1.36k
}
255
256
[[nodiscard]] bool g2_msm(
257
    uint8_t _rx[128], uint8_t _ry[128], const uint8_t* _xycs, size_t size) noexcept
258
1.60k
{
259
1.60k
    constexpr auto SINGLE_ENTRY_SIZE = (128 * 2 + 32);
260
1.60k
    assert(size % SINGLE_ENTRY_SIZE == 0);
261
1.60k
    const auto npoints = size / SINGLE_ENTRY_SIZE;
262
263
1.60k
    std::vector<blst_p2_affine> p2_affines;
264
1.60k
    std::vector<const blst_p2_affine*> p2_affine_ptrs;
265
1.60k
    p2_affines.reserve(npoints);
266
1.60k
    p2_affine_ptrs.reserve(npoints);
267
268
1.60k
    std::vector<blst_scalar> scalars;
269
1.60k
    std::vector<const uint8_t*> scalars_ptrs;
270
1.60k
    scalars.reserve(npoints);
271
1.60k
    scalars_ptrs.reserve(npoints);
272
273
1.60k
    const auto end = _xycs + size;
274
81.2k
    for (auto ptr = _xycs; ptr != end; 
ptr += SINGLE_ENTRY_SIZE79.6k
)
275
79.9k
    {
276
79.9k
        const auto p_affine = validate_p2(ptr, &ptr[128]);
277
79.9k
        if (!p_affine.has_value())
278
164
            return false;
279
280
79.7k
        if (!blst_p2_affine_in_g2(&*p_affine))
281
76
            return false;
282
283
        // Point at infinity must be filtered out for BLST library.
284
79.6k
        if (blst_p2_affine_is_inf(&*p_affine))
285
78.3k
            continue;
286
287
1.32k
        const auto& p = p2_affines.emplace_back(*p_affine);
288
1.32k
        p2_affine_ptrs.emplace_back(&p);
289
290
1.32k
        blst_scalar scalar;
291
1.32k
        blst_scalar_from_bendian(&scalar, &ptr[256]);
292
1.32k
        const auto& s = scalars.emplace_back(scalar);
293
1.32k
        scalars_ptrs.emplace_back(s.b);
294
1.32k
    }
295
296
1.36k
    if (p2_affine_ptrs.empty())
297
1.18k
    {
298
1.18k
        std::memset(_rx, 0, 128);
299
1.18k
        std::memset(_ry, 0, 128);
300
1.18k
        return true;
301
1.18k
    }
302
303
188
    const auto scratch_size =
304
188
        blst_p2s_mult_pippenger_scratch_sizeof(p2_affine_ptrs.size()) / sizeof(limb_t);
305
188
    const auto scratch_space = std::make_unique_for_overwrite<limb_t[]>(scratch_size);
306
188
    blst_p2 out;
307
188
    blst_p2s_mult_pippenger(&out, p2_affine_ptrs.data(), p2_affine_ptrs.size(), scalars_ptrs.data(),
308
188
        256, scratch_space.get());
309
310
188
    blst_p2_affine result;
311
188
    blst_p2_to_affine(&result, &out);
312
188
    store(_rx, result.x);
313
188
    store(_ry, result.y);
314
315
188
    return true;
316
1.36k
}
317
318
[[nodiscard]] bool map_fp_to_g1(uint8_t _rx[64], uint8_t _ry[64], const uint8_t _fp[64]) noexcept
319
116
{
320
116
    const auto fp = validate_fp(_fp);
321
116
    if (!fp.has_value())
322
36
        return false;
323
324
80
    blst_p1 out;
325
80
    blst_map_to_g1(&out, &*fp);
326
327
80
    blst_p1_affine result;
328
80
    blst_p1_to_affine(&result, &out);
329
80
    store(_rx, result.x);
330
80
    store(_ry, result.y);
331
332
80
    return true;
333
116
}
334
335
[[nodiscard]] bool map_fp2_to_g2(
336
    uint8_t _rx[128], uint8_t _ry[128], const uint8_t _fp2[128]) noexcept
337
104
{
338
104
    const auto fp2 = validate_fp2(_fp2);
339
104
    if (!fp2.has_value())
340
56
        return false;
341
342
48
    blst_p2 out;
343
48
    blst_map_to_g2(&out, &*fp2);
344
345
48
    blst_p2_affine result;
346
48
    blst_p2_to_affine(&result, &out);
347
48
    store(_rx, result.x);
348
48
    store(_ry, result.y);
349
350
48
    return true;
351
104
}
352
353
[[nodiscard]] bool pairing_check(uint8_t _r[32], const uint8_t* _pairs, size_t size) noexcept
354
412
{
355
412
    static constexpr auto FP_SIZE = 64;
356
412
    static constexpr auto FP2_SIZE = 2 * FP_SIZE;
357
412
    static constexpr auto P1_SIZE = 2 * FP_SIZE;
358
412
    static constexpr auto P2_SIZE = 2 * FP2_SIZE;
359
412
    static constexpr auto PAIR_SIZE = P1_SIZE + P2_SIZE;
360
412
    assert(size % PAIR_SIZE == 0);
361
362
412
    auto acc = *blst_fp12_one();
363
412
    const auto pairs_end = _pairs + size;
364
13.4k
    for (auto ptr = _pairs; ptr != pairs_end; 
ptr += PAIR_SIZE13.0k
)
365
13.2k
    {
366
13.2k
        const auto P_affine = validate_p1(ptr, &ptr[FP_SIZE]);
367
13.2k
        if (!P_affine.has_value())
368
72
            return false;
369
370
13.1k
        const auto Q_affine = validate_p2(&ptr[P1_SIZE], &ptr[P1_SIZE + FP2_SIZE]);
371
13.1k
        if (!Q_affine.has_value())
372
84
            return false;
373
374
13.0k
        if (!blst_p1_affine_in_g1(&*P_affine))
375
24
            return false;
376
377
13.0k
        if (!blst_p2_affine_in_g2(&*Q_affine))
378
24
            return false;
379
380
        // Skip a pair containing any point at infinity.
381
13.0k
        if (blst_p1_affine_is_inf(&*P_affine) || 
blst_p2_affine_is_inf(&*Q_affine)156
)
  MC/DC Decision Region (381:13) to (381:83)
+
+  Number of Conditions: 2
+     Condition C1 --> (381:13)
+     Condition C2 --> (381:50)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
382
12.9k
            continue;
383
384
140
        blst_fp12 ml_res;
385
140
        blst_miller_loop(&ml_res, &*Q_affine, &*P_affine);
386
140
        blst_fp12_mul(&acc, &acc, &ml_res);
387
140
    }
388
389
208
    blst_final_exp(&acc, &acc);
390
208
    const auto result = blst_fp12_is_one(&acc);
391
208
    std::memset(_r, 0, 31);
392
208
    _r[31] = result ? 
1168
:
040
;
393
208
    return true;
394
412
}
395
396
}  // namespace evmone::crypto::bls
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/bn254.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/bn254.cpp.html new file mode 100644 index 0000000000..740afd3e3a --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/bn254.cpp.html @@ -0,0 +1,17 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/bn254.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "bn254.hpp"
6
7
namespace evmmax::bn254
8
{
9
static_assert(AffinePoint{} == 0, "default constructed is the point at infinity");
10
11
bool validate(const AffinePoint& pt) noexcept
12
12.0k
{
13
12.0k
    const auto yy = pt.y * pt.y;
14
12.0k
    const auto xxx = pt.x * pt.x * pt.x;
15
12.0k
    const auto on_curve = yy == xxx + Curve::B;
16
12.0k
    return on_curve || 
pt == 06.45k
;
  MC/DC Decision Region (16:12) to (16:31)
+
+  Number of Conditions: 2
+     Condition C1 --> (16:12)
+     Condition C2 --> (16:24)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
17
12.0k
}
18
19
AffinePoint mul(const AffinePoint& pt, const uint256& c) noexcept
20
4.60k
{
21
4.60k
    const auto pr = ecc::mul(pt, c);
22
4.60k
    return ecc::to_affine(pr);
23
4.60k
}
24
}  // namespace evmmax::bn254
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/ecc.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/ecc.hpp.html new file mode 100644 index 0000000000..66b4944dc3 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/ecc.hpp.html @@ -0,0 +1,78 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/ecc.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <evmmax/evmmax.hpp>
7
#include <span>
8
9
namespace evmmax::ecc
10
{
11
template <int N>
12
struct Constant : std::integral_constant<int, N>
13
{
14
    consteval explicit(false) Constant(int v) noexcept
15
    {
16
        if (N != v)
17
            intx::unreachable();
18
    }
19
};
20
using zero_t = Constant<0>;
21
using one_t = Constant<1>;
22
23
/// A representation of an element in a prime field.
24
///
25
/// TODO: Combine with BaseFieldElem.
26
template <typename Curve>
27
struct FieldElement
28
{
29
    using uint_type = Curve::uint_type;
30
    static constexpr auto& Fp = Curve::Fp;
31
32
    // TODO: Make this private.
33
    uint_type value_{};
34
35
31.1M
    FieldElement() = default;
evmmax::ecc::FieldElement<evmmax::bn254::Curve>::FieldElement()
Line
Count
Source
35
10.1M
    FieldElement() = default;
evmmax::ecc::FieldElement<evmmax::secp256k1::Curve>::FieldElement()
Line
Count
Source
35
9.10M
    FieldElement() = default;
evmmax::ecc::FieldElement<evmmax::secp256r1::Curve>::FieldElement()
Line
Count
Source
35
11.8M
    FieldElement() = default;
36
37
36.8k
    constexpr explicit FieldElement(uint_type v) : value_{Fp.to_mont(v)} {}
evmmax::ecc::FieldElement<evmmax::bn254::Curve>::FieldElement(intx::uint<256u>)
Line
Count
Source
37
31.2k
    constexpr explicit FieldElement(uint_type v) : value_{Fp.to_mont(v)} {}
evmmax::ecc::FieldElement<evmmax::secp256k1::Curve>::FieldElement(intx::uint<256u>)
Line
Count
Source
37
2.34k
    constexpr explicit FieldElement(uint_type v) : value_{Fp.to_mont(v)} {}
evmmax::ecc::FieldElement<evmmax::secp256r1::Curve>::FieldElement(intx::uint<256u>)
Line
Count
Source
37
3.23k
    constexpr explicit FieldElement(uint_type v) : value_{Fp.to_mont(v)} {}
38
39
16.2k
    constexpr uint_type value() const noexcept { return Fp.from_mont(value_); }
evmmax::ecc::FieldElement<evmmax::bn254::Curve>::value() const
Line
Count
Source
39
14.4k
    constexpr uint_type value() const noexcept { return Fp.from_mont(value_); }
evmmax::ecc::FieldElement<evmmax::secp256k1::Curve>::value() const
Line
Count
Source
39
1.35k
    constexpr uint_type value() const noexcept { return Fp.from_mont(value_); }
evmmax::ecc::FieldElement<evmmax::secp256r1::Curve>::value() const
Line
Count
Source
39
522
    constexpr uint_type value() const noexcept { return Fp.from_mont(value_); }
40
41
    static constexpr FieldElement from_bytes(std::span<const uint8_t, sizeof(uint_type)> b) noexcept
42
24.5k
    {
43
        // TODO: Add intx::load from std::span.
44
24.5k
        return FieldElement{intx::be::unsafe::load<uint_type>(b.data())};
45
24.5k
    }
46
47
    constexpr void to_bytes(std::span<uint8_t, sizeof(uint_type)> b) const noexcept
48
15.7k
    {
49
        // TODO: Add intx::store to std::span.
50
15.7k
        intx::be::unsafe::store(b.data(), value());
51
15.7k
    }
evmmax::ecc::FieldElement<evmmax::bn254::Curve>::to_bytes(std::span<unsigned char, 32ul>) const
Line
Count
Source
48
14.4k
    {
49
        // TODO: Add intx::store to std::span.
50
14.4k
        intx::be::unsafe::store(b.data(), value());
51
14.4k
    }
evmmax::ecc::FieldElement<evmmax::secp256k1::Curve>::to_bytes(std::span<unsigned char, 32ul>) const
Line
Count
Source
48
1.35k
    {
49
        // TODO: Add intx::store to std::span.
50
1.35k
        intx::be::unsafe::store(b.data(), value());
51
1.35k
    }
52
53
54
    constexpr explicit operator bool() const noexcept { return static_cast<bool>(value_); }
55
56
447k
    friend constexpr bool operator==(const FieldElement&, const FieldElement&) = default;
evmmax::ecc::operator==(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
56
197k
    friend constexpr bool operator==(const FieldElement&, const FieldElement&) = default;
evmmax::ecc::operator==(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
56
119k
    friend constexpr bool operator==(const FieldElement&, const FieldElement&) = default;
evmmax::ecc::operator==(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
56
130k
    friend constexpr bool operator==(const FieldElement&, const FieldElement&) = default;
57
58
339k
    friend constexpr bool operator==(const FieldElement& a, zero_t) noexcept { return !a.value_; }
evmmax::ecc::operator==(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
58
90.0k
    friend constexpr bool operator==(const FieldElement& a, zero_t) noexcept { return !a.value_; }
evmmax::ecc::operator==(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
58
119k
    friend constexpr bool operator==(const FieldElement& a, zero_t) noexcept { return !a.value_; }
evmmax::ecc::operator==(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
58
130k
    friend constexpr bool operator==(const FieldElement& a, zero_t) noexcept { return !a.value_; }
59
60
    friend constexpr auto operator*(const FieldElement& a, const FieldElement& b) noexcept
61
9.69M
    {
62
9.69M
        return wrap(Fp.mul(a.value_, b.value_));
63
9.69M
    }
evmmax::ecc::operator*(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
61
3.21M
    {
62
3.21M
        return wrap(Fp.mul(a.value_, b.value_));
63
3.21M
    }
evmmax::ecc::operator*(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
61
3.05M
    {
62
3.05M
        return wrap(Fp.mul(a.value_, b.value_));
63
3.05M
    }
evmmax::ecc::operator*(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
61
3.43M
    {
62
3.43M
        return wrap(Fp.mul(a.value_, b.value_));
63
3.43M
    }
64
65
    friend constexpr auto operator+(const FieldElement& a, const FieldElement& b) noexcept
66
14.2M
    {
67
14.2M
        return wrap(Fp.add(a.value_, b.value_));
68
14.2M
    }
evmmax::ecc::operator+(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
66
4.54M
    {
67
4.54M
        return wrap(Fp.add(a.value_, b.value_));
68
4.54M
    }
evmmax::ecc::operator+(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
66
3.84M
    {
67
3.84M
        return wrap(Fp.add(a.value_, b.value_));
68
3.84M
    }
evmmax::ecc::operator+(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
66
5.90M
    {
67
5.90M
        return wrap(Fp.add(a.value_, b.value_));
68
5.90M
    }
69
70
    friend constexpr auto operator-(const FieldElement& a, const FieldElement& b) noexcept
71
6.33M
    {
72
6.33M
        return wrap(Fp.sub(a.value_, b.value_));
73
6.33M
    }
evmmax::ecc::operator-(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
71
2.10M
    {
72
2.10M
        return wrap(Fp.sub(a.value_, b.value_));
73
2.10M
    }
evmmax::ecc::operator-(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
71
1.95M
    {
72
1.95M
        return wrap(Fp.sub(a.value_, b.value_));
73
1.95M
    }
evmmax::ecc::operator-(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
71
2.27M
    {
72
2.27M
        return wrap(Fp.sub(a.value_, b.value_));
73
2.27M
    }
74
75
    friend constexpr auto operator-(const FieldElement& a) noexcept
76
    {
77
        return wrap(Fp.sub(0, a.value_));
78
    }
79
80
    friend constexpr auto operator/(one_t, const FieldElement& a) noexcept
81
5.80k
    {
82
5.80k
        return wrap(Fp.inv(a.value_));
83
5.80k
    }
evmmax::ecc::operator/(evmmax::ecc::Constant<1>, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
81
4.60k
    {
82
4.60k
        return wrap(Fp.inv(a.value_));
83
4.60k
    }
evmmax::ecc::operator/(evmmax::ecc::Constant<1>, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
81
682
    {
82
682
        return wrap(Fp.inv(a.value_));
83
682
    }
evmmax::ecc::operator/(evmmax::ecc::Constant<1>, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
81
522
    {
82
522
        return wrap(Fp.inv(a.value_));
83
522
    }
84
85
    friend constexpr auto operator/(const FieldElement& a, const FieldElement& b) noexcept
86
888
    {
87
888
        return wrap(Fp.mul(a.value_, Fp.inv(b.value_)));
88
888
    }
evmmax::ecc::operator/(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
86
888
    {
87
888
        return wrap(Fp.mul(a.value_, Fp.inv(b.value_)));
88
888
    }
Unexecuted instantiation: evmmax::ecc::operator/(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
89
90
    /// Wraps a raw value into the Element type assuming it is already in Montgomery form.
91
    /// TODO: Make this private.
92
    [[gnu::always_inline]] static constexpr FieldElement wrap(const uint_type& v) noexcept
93
30.3M
    {
94
30.3M
        FieldElement element;
95
30.3M
        element.value_ = v;
96
30.3M
        return element;
97
30.3M
    }
evmmax::ecc::FieldElement<evmmax::bn254::Curve>::wrap(intx::uint<256u> const&)
Line
Count
Source
93
9.86M
    {
94
9.86M
        FieldElement element;
95
9.86M
        element.value_ = v;
96
9.86M
        return element;
97
9.86M
    }
evmmax::ecc::FieldElement<evmmax::secp256k1::Curve>::wrap(intx::uint<256u> const&)
Line
Count
Source
93
8.85M
    {
94
8.85M
        FieldElement element;
95
8.85M
        element.value_ = v;
96
8.85M
        return element;
97
8.85M
    }
evmmax::ecc::FieldElement<evmmax::secp256r1::Curve>::wrap(intx::uint<256u> const&)
Line
Count
Source
93
11.6M
    {
94
11.6M
        FieldElement element;
95
11.6M
        element.value_ = v;
96
11.6M
        return element;
97
11.6M
    }
98
};
99
100
/// The affine (two coordinates) point on an Elliptic Curve over a prime field.
101
template <typename ValueT>
102
struct Point
103
{
104
    ValueT x = {};
105
    ValueT y = {};
106
107
2.00k
    friend constexpr Point operator-(const Point& p) noexcept { return {p.x, -p.y}; }
108
};
109
110
/// The affine (two coordinates) point on an Elliptic Curve over a prime field.
111
template <typename Curve>
112
struct AffinePoint
113
{
114
    using FE = FieldElement<Curve>;
115
116
    FE x;
117
    FE y;
118
119
387k
    AffinePoint() = default;
evmmax::ecc::AffinePoint<evmmax::bn254::Curve>::AffinePoint()
Line
Count
Source
119
138k
    AffinePoint() = default;
evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve>::AffinePoint()
Line
Count
Source
119
119k
    AffinePoint() = default;
evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve>::AffinePoint()
Line
Count
Source
119
129k
    AffinePoint() = default;
120
20.2k
    constexpr AffinePoint(const FE& x_, const FE& y_) noexcept : x{x_}, y{y_} {}
evmmax::ecc::AffinePoint<evmmax::bn254::Curve>::AffinePoint(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
120
17.7k
    constexpr AffinePoint(const FE& x_, const FE& y_) noexcept : x{x_}, y{y_} {}
evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve>::AffinePoint(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
120
1.36k
    constexpr AffinePoint(const FE& x_, const FE& y_) noexcept : x{x_}, y{y_} {}
evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve>::AffinePoint(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
120
1.09k
    constexpr AffinePoint(const FE& x_, const FE& y_) noexcept : x{x_}, y{y_} {}
121
122
    /// Create the point from literal values.
123
    consteval AffinePoint(const Curve::uint_type& x_value, const Curve::uint_type& y_value) noexcept
124
      : x{x_value}, y{y_value}
125
    {}
126
127
1.43M
    friend constexpr bool operator==(const AffinePoint&, const AffinePoint&) = default;
evmmax::ecc::operator==(evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&, evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&)
Line
Count
Source
127
692k
    friend constexpr bool operator==(const AffinePoint&, const AffinePoint&) = default;
evmmax::ecc::operator==(evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&, evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
127
357k
    friend constexpr bool operator==(const AffinePoint&, const AffinePoint&) = default;
evmmax::ecc::operator==(evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> const&, evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
127
389k
    friend constexpr bool operator==(const AffinePoint&, const AffinePoint&) = default;
128
129
    friend constexpr bool operator==(const AffinePoint& p, zero_t) noexcept
130
387k
    {
131
387k
        return p == AffinePoint{};
132
387k
    }
evmmax::ecc::operator==(evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
130
138k
    {
131
138k
        return p == AffinePoint{};
132
138k
    }
evmmax::ecc::operator==(evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
130
119k
    {
131
119k
        return p == AffinePoint{};
132
119k
    }
evmmax::ecc::operator==(evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
130
129k
    {
131
129k
        return p == AffinePoint{};
132
129k
    }
133
134
    static constexpr AffinePoint from_bytes(std::span<const uint8_t, sizeof(FE) * 2> b) noexcept
135
12.2k
    {
136
12.2k
        const auto x = FE::from_bytes(b.template subspan<0, sizeof(FE)>());
137
12.2k
        const auto y = FE::from_bytes(b.template subspan<sizeof(FE), sizeof(FE)>());
138
12.2k
        return {x, y};
139
12.2k
    }
140
141
    constexpr void to_bytes(std::span<uint8_t, sizeof(FE) * 2> b) const noexcept
142
7.87k
    {
143
7.87k
        x.to_bytes(b.template subspan<0, sizeof(FE)>());
144
7.87k
        y.to_bytes(b.template subspan<sizeof(FE), sizeof(FE)>());
145
7.87k
    }
evmmax::ecc::AffinePoint<evmmax::bn254::Curve>::to_bytes(std::span<unsigned char, 64ul>) const
Line
Count
Source
142
7.20k
    {
143
7.20k
        x.to_bytes(b.template subspan<0, sizeof(FE)>());
144
7.20k
        y.to_bytes(b.template subspan<sizeof(FE), sizeof(FE)>());
145
7.20k
    }
evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve>::to_bytes(std::span<unsigned char, 64ul>) const
Line
Count
Source
142
676
    {
143
676
        x.to_bytes(b.template subspan<0, sizeof(FE)>());
144
676
        y.to_bytes(b.template subspan<sizeof(FE), sizeof(FE)>());
145
676
    }
146
};
147
148
/// Elliptic curve point in Jacobian coordinates (X, Y, Z)
149
/// representing the affine point (X/Z², Y/Z³).
150
/// TODO: Merge with JacPoint.
151
template <typename Curve>
152
struct ProjPoint
153
{
154
    using FE = FieldElement<Curve>;
155
    FE x;
156
    FE y{1};  // TODO: Make sure this is compile-time constant.
157
    FE z;
158
159
7.01k
    ProjPoint() = default;
evmmax::ecc::ProjPoint<evmmax::bn254::Curve>::ProjPoint()
Line
Count
Source
159
4.60k
    ProjPoint() = default;
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve>::ProjPoint()
Line
Count
Source
159
1.36k
    ProjPoint() = default;
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve>::ProjPoint()
Line
Count
Source
159
1.04k
    ProjPoint() = default;
160
1.14M
    constexpr ProjPoint(const FE& x_, const FE& y_, const FE& z_) noexcept : x{x_}, y{y_}, z{z_} {}
evmmax::ecc::ProjPoint<evmmax::bn254::Curve>::ProjPoint(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
160
401k
    constexpr ProjPoint(const FE& x_, const FE& y_, const FE& z_) noexcept : x{x_}, y{y_}, z{z_} {}
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve>::ProjPoint(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
160
368k
    constexpr ProjPoint(const FE& x_, const FE& y_, const FE& z_) noexcept : x{x_}, y{y_}, z{z_} {}
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve>::ProjPoint(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
160
379k
    constexpr ProjPoint(const FE& x_, const FE& y_, const FE& z_) noexcept : x{x_}, y{y_}, z{z_} {}
161
4.06k
    constexpr explicit ProjPoint(const AffinePoint<Curve>& p) noexcept : x{p.x}, y{p.y}, z{FE{1}} {}
evmmax::ecc::ProjPoint<evmmax::bn254::Curve>::ProjPoint(evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&)
Line
Count
Source
161
2.05k
    constexpr explicit ProjPoint(const AffinePoint<Curve>& p) noexcept : x{p.x}, y{p.y}, z{FE{1}} {}
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve>::ProjPoint(evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
161
980
    constexpr explicit ProjPoint(const AffinePoint<Curve>& p) noexcept : x{p.x}, y{p.y}, z{FE{1}} {}
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve>::ProjPoint(evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
161
1.03k
    constexpr explicit ProjPoint(const AffinePoint<Curve>& p) noexcept : x{p.x}, y{p.y}, z{FE{1}} {}
162
163
338k
    friend constexpr bool operator==(const ProjPoint& p, zero_t) noexcept { return p.z == 0; }
evmmax::ecc::operator==(evmmax::ecc::ProjPoint<evmmax::bn254::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
163
88.3k
    friend constexpr bool operator==(const ProjPoint& p, zero_t) noexcept { return p.z == 0; }
evmmax::ecc::operator==(evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
163
119k
    friend constexpr bool operator==(const ProjPoint& p, zero_t) noexcept { return p.z == 0; }
evmmax::ecc::operator==(evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
163
130k
    friend constexpr bool operator==(const ProjPoint& p, zero_t) noexcept { return p.z == 0; }
164
165
    friend constexpr bool operator==(const ProjPoint& p, const ProjPoint& q) noexcept
166
812
    {
167
812
        const auto& [x1, y1, z1] = p;
168
812
        const auto& [x2, y2, z2] = q;
169
812
        const auto z1z1 = z1 * z1;
170
812
        const auto z1z1z1 = z1z1 * z1;
171
812
        const auto z2z2 = z2 * z2;
172
812
        const auto z2z2z2 = z2z2 * z2;
173
812
        return x1 * z2z2 == x2 * z1z1 && 
y1 * z2z2z2 == y2 * z1z1z138
;
  MC/DC Decision Region (173:16) to (173:68)
+
+  Number of Conditions: 2
+     Condition C1 --> (173:16)
+     Condition C2 --> (173:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (173:16) to (173:68)
+
+  Number of Conditions: 2
+     Condition C1 --> (173:16)
+     Condition C2 --> (173:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
174
812
    }
evmmax::ecc::operator==(evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&, evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
166
298
    {
167
298
        const auto& [x1, y1, z1] = p;
168
298
        const auto& [x2, y2, z2] = q;
169
298
        const auto z1z1 = z1 * z1;
170
298
        const auto z1z1z1 = z1z1 * z1;
171
298
        const auto z2z2 = z2 * z2;
172
298
        const auto z2z2z2 = z2z2 * z2;
173
298
        return x1 * z2z2 == x2 * z1z1 && 
y1 * z2z2z2 == y2 * z1z1z16
;
  MC/DC Decision Region (173:16) to (173:68)
+
+  Number of Conditions: 2
+     Condition C1 --> (173:16)
+     Condition C2 --> (173:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
174
298
    }
evmmax::ecc::operator==(evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&, evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
166
514
    {
167
514
        const auto& [x1, y1, z1] = p;
168
514
        const auto& [x2, y2, z2] = q;
169
514
        const auto z1z1 = z1 * z1;
170
514
        const auto z1z1z1 = z1z1 * z1;
171
514
        const auto z2z2 = z2 * z2;
172
514
        const auto z2z2z2 = z2z2 * z2;
173
514
        return x1 * z2z2 == x2 * z1z1 && 
y1 * z2z2z2 == y2 * z1z1z132
;
  MC/DC Decision Region (173:16) to (173:68)
+
+  Number of Conditions: 2
+     Condition C1 --> (173:16)
+     Condition C2 --> (173:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
174
514
    }
175
176
    friend constexpr ProjPoint operator-(const ProjPoint& p) noexcept { return {p.x, -p.y, p.z}; }
177
};
178
179
// Jacobian (three) coordinates point implementation.
180
template <typename ValueT>
181
struct JacPoint
182
{
183
    ValueT x = 1;
184
    ValueT y = 1;
185
    ValueT z = 0;
186
187
    // Compares two Jacobian coordinates points
188
    friend constexpr bool operator==(const JacPoint& a, const JacPoint& b) noexcept
189
1.51k
    {
190
1.51k
        const auto bz2 = b.z * b.z;
191
1.51k
        const auto az2 = a.z * a.z;
192
193
1.51k
        const auto bz3 = bz2 * b.z;
194
1.51k
        const auto az3 = az2 * a.z;
195
196
1.51k
        return a.x * bz2 == b.x * az2 && 
a.y * bz3 == b.y * az31.04k
;
  MC/DC Decision Region (196:16) to (196:64)
+
+  Number of Conditions: 2
+     Condition C1 --> (196:16)
+     Condition C2 --> (196:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  T  = T      }
+
+  C1-Pair: covered: (1,2)
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 50.00%
+
197
1.51k
    }
198
199
    friend constexpr JacPoint operator-(const JacPoint& p) noexcept { return {p.x, -p.y, p.z}; }
200
201
    // Creates Jacobian coordinates point from affine point
202
    static constexpr JacPoint from(const ecc::Point<ValueT>& ap) noexcept
203
2.52k
    {
204
2.52k
        return {ap.x, ap.y, ValueT::one()};
205
2.52k
    }
206
};
207
208
template <typename IntT>
209
using InvFn = IntT (*)(const ModArith<IntT>&, const IntT& x) noexcept;
210
211
/// Converts a projected point to an affine point.
212
template <typename Curve>
213
inline AffinePoint<Curve> to_affine(const ProjPoint<Curve>& p) noexcept
214
5.80k
{
215
    // This works correctly for the point at infinity (z == 0) because then z_inv == 0.
216
5.80k
    const auto z_inv = 1 / p.z;
217
5.80k
    const auto zz_inv = z_inv * z_inv;
218
5.80k
    const auto zzz_inv = zz_inv * z_inv;
219
5.80k
    return {p.x * zz_inv, p.y * zzz_inv};
220
5.80k
}
evmmax::ecc::AffinePoint<evmmax::bn254::Curve> evmmax::ecc::to_affine<evmmax::bn254::Curve>(evmmax::ecc::ProjPoint<evmmax::bn254::Curve> const&)
Line
Count
Source
214
4.60k
{
215
    // This works correctly for the point at infinity (z == 0) because then z_inv == 0.
216
4.60k
    const auto z_inv = 1 / p.z;
217
4.60k
    const auto zz_inv = z_inv * z_inv;
218
4.60k
    const auto zzz_inv = zz_inv * z_inv;
219
4.60k
    return {p.x * zz_inv, p.y * zzz_inv};
220
4.60k
}
evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> evmmax::ecc::to_affine<evmmax::secp256k1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
214
682
{
215
    // This works correctly for the point at infinity (z == 0) because then z_inv == 0.
216
682
    const auto z_inv = 1 / p.z;
217
682
    const auto zz_inv = z_inv * z_inv;
218
682
    const auto zzz_inv = zz_inv * z_inv;
219
682
    return {p.x * zz_inv, p.y * zzz_inv};
220
682
}
evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> evmmax::ecc::to_affine<evmmax::secp256r1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
214
522
{
215
    // This works correctly for the point at infinity (z == 0) because then z_inv == 0.
216
522
    const auto z_inv = 1 / p.z;
217
522
    const auto zz_inv = z_inv * z_inv;
218
522
    const auto zzz_inv = zz_inv * z_inv;
219
522
    return {p.x * zz_inv, p.y * zzz_inv};
220
522
}
221
222
/// Elliptic curve point addition in affine coordinates.
223
///
224
/// Computes P ⊕ Q for two points in affine coordinates on the elliptic curve.
225
template <typename Curve>
226
AffinePoint<Curve> add(const AffinePoint<Curve>& p, const AffinePoint<Curve>& q) noexcept
227
2.59k
{
228
2.59k
    if (p == 0)
229
1.00k
        return q;
230
1.59k
    if (q == 0)
231
558
        return p;
232
233
1.03k
    const auto& [x1, y1] = p;
234
1.03k
    const auto& [x2, y2] = q;
235
236
    // Use classic formula for point addition.
237
    // https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication#Point_operations
238
239
1.03k
    auto dx = x2 - x1;
240
1.03k
    auto dy = y2 - y1;
241
1.03k
    if (dx == 0)
242
672
    {
243
672
        if (dy != 0)    // For opposite points
244
144
            return {};  // return the point at infinity.
245
246
        // For coincident points find the slope of the tangent line.
247
528
        const auto xx = x1 * x1;
248
528
        dy = xx + xx + xx;
249
528
        dx = y1 + y1;
250
528
    }
251
888
    const auto slope = dy / dx;
252
253
888
    const auto xr = slope * slope - x1 - x2;
254
888
    const auto yr = slope * (x1 - xr) - y1;
255
888
    return {xr, yr};
256
1.03k
}
evmmax::ecc::AffinePoint<evmmax::bn254::Curve> evmmax::ecc::add<evmmax::bn254::Curve>(evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&, evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&)
Line
Count
Source
227
2.59k
{
228
2.59k
    if (p == 0)
229
1.00k
        return q;
230
1.59k
    if (q == 0)
231
558
        return p;
232
233
1.03k
    const auto& [x1, y1] = p;
234
1.03k
    const auto& [x2, y2] = q;
235
236
    // Use classic formula for point addition.
237
    // https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication#Point_operations
238
239
1.03k
    auto dx = x2 - x1;
240
1.03k
    auto dy = y2 - y1;
241
1.03k
    if (dx == 0)
242
672
    {
243
672
        if (dy != 0)    // For opposite points
244
144
            return {};  // return the point at infinity.
245
246
        // For coincident points find the slope of the tangent line.
247
528
        const auto xx = x1 * x1;
248
528
        dy = xx + xx + xx;
249
528
        dx = y1 + y1;
250
528
    }
251
888
    const auto slope = dy / dx;
252
253
888
    const auto xr = slope * slope - x1 - x2;
254
888
    const auto yr = slope * (x1 - xr) - y1;
255
888
    return {xr, yr};
256
1.03k
}
Unexecuted instantiation: evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> evmmax::ecc::add<evmmax::secp256k1::Curve>(evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&, evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&)
257
258
/// Elliptic curve point addition in Jacobian coordinates.
259
///
260
/// Computes P ⊕ Q for two points in Jacobian coordinates on the elliptic curve.
261
/// This procedure handles all inputs (e.g. doubling or points at infinity).
262
template <typename Curve>
263
ProjPoint<Curve> add(const ProjPoint<Curve>& p, const ProjPoint<Curve>& q) noexcept
264
1.20k
{
265
1.20k
    if (p == 0)
266
392
        return q;
267
812
    if (q == 0)
268
0
        return p;  // TODO: Untested.
269
270
812
    if (p == q)
271
12
        return dbl(p);
272
273
    // Use the "add-1998-cmo-2" formula for curve in Jacobian coordinates.
274
    // The cost is 12M + 4S + 6add + 1*2.
275
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-add-1998-cmo-2
276
    // TODO: The newer formula "add-2007-bl" trades one multiplication for one squaring and
277
    //   additional additions. We don't have dedicated squaring operation yet, so it's not clear
278
    //   if it would be faster.
279
280
800
    const auto& [x1, y1, z1] = p;
281
800
    const auto& [x2, y2, z2] = q;
282
283
800
    const auto z1z1 = z1 * z1;
284
800
    const auto z2z2 = z2 * z2;
285
800
    const auto u1 = x1 * z2z2;
286
800
    const auto u2 = x2 * z1z1;
287
800
    const auto z1z1z1 = z1 * z1z1;
288
800
    const auto z2z2z2 = z2 * z2z2;
289
800
    const auto s1 = y1 * z2z2z2;
290
800
    const auto s2 = y2 * z1z1z1;
291
800
    const auto h = u2 - u1;
292
800
    const auto r = s2 - s1;
293
800
    assert(h != 0 || r != 0);  // We already handled p == q case above.
294
800
    const auto hh = h * h;
295
800
    const auto hhh = h * hh;
296
800
    const auto v = u1 * hh;
297
800
    const auto t2 = r * r;
298
800
    const auto t3 = v + v;
299
800
    const auto t4 = t2 - hhh;
300
800
    const auto x3 = t4 - t3;
301
800
    const auto t5 = v - x3;
302
800
    const auto t6 = s1 * hhh;
303
800
    const auto t7 = r * t5;
304
800
    const auto y3 = t7 - t6;
305
800
    const auto t8 = z2 * h;
306
800
    const auto z3 = z1 * t8;
307
308
800
    return {x3, y3, z3};
309
812
}
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> evmmax::ecc::add<evmmax::secp256k1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&, evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
264
682
{
265
682
    if (p == 0)
266
384
        return q;
267
298
    if (q == 0)
268
0
        return p;  // TODO: Untested.
269
270
298
    if (p == q)
271
0
        return dbl(p);
272
273
    // Use the "add-1998-cmo-2" formula for curve in Jacobian coordinates.
274
    // The cost is 12M + 4S + 6add + 1*2.
275
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-add-1998-cmo-2
276
    // TODO: The newer formula "add-2007-bl" trades one multiplication for one squaring and
277
    //   additional additions. We don't have dedicated squaring operation yet, so it's not clear
278
    //   if it would be faster.
279
280
298
    const auto& [x1, y1, z1] = p;
281
298
    const auto& [x2, y2, z2] = q;
282
283
298
    const auto z1z1 = z1 * z1;
284
298
    const auto z2z2 = z2 * z2;
285
298
    const auto u1 = x1 * z2z2;
286
298
    const auto u2 = x2 * z1z1;
287
298
    const auto z1z1z1 = z1 * z1z1;
288
298
    const auto z2z2z2 = z2 * z2z2;
289
298
    const auto s1 = y1 * z2z2z2;
290
298
    const auto s2 = y2 * z1z1z1;
291
298
    const auto h = u2 - u1;
292
298
    const auto r = s2 - s1;
293
298
    assert(h != 0 || r != 0);  // We already handled p == q case above.
294
298
    const auto hh = h * h;
295
298
    const auto hhh = h * hh;
296
298
    const auto v = u1 * hh;
297
298
    const auto t2 = r * r;
298
298
    const auto t3 = v + v;
299
298
    const auto t4 = t2 - hhh;
300
298
    const auto x3 = t4 - t3;
301
298
    const auto t5 = v - x3;
302
298
    const auto t6 = s1 * hhh;
303
298
    const auto t7 = r * t5;
304
298
    const auto y3 = t7 - t6;
305
298
    const auto t8 = z2 * h;
306
298
    const auto z3 = z1 * t8;
307
308
298
    return {x3, y3, z3};
309
298
}
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> evmmax::ecc::add<evmmax::secp256r1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&, evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
264
522
{
265
522
    if (p == 0)
266
8
        return q;
267
514
    if (q == 0)
268
0
        return p;  // TODO: Untested.
269
270
514
    if (p == q)
271
12
        return dbl(p);
272
273
    // Use the "add-1998-cmo-2" formula for curve in Jacobian coordinates.
274
    // The cost is 12M + 4S + 6add + 1*2.
275
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-add-1998-cmo-2
276
    // TODO: The newer formula "add-2007-bl" trades one multiplication for one squaring and
277
    //   additional additions. We don't have dedicated squaring operation yet, so it's not clear
278
    //   if it would be faster.
279
280
502
    const auto& [x1, y1, z1] = p;
281
502
    const auto& [x2, y2, z2] = q;
282
283
502
    const auto z1z1 = z1 * z1;
284
502
    const auto z2z2 = z2 * z2;
285
502
    const auto u1 = x1 * z2z2;
286
502
    const auto u2 = x2 * z1z1;
287
502
    const auto z1z1z1 = z1 * z1z1;
288
502
    const auto z2z2z2 = z2 * z2z2;
289
502
    const auto s1 = y1 * z2z2z2;
290
502
    const auto s2 = y2 * z1z1z1;
291
502
    const auto h = u2 - u1;
292
502
    const auto r = s2 - s1;
293
502
    assert(h != 0 || r != 0);  // We already handled p == q case above.
294
502
    const auto hh = h * h;
295
502
    const auto hhh = h * hh;
296
502
    const auto v = u1 * hh;
297
502
    const auto t2 = r * r;
298
502
    const auto t3 = v + v;
299
502
    const auto t4 = t2 - hhh;
300
502
    const auto x3 = t4 - t3;
301
502
    const auto t5 = v - x3;
302
502
    const auto t6 = s1 * hhh;
303
502
    const auto t7 = r * t5;
304
502
    const auto y3 = t7 - t6;
305
502
    const auto t8 = z2 * h;
306
502
    const auto z3 = z1 * t8;
307
308
502
    return {x3, y3, z3};
309
514
}
310
311
/// Mixed addition of elliptic curve points.
312
///
313
/// Computes P ⊕ Q for a point P in Jacobian coordinates and a point Q in affine coordinates.
314
/// This procedure is for use in point multiplication and not all inputs are supported.
315
template <typename Curve>
316
ProjPoint<Curve> add(const ProjPoint<Curve>& p, const AffinePoint<Curve>& q) noexcept
317
375k
{
318
375k
    assert(p != ProjPoint(q));
319
320
375k
    if (q == 0)
321
39.7k
        return p;
322
336k
    if (p == 0)
323
4.06k
        return ProjPoint(q);
324
325
    // Use the "madd" formula for curve in Jacobian coordinates.
326
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-madd
327
328
331k
    const auto& [x1, y1, z1] = p;
329
331k
    const auto& [x2, y2] = q;
330
331
331k
    const auto z1z1 = z1 * z1;
332
331k
    const auto u2 = x2 * z1z1;
333
331k
    const auto z1z1z1 = z1 * z1z1;
334
331k
    const auto s2 = y2 * z1z1z1;
335
331k
    const auto h = u2 - x1;
336
331k
    const auto t1 = h + h;
337
331k
    const auto i = t1 * t1;
338
331k
    const auto j = h * i;
339
331k
    const auto t2 = s2 - y1;
340
331k
    const auto r = t2 + t2;
341
331k
    const auto v = x1 * i;
342
331k
    const auto t3 = r * r;
343
331k
    const auto t4 = v + v;
344
331k
    const auto t5 = t3 - j;
345
331k
    const auto x3 = t5 - t4;
346
331k
    const auto t6 = v - x3;
347
331k
    const auto t7 = y1 * j;
348
331k
    const auto t8 = t7 + t7;
349
331k
    const auto t9 = r * t6;
350
331k
    const auto y3 = t9 - t8;
351
331k
    const auto t10 = z1 * h;
352
331k
    const auto z3 = t10 + t10;
353
354
331k
    return {x3, y3, z3};
355
336k
}
evmmax::ecc::ProjPoint<evmmax::bn254::Curve> evmmax::ecc::add<evmmax::bn254::Curve>(evmmax::ecc::ProjPoint<evmmax::bn254::Curve> const&, evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&)
Line
Count
Source
317
128k
{
318
128k
    assert(p != ProjPoint(q));
319
320
128k
    if (q == 0)
321
39.7k
        return p;
322
88.3k
    if (p == 0)
323
2.05k
        return ProjPoint(q);
324
325
    // Use the "madd" formula for curve in Jacobian coordinates.
326
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-madd
327
328
86.2k
    const auto& [x1, y1, z1] = p;
329
86.2k
    const auto& [x2, y2] = q;
330
331
86.2k
    const auto z1z1 = z1 * z1;
332
86.2k
    const auto u2 = x2 * z1z1;
333
86.2k
    const auto z1z1z1 = z1 * z1z1;
334
86.2k
    const auto s2 = y2 * z1z1z1;
335
86.2k
    const auto h = u2 - x1;
336
86.2k
    const auto t1 = h + h;
337
86.2k
    const auto i = t1 * t1;
338
86.2k
    const auto j = h * i;
339
86.2k
    const auto t2 = s2 - y1;
340
86.2k
    const auto r = t2 + t2;
341
86.2k
    const auto v = x1 * i;
342
86.2k
    const auto t3 = r * r;
343
86.2k
    const auto t4 = v + v;
344
86.2k
    const auto t5 = t3 - j;
345
86.2k
    const auto x3 = t5 - t4;
346
86.2k
    const auto t6 = v - x3;
347
86.2k
    const auto t7 = y1 * j;
348
86.2k
    const auto t8 = t7 + t7;
349
86.2k
    const auto t9 = r * t6;
350
86.2k
    const auto y3 = t9 - t8;
351
86.2k
    const auto t10 = z1 * h;
352
86.2k
    const auto z3 = t10 + t10;
353
354
86.2k
    return {x3, y3, z3};
355
88.3k
}
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> evmmax::ecc::add<evmmax::secp256k1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&, evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
317
118k
{
318
118k
    assert(p != ProjPoint(q));
319
320
118k
    if (q == 0)
321
0
        return p;
322
118k
    if (p == 0)
323
980
        return ProjPoint(q);
324
325
    // Use the "madd" formula for curve in Jacobian coordinates.
326
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-madd
327
328
117k
    const auto& [x1, y1, z1] = p;
329
117k
    const auto& [x2, y2] = q;
330
331
117k
    const auto z1z1 = z1 * z1;
332
117k
    const auto u2 = x2 * z1z1;
333
117k
    const auto z1z1z1 = z1 * z1z1;
334
117k
    const auto s2 = y2 * z1z1z1;
335
117k
    const auto h = u2 - x1;
336
117k
    const auto t1 = h + h;
337
117k
    const auto i = t1 * t1;
338
117k
    const auto j = h * i;
339
117k
    const auto t2 = s2 - y1;
340
117k
    const auto r = t2 + t2;
341
117k
    const auto v = x1 * i;
342
117k
    const auto t3 = r * r;
343
117k
    const auto t4 = v + v;
344
117k
    const auto t5 = t3 - j;
345
117k
    const auto x3 = t5 - t4;
346
117k
    const auto t6 = v - x3;
347
117k
    const auto t7 = y1 * j;
348
117k
    const auto t8 = t7 + t7;
349
117k
    const auto t9 = r * t6;
350
117k
    const auto y3 = t9 - t8;
351
117k
    const auto t10 = z1 * h;
352
117k
    const auto z3 = t10 + t10;
353
354
117k
    return {x3, y3, z3};
355
118k
}
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> evmmax::ecc::add<evmmax::secp256r1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&, evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
317
129k
{
318
129k
    assert(p != ProjPoint(q));
319
320
129k
    if (q == 0)
321
0
        return p;
322
129k
    if (p == 0)
323
1.03k
        return ProjPoint(q);
324
325
    // Use the "madd" formula for curve in Jacobian coordinates.
326
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-madd
327
328
128k
    const auto& [x1, y1, z1] = p;
329
128k
    const auto& [x2, y2] = q;
330
331
128k
    const auto z1z1 = z1 * z1;
332
128k
    const auto u2 = x2 * z1z1;
333
128k
    const auto z1z1z1 = z1 * z1z1;
334
128k
    const auto s2 = y2 * z1z1z1;
335
128k
    const auto h = u2 - x1;
336
128k
    const auto t1 = h + h;
337
128k
    const auto i = t1 * t1;
338
128k
    const auto j = h * i;
339
128k
    const auto t2 = s2 - y1;
340
128k
    const auto r = t2 + t2;
341
128k
    const auto v = x1 * i;
342
128k
    const auto t3 = r * r;
343
128k
    const auto t4 = v + v;
344
128k
    const auto t5 = t3 - j;
345
128k
    const auto x3 = t5 - t4;
346
128k
    const auto t6 = v - x3;
347
128k
    const auto t7 = y1 * j;
348
128k
    const auto t8 = t7 + t7;
349
128k
    const auto t9 = r * t6;
350
128k
    const auto y3 = t9 - t8;
351
128k
    const auto t10 = z1 * h;
352
128k
    const auto z3 = t10 + t10;
353
354
128k
    return {x3, y3, z3};
355
129k
}
356
357
template <typename Curve>
358
ProjPoint<Curve> dbl(const ProjPoint<Curve>& p) noexcept
359
816k
{
360
816k
    const auto& [x1, y1, z1] = p;
361
362
    if constexpr (Curve::A == 0)
363
565k
    {
364
        // Use the "dbl-2009-l" formula for a=0 curve in Jacobian coordinates.
365
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
366
367
565k
        const auto xx = x1 * x1;
368
565k
        const auto yy = y1 * y1;
369
565k
        const auto yyyy = yy * yy;
370
565k
        const auto t0 = x1 + yy;
371
565k
        const auto t1 = t0 * t0;
372
565k
        const auto t2 = t1 - xx;
373
565k
        const auto t3 = t2 - yyyy;
374
565k
        const auto d = t3 + t3;
375
565k
        const auto e = xx + xx + xx;
376
565k
        const auto f = e * e;
377
565k
        const auto t4 = d + d;
378
565k
        const auto x3 = f - t4;
379
565k
        const auto t6 = d - x3;
380
565k
        const auto t8 = yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy;
381
565k
        const auto t9 = e * t6;
382
565k
        const auto y3 = t9 - t8;
383
565k
        const auto t10 = y1 * z1;
384
565k
        const auto z3 = t10 + t10;
385
565k
        return {x3, y3, z3};
386
    }
387
    else if constexpr (Curve::A == Curve::FIELD_PRIME - 3)
388
250k
    {
389
        // Use the "dbl-2001-b" doubling formula.
390
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b
391
392
250k
        const auto zz = z1 * z1;
393
250k
        const auto yy = y1 * y1;
394
250k
        const auto xyy = x1 * yy;
395
250k
        const auto t0 = x1 - zz;
396
250k
        const auto t1 = x1 + zz;
397
250k
        const auto t2 = t0 * t1;
398
250k
        const auto alpha = t2 + t2 + t2;
399
250k
        const auto t3 = alpha * alpha;
400
250k
        const auto t4 = xyy + xyy + xyy + xyy + xyy + xyy + xyy + xyy;
401
250k
        const auto x3 = t3 - t4;
402
250k
        const auto t5 = y1 + z1;
403
250k
        const auto t6 = t5 * t5;
404
250k
        const auto t7 = t6 - yy;
405
250k
        const auto z3 = t7 - zz;
406
250k
        const auto t8 = xyy + xyy + xyy + xyy;
407
250k
        const auto t9 = t8 - x3;
408
250k
        const auto t10 = yy * yy;
409
250k
        const auto t11 = t10 + t10 + t10 + t10 + t10 + t10 + t10 + t10;
410
250k
        const auto t12 = alpha * t9;
411
250k
        const auto y3 = t12 - t11;
412
250k
        return {x3, y3, z3};
413
    }
414
    else
415
    {
416
        // TODO(c++23): Use fake always-false condition for older compilers.
417
        static_assert(Curve::A == 0, "unsupported Curve::A value");
418
    }
419
816k
}
evmmax::ecc::ProjPoint<evmmax::bn254::Curve> evmmax::ecc::dbl<evmmax::bn254::Curve>(evmmax::ecc::ProjPoint<evmmax::bn254::Curve> const&)
Line
Count
Source
359
315k
{
360
315k
    const auto& [x1, y1, z1] = p;
361
362
    if constexpr (Curve::A == 0)
363
315k
    {
364
        // Use the "dbl-2009-l" formula for a=0 curve in Jacobian coordinates.
365
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
366
367
315k
        const auto xx = x1 * x1;
368
315k
        const auto yy = y1 * y1;
369
315k
        const auto yyyy = yy * yy;
370
315k
        const auto t0 = x1 + yy;
371
315k
        const auto t1 = t0 * t0;
372
315k
        const auto t2 = t1 - xx;
373
315k
        const auto t3 = t2 - yyyy;
374
315k
        const auto d = t3 + t3;
375
315k
        const auto e = xx + xx + xx;
376
315k
        const auto f = e * e;
377
315k
        const auto t4 = d + d;
378
315k
        const auto x3 = f - t4;
379
315k
        const auto t6 = d - x3;
380
315k
        const auto t8 = yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy;
381
315k
        const auto t9 = e * t6;
382
315k
        const auto y3 = t9 - t8;
383
315k
        const auto t10 = y1 * z1;
384
315k
        const auto z3 = t10 + t10;
385
315k
        return {x3, y3, z3};
386
    }
387
    else if constexpr (Curve::A == Curve::FIELD_PRIME - 3)
388
    {
389
        // Use the "dbl-2001-b" doubling formula.
390
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b
391
392
        const auto zz = z1 * z1;
393
        const auto yy = y1 * y1;
394
        const auto xyy = x1 * yy;
395
        const auto t0 = x1 - zz;
396
        const auto t1 = x1 + zz;
397
        const auto t2 = t0 * t1;
398
        const auto alpha = t2 + t2 + t2;
399
        const auto t3 = alpha * alpha;
400
        const auto t4 = xyy + xyy + xyy + xyy + xyy + xyy + xyy + xyy;
401
        const auto x3 = t3 - t4;
402
        const auto t5 = y1 + z1;
403
        const auto t6 = t5 * t5;
404
        const auto t7 = t6 - yy;
405
        const auto z3 = t7 - zz;
406
        const auto t8 = xyy + xyy + xyy + xyy;
407
        const auto t9 = t8 - x3;
408
        const auto t10 = yy * yy;
409
        const auto t11 = t10 + t10 + t10 + t10 + t10 + t10 + t10 + t10;
410
        const auto t12 = alpha * t9;
411
        const auto y3 = t12 - t11;
412
        return {x3, y3, z3};
413
    }
414
    else
415
    {
416
        // TODO(c++23): Use fake always-false condition for older compilers.
417
        static_assert(Curve::A == 0, "unsupported Curve::A value");
418
    }
419
315k
}
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> evmmax::ecc::dbl<evmmax::secp256k1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
359
250k
{
360
250k
    const auto& [x1, y1, z1] = p;
361
362
    if constexpr (Curve::A == 0)
363
250k
    {
364
        // Use the "dbl-2009-l" formula for a=0 curve in Jacobian coordinates.
365
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
366
367
250k
        const auto xx = x1 * x1;
368
250k
        const auto yy = y1 * y1;
369
250k
        const auto yyyy = yy * yy;
370
250k
        const auto t0 = x1 + yy;
371
250k
        const auto t1 = t0 * t0;
372
250k
        const auto t2 = t1 - xx;
373
250k
        const auto t3 = t2 - yyyy;
374
250k
        const auto d = t3 + t3;
375
250k
        const auto e = xx + xx + xx;
376
250k
        const auto f = e * e;
377
250k
        const auto t4 = d + d;
378
250k
        const auto x3 = f - t4;
379
250k
        const auto t6 = d - x3;
380
250k
        const auto t8 = yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy;
381
250k
        const auto t9 = e * t6;
382
250k
        const auto y3 = t9 - t8;
383
250k
        const auto t10 = y1 * z1;
384
250k
        const auto z3 = t10 + t10;
385
250k
        return {x3, y3, z3};
386
    }
387
    else if constexpr (Curve::A == Curve::FIELD_PRIME - 3)
388
    {
389
        // Use the "dbl-2001-b" doubling formula.
390
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b
391
392
        const auto zz = z1 * z1;
393
        const auto yy = y1 * y1;
394
        const auto xyy = x1 * yy;
395
        const auto t0 = x1 - zz;
396
        const auto t1 = x1 + zz;
397
        const auto t2 = t0 * t1;
398
        const auto alpha = t2 + t2 + t2;
399
        const auto t3 = alpha * alpha;
400
        const auto t4 = xyy + xyy + xyy + xyy + xyy + xyy + xyy + xyy;
401
        const auto x3 = t3 - t4;
402
        const auto t5 = y1 + z1;
403
        const auto t6 = t5 * t5;
404
        const auto t7 = t6 - yy;
405
        const auto z3 = t7 - zz;
406
        const auto t8 = xyy + xyy + xyy + xyy;
407
        const auto t9 = t8 - x3;
408
        const auto t10 = yy * yy;
409
        const auto t11 = t10 + t10 + t10 + t10 + t10 + t10 + t10 + t10;
410
        const auto t12 = alpha * t9;
411
        const auto y3 = t12 - t11;
412
        return {x3, y3, z3};
413
    }
414
    else
415
    {
416
        // TODO(c++23): Use fake always-false condition for older compilers.
417
        static_assert(Curve::A == 0, "unsupported Curve::A value");
418
    }
419
250k
}
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> evmmax::ecc::dbl<evmmax::secp256r1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
359
250k
{
360
250k
    const auto& [x1, y1, z1] = p;
361
362
    if constexpr (Curve::A == 0)
363
    {
364
        // Use the "dbl-2009-l" formula for a=0 curve in Jacobian coordinates.
365
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
366
367
        const auto xx = x1 * x1;
368
        const auto yy = y1 * y1;
369
        const auto yyyy = yy * yy;
370
        const auto t0 = x1 + yy;
371
        const auto t1 = t0 * t0;
372
        const auto t2 = t1 - xx;
373
        const auto t3 = t2 - yyyy;
374
        const auto d = t3 + t3;
375
        const auto e = xx + xx + xx;
376
        const auto f = e * e;
377
        const auto t4 = d + d;
378
        const auto x3 = f - t4;
379
        const auto t6 = d - x3;
380
        const auto t8 = yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy;
381
        const auto t9 = e * t6;
382
        const auto y3 = t9 - t8;
383
        const auto t10 = y1 * z1;
384
        const auto z3 = t10 + t10;
385
        return {x3, y3, z3};
386
    }
387
    else if constexpr (Curve::A == Curve::FIELD_PRIME - 3)
388
250k
    {
389
        // Use the "dbl-2001-b" doubling formula.
390
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b
391
392
250k
        const auto zz = z1 * z1;
393
250k
        const auto yy = y1 * y1;
394
250k
        const auto xyy = x1 * yy;
395
250k
        const auto t0 = x1 - zz;
396
250k
        const auto t1 = x1 + zz;
397
250k
        const auto t2 = t0 * t1;
398
250k
        const auto alpha = t2 + t2 + t2;
399
250k
        const auto t3 = alpha * alpha;
400
250k
        const auto t4 = xyy + xyy + xyy + xyy + xyy + xyy + xyy + xyy;
401
250k
        const auto x3 = t3 - t4;
402
250k
        const auto t5 = y1 + z1;
403
250k
        const auto t6 = t5 * t5;
404
250k
        const auto t7 = t6 - yy;
405
250k
        const auto z3 = t7 - zz;
406
250k
        const auto t8 = xyy + xyy + xyy + xyy;
407
250k
        const auto t9 = t8 - x3;
408
250k
        const auto t10 = yy * yy;
409
250k
        const auto t11 = t10 + t10 + t10 + t10 + t10 + t10 + t10 + t10;
410
250k
        const auto t12 = alpha * t9;
411
250k
        const auto y3 = t12 - t11;
412
250k
        return {x3, y3, z3};
413
    }
414
    else
415
    {
416
        // TODO(c++23): Use fake always-false condition for older compilers.
417
        static_assert(Curve::A == 0, "unsupported Curve::A value");
418
    }
419
250k
}
420
421
template <typename Curve>
422
ProjPoint<Curve> mul(const AffinePoint<Curve>& p, typename Curve::uint_type c) noexcept
423
7.01k
{
424
7.01k
    using IntT = Curve::uint_type;
425
426
    // Reduce the scalar by the curve group order.
427
    // This allows using more efficient add algorithm in the loop because doubling cannot happen.
428
9.59k
    while (true)
429
9.59k
    {
430
9.59k
        const auto [reduced_c, less_than] = subc(c, Curve::ORDER);
431
9.59k
        if (less_than) [[likely]]
432
7.01k
            break;
433
2.58k
        c = reduced_c;
434
2.58k
    }
435
436
7.01k
    ProjPoint<Curve> r;
437
7.01k
    const auto bit_width = sizeof(IntT) * 8 - intx::clz(c);
438
823k
    for (auto i = bit_width; i != 0; 
--i816k
)
439
816k
    {
440
816k
        r = ecc::dbl(r);
441
816k
        if ((c & (IntT{1} << (i - 1))) != 0)  // if the i-th bit in the scalar is set
442
375k
            r = ecc::add(r, p);
443
816k
    }
444
7.01k
    return r;
445
7.01k
}
evmmax::ecc::ProjPoint<evmmax::bn254::Curve> evmmax::ecc::mul<evmmax::bn254::Curve>(evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&, evmmax::bn254::Curve::uint_type)
Line
Count
Source
423
4.60k
{
424
4.60k
    using IntT = Curve::uint_type;
425
426
    // Reduce the scalar by the curve group order.
427
    // This allows using more efficient add algorithm in the loop because doubling cannot happen.
428
7.19k
    while (true)
429
7.19k
    {
430
7.19k
        const auto [reduced_c, less_than] = subc(c, Curve::ORDER);
431
7.19k
        if (less_than) [[likely]]
432
4.60k
            break;
433
2.58k
        c = reduced_c;
434
2.58k
    }
435
436
4.60k
    ProjPoint<Curve> r;
437
4.60k
    const auto bit_width = sizeof(IntT) * 8 - intx::clz(c);
438
319k
    for (auto i = bit_width; i != 0; 
--i315k
)
439
315k
    {
440
315k
        r = ecc::dbl(r);
441
315k
        if ((c & (IntT{1} << (i - 1))) != 0)  // if the i-th bit in the scalar is set
442
128k
            r = ecc::add(r, p);
443
315k
    }
444
4.60k
    return r;
445
4.60k
}
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> evmmax::ecc::mul<evmmax::secp256k1::Curve>(evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&, evmmax::secp256k1::Curve::uint_type)
Line
Count
Source
423
1.36k
{
424
1.36k
    using IntT = Curve::uint_type;
425
426
    // Reduce the scalar by the curve group order.
427
    // This allows using more efficient add algorithm in the loop because doubling cannot happen.
428
1.36k
    while (true)
429
1.36k
    {
430
1.36k
        const auto [reduced_c, less_than] = subc(c, Curve::ORDER);
431
1.36k
        if (less_than) [[likely]]
432
1.36k
            break;
433
0
        c = reduced_c;
434
0
    }
435
436
1.36k
    ProjPoint<Curve> r;
437
1.36k
    const auto bit_width = sizeof(IntT) * 8 - intx::clz(c);
438
251k
    for (auto i = bit_width; i != 0; 
--i250k
)
439
250k
    {
440
250k
        r = ecc::dbl(r);
441
250k
        if ((c & (IntT{1} << (i - 1))) != 0)  // if the i-th bit in the scalar is set
442
118k
            r = ecc::add(r, p);
443
250k
    }
444
1.36k
    return r;
445
1.36k
}
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> evmmax::ecc::mul<evmmax::secp256r1::Curve>(evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> const&, evmmax::secp256r1::Curve::uint_type)
Line
Count
Source
423
1.04k
{
424
1.04k
    using IntT = Curve::uint_type;
425
426
    // Reduce the scalar by the curve group order.
427
    // This allows using more efficient add algorithm in the loop because doubling cannot happen.
428
1.04k
    while (true)
429
1.04k
    {
430
1.04k
        const auto [reduced_c, less_than] = subc(c, Curve::ORDER);
431
1.04k
        if (less_than) [[likely]]
432
1.04k
            break;
433
0
        c = reduced_c;
434
0
    }
435
436
1.04k
    ProjPoint<Curve> r;
437
1.04k
    const auto bit_width = sizeof(IntT) * 8 - intx::clz(c);
438
251k
    for (auto i = bit_width; i != 0; 
--i250k
)
439
250k
    {
440
250k
        r = ecc::dbl(r);
441
250k
        if ((c & (IntT{1} << (i - 1))) != 0)  // if the i-th bit in the scalar is set
442
129k
            r = ecc::add(r, p);
443
250k
    }
444
1.04k
    return r;
445
1.04k
}
446
}  // namespace evmmax::ecc
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/keccak.c.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/keccak.c.html new file mode 100644 index 0000000000..8ce88f8f64 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/keccak.c.html @@ -0,0 +1,15 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/keccak.c
Line
Count
Source
1
// ethash: C/C++ implementation of Ethash, the Ethereum Proof of Work algorithm.
2
// Copyright 2018 Pawel Bylica.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "keccak.h"
6
7
// Provide __has_attribute macro if not defined.
8
#ifndef __has_attribute
9
#define __has_attribute(name) 0
10
#endif
11
12
// Provide __has_builtin macro if not defined.
13
#ifndef __has_builtin
14
#define __has_builtin(x) 0
15
#endif
16
17
// [[always_inline]]
18
#if defined(_MSC_VER)
19
#define ALWAYS_INLINE __forceinline
20
#elif __has_attribute(always_inline)
21
#define ALWAYS_INLINE __attribute__((always_inline))
22
#else
23
#define ALWAYS_INLINE
24
#endif
25
26
#if !__has_builtin(__builtin_memcpy) && !defined(__GNUC__)
27
#include <string.h>
28
#define __builtin_memcpy memcpy
29
#endif
30
31
#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
32
#define to_le64(X) __builtin_bswap64(X)
33
#else
34
777M
#define to_le64(X) X
35
#endif
36
37
/// Loads 64-bit integer from given memory location as little-endian number.
38
static inline ALWAYS_INLINE uint64_t load_le(const uint8_t* data)
39
567M
{
40
    /* memcpy is the best way of expressing the intention. Every compiler will
41
       optimize is to single load instruction if the target architecture
42
       supports unaligned memory access (GCC and clang even in O0).
43
       This is great trick because we are violating C/C++ memory alignment
44
       restrictions with no performance penalty. */
45
567M
    uint64_t word;
46
567M
    __builtin_memcpy(&word, data, sizeof(word));
47
567M
    return to_le64(word);
48
567M
}
49
50
/// Rotates the bits of x left by the count value specified by s.
51
/// The s must be in range <0, 64> exclusively, otherwise the result is undefined.
52
static inline uint64_t rol(uint64_t x, unsigned s)
53
42.1G
{
54
42.1G
    return (x << s) | (x >> (64 - s));
55
42.1G
}
56
57
static const uint64_t round_constants[24] = {  //
58
    0x0000000000000001, 0x0000000000008082, 0x800000000000808a, 0x8000000080008000,
59
    0x000000000000808b, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009,
60
    0x000000000000008a, 0x0000000000000088, 0x0000000080008009, 0x000000008000000a,
61
    0x000000008000808b, 0x800000000000008b, 0x8000000000008089, 0x8000000000008003,
62
    0x8000000000008002, 0x8000000000000080, 0x000000000000800a, 0x800000008000000a,
63
    0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008};
64
65
66
/// The Keccak-f[1600] function.
67
///
68
/// The implementation of the Keccak-f function with 1600-bit width of the permutation (b).
69
/// The size of the state is also 1600 bit what gives 25 64-bit words.
70
///
71
/// @param state  The state of 25 64-bit words on which the permutation is to be performed.
72
///
73
/// The implementation based on:
74
/// - "simple" implementation by Ronny Van Keer, included in "Reference and optimized code in C",
75
///   https://keccak.team/archives.html, CC0-1.0 / Public Domain.
76
static inline ALWAYS_INLINE void keccakf1600_implementation(uint64_t state[25])
77
60.5M
{
78
60.5M
    uint64_t Aba, Abe, Abi, Abo, Abu;
79
60.5M
    uint64_t Aga, Age, Agi, Ago, Agu;
80
60.5M
    uint64_t Aka, Ake, Aki, Ako, Aku;
81
60.5M
    uint64_t Ama, Ame, Ami, Amo, Amu;
82
60.5M
    uint64_t Asa, Ase, Asi, Aso, Asu;
83
84
60.5M
    uint64_t Eba, Ebe, Ebi, Ebo, Ebu;
85
60.5M
    uint64_t Ega, Ege, Egi, Ego, Egu;
86
60.5M
    uint64_t Eka, Eke, Eki, Eko, Eku;
87
60.5M
    uint64_t Ema, Eme, Emi, Emo, Emu;
88
60.5M
    uint64_t Esa, Ese, Esi, Eso, Esu;
89
90
60.5M
    uint64_t Ba, Be, Bi, Bo, Bu;
91
92
60.5M
    uint64_t Da, De, Di, Do, Du;
93
94
60.5M
    Aba = state[0];
95
60.5M
    Abe = state[1];
96
60.5M
    Abi = state[2];
97
60.5M
    Abo = state[3];
98
60.5M
    Abu = state[4];
99
60.5M
    Aga = state[5];
100
60.5M
    Age = state[6];
101
60.5M
    Agi = state[7];
102
60.5M
    Ago = state[8];
103
60.5M
    Agu = state[9];
104
60.5M
    Aka = state[10];
105
60.5M
    Ake = state[11];
106
60.5M
    Aki = state[12];
107
60.5M
    Ako = state[13];
108
60.5M
    Aku = state[14];
109
60.5M
    Ama = state[15];
110
60.5M
    Ame = state[16];
111
60.5M
    Ami = state[17];
112
60.5M
    Amo = state[18];
113
60.5M
    Amu = state[19];
114
60.5M
    Asa = state[20];
115
60.5M
    Ase = state[21];
116
60.5M
    Asi = state[22];
117
60.5M
    Aso = state[23];
118
60.5M
    Asu = state[24];
119
120
786M
    for (size_t n = 0; n < 24; 
n += 2726M
)
121
726M
    {
122
        // Round (n + 0): Axx -> Exx
123
124
726M
        Ba = Aba ^ Aga ^ Aka ^ Ama ^ Asa;
125
726M
        Be = Abe ^ Age ^ Ake ^ Ame ^ Ase;
126
726M
        Bi = Abi ^ Agi ^ Aki ^ Ami ^ Asi;
127
726M
        Bo = Abo ^ Ago ^ Ako ^ Amo ^ Aso;
128
726M
        Bu = Abu ^ Agu ^ Aku ^ Amu ^ Asu;
129
130
726M
        Da = Bu ^ rol(Be, 1);
131
726M
        De = Ba ^ rol(Bi, 1);
132
726M
        Di = Be ^ rol(Bo, 1);
133
726M
        Do = Bi ^ rol(Bu, 1);
134
726M
        Du = Bo ^ rol(Ba, 1);
135
136
726M
        Ba = Aba ^ Da;
137
726M
        Be = rol(Age ^ De, 44);
138
726M
        Bi = rol(Aki ^ Di, 43);
139
726M
        Bo = rol(Amo ^ Do, 21);
140
726M
        Bu = rol(Asu ^ Du, 14);
141
726M
        Eba = Ba ^ (~Be & Bi) ^ round_constants[n];
142
726M
        Ebe = Be ^ (~Bi & Bo);
143
726M
        Ebi = Bi ^ (~Bo & Bu);
144
726M
        Ebo = Bo ^ (~Bu & Ba);
145
726M
        Ebu = Bu ^ (~Ba & Be);
146
147
726M
        Ba = rol(Abo ^ Do, 28);
148
726M
        Be = rol(Agu ^ Du, 20);
149
726M
        Bi = rol(Aka ^ Da, 3);
150
726M
        Bo = rol(Ame ^ De, 45);
151
726M
        Bu = rol(Asi ^ Di, 61);
152
726M
        Ega = Ba ^ (~Be & Bi);
153
726M
        Ege = Be ^ (~Bi & Bo);
154
726M
        Egi = Bi ^ (~Bo & Bu);
155
726M
        Ego = Bo ^ (~Bu & Ba);
156
726M
        Egu = Bu ^ (~Ba & Be);
157
158
726M
        Ba = rol(Abe ^ De, 1);
159
726M
        Be = rol(Agi ^ Di, 6);
160
726M
        Bi = rol(Ako ^ Do, 25);
161
726M
        Bo = rol(Amu ^ Du, 8);
162
726M
        Bu = rol(Asa ^ Da, 18);
163
726M
        Eka = Ba ^ (~Be & Bi);
164
726M
        Eke = Be ^ (~Bi & Bo);
165
726M
        Eki = Bi ^ (~Bo & Bu);
166
726M
        Eko = Bo ^ (~Bu & Ba);
167
726M
        Eku = Bu ^ (~Ba & Be);
168
169
726M
        Ba = rol(Abu ^ Du, 27);
170
726M
        Be = rol(Aga ^ Da, 36);
171
726M
        Bi = rol(Ake ^ De, 10);
172
726M
        Bo = rol(Ami ^ Di, 15);
173
726M
        Bu = rol(Aso ^ Do, 56);
174
726M
        Ema = Ba ^ (~Be & Bi);
175
726M
        Eme = Be ^ (~Bi & Bo);
176
726M
        Emi = Bi ^ (~Bo & Bu);
177
726M
        Emo = Bo ^ (~Bu & Ba);
178
726M
        Emu = Bu ^ (~Ba & Be);
179
180
726M
        Ba = rol(Abi ^ Di, 62);
181
726M
        Be = rol(Ago ^ Do, 55);
182
726M
        Bi = rol(Aku ^ Du, 39);
183
726M
        Bo = rol(Ama ^ Da, 41);
184
726M
        Bu = rol(Ase ^ De, 2);
185
726M
        Esa = Ba ^ (~Be & Bi);
186
726M
        Ese = Be ^ (~Bi & Bo);
187
726M
        Esi = Bi ^ (~Bo & Bu);
188
726M
        Eso = Bo ^ (~Bu & Ba);
189
726M
        Esu = Bu ^ (~Ba & Be);
190
191
192
        // Round (n + 1): Exx -> Axx
193
194
726M
        Ba = Eba ^ Ega ^ Eka ^ Ema ^ Esa;
195
726M
        Be = Ebe ^ Ege ^ Eke ^ Eme ^ Ese;
196
726M
        Bi = Ebi ^ Egi ^ Eki ^ Emi ^ Esi;
197
726M
        Bo = Ebo ^ Ego ^ Eko ^ Emo ^ Eso;
198
726M
        Bu = Ebu ^ Egu ^ Eku ^ Emu ^ Esu;
199
200
726M
        Da = Bu ^ rol(Be, 1);
201
726M
        De = Ba ^ rol(Bi, 1);
202
726M
        Di = Be ^ rol(Bo, 1);
203
726M
        Do = Bi ^ rol(Bu, 1);
204
726M
        Du = Bo ^ rol(Ba, 1);
205
206
726M
        Ba = Eba ^ Da;
207
726M
        Be = rol(Ege ^ De, 44);
208
726M
        Bi = rol(Eki ^ Di, 43);
209
726M
        Bo = rol(Emo ^ Do, 21);
210
726M
        Bu = rol(Esu ^ Du, 14);
211
726M
        Aba = Ba ^ (~Be & Bi) ^ round_constants[n + 1];
212
726M
        Abe = Be ^ (~Bi & Bo);
213
726M
        Abi = Bi ^ (~Bo & Bu);
214
726M
        Abo = Bo ^ (~Bu & Ba);
215
726M
        Abu = Bu ^ (~Ba & Be);
216
217
726M
        Ba = rol(Ebo ^ Do, 28);
218
726M
        Be = rol(Egu ^ Du, 20);
219
726M
        Bi = rol(Eka ^ Da, 3);
220
726M
        Bo = rol(Eme ^ De, 45);
221
726M
        Bu = rol(Esi ^ Di, 61);
222
726M
        Aga = Ba ^ (~Be & Bi);
223
726M
        Age = Be ^ (~Bi & Bo);
224
726M
        Agi = Bi ^ (~Bo & Bu);
225
726M
        Ago = Bo ^ (~Bu & Ba);
226
726M
        Agu = Bu ^ (~Ba & Be);
227
228
726M
        Ba = rol(Ebe ^ De, 1);
229
726M
        Be = rol(Egi ^ Di, 6);
230
726M
        Bi = rol(Eko ^ Do, 25);
231
726M
        Bo = rol(Emu ^ Du, 8);
232
726M
        Bu = rol(Esa ^ Da, 18);
233
726M
        Aka = Ba ^ (~Be & Bi);
234
726M
        Ake = Be ^ (~Bi & Bo);
235
726M
        Aki = Bi ^ (~Bo & Bu);
236
726M
        Ako = Bo ^ (~Bu & Ba);
237
726M
        Aku = Bu ^ (~Ba & Be);
238
239
726M
        Ba = rol(Ebu ^ Du, 27);
240
726M
        Be = rol(Ega ^ Da, 36);
241
726M
        Bi = rol(Eke ^ De, 10);
242
726M
        Bo = rol(Emi ^ Di, 15);
243
726M
        Bu = rol(Eso ^ Do, 56);
244
726M
        Ama = Ba ^ (~Be & Bi);
245
726M
        Ame = Be ^ (~Bi & Bo);
246
726M
        Ami = Bi ^ (~Bo & Bu);
247
726M
        Amo = Bo ^ (~Bu & Ba);
248
726M
        Amu = Bu ^ (~Ba & Be);
249
250
726M
        Ba = rol(Ebi ^ Di, 62);
251
726M
        Be = rol(Ego ^ Do, 55);
252
726M
        Bi = rol(Eku ^ Du, 39);
253
726M
        Bo = rol(Ema ^ Da, 41);
254
726M
        Bu = rol(Ese ^ De, 2);
255
726M
        Asa = Ba ^ (~Be & Bi);
256
726M
        Ase = Be ^ (~Bi & Bo);
257
726M
        Asi = Bi ^ (~Bo & Bu);
258
726M
        Aso = Bo ^ (~Bu & Ba);
259
726M
        Asu = Bu ^ (~Ba & Be);
260
726M
    }
261
262
60.5M
    state[0] = Aba;
263
60.5M
    state[1] = Abe;
264
60.5M
    state[2] = Abi;
265
60.5M
    state[3] = Abo;
266
60.5M
    state[4] = Abu;
267
60.5M
    state[5] = Aga;
268
60.5M
    state[6] = Age;
269
60.5M
    state[7] = Agi;
270
60.5M
    state[8] = Ago;
271
60.5M
    state[9] = Agu;
272
60.5M
    state[10] = Aka;
273
60.5M
    state[11] = Ake;
274
60.5M
    state[12] = Aki;
275
60.5M
    state[13] = Ako;
276
60.5M
    state[14] = Aku;
277
60.5M
    state[15] = Ama;
278
60.5M
    state[16] = Ame;
279
60.5M
    state[17] = Ami;
280
60.5M
    state[18] = Amo;
281
60.5M
    state[19] = Amu;
282
60.5M
    state[20] = Asa;
283
60.5M
    state[21] = Ase;
284
60.5M
    state[22] = Asi;
285
60.5M
    state[23] = Aso;
286
60.5M
    state[24] = Asu;
287
60.5M
}
288
289
static void keccakf1600_generic(uint64_t state[25])
290
0
{
291
0
    keccakf1600_implementation(state);
292
0
}
293
294
/// The pointer to the best Keccak-f[1600] function implementation,
295
/// selected during runtime initialization.
296
static void (*keccakf1600_best)(uint64_t[25]) = keccakf1600_generic;
297
298
299
#if !defined(_MSC_VER) && defined(__x86_64__) && __has_attribute(target)
300
__attribute__((target("bmi,bmi2"))) static void keccakf1600_bmi(uint64_t state[25])
301
60.5M
{
302
60.5M
    keccakf1600_implementation(state);
303
60.5M
}
304
305
__attribute__((constructor)) static void select_keccakf1600_implementation(void)
306
4
{
307
    // Init CPU information.
308
    // This is needed on macOS because of the bug: https://bugs.llvm.org/show_bug.cgi?id=48459.
309
4
    __builtin_cpu_init();
310
311
    // Check if both BMI and BMI2 are supported. Some CPUs like Intel E5-2697 v2 incorrectly
312
    // report BMI2 but not BMI being available.
313
4
    if (__builtin_cpu_supports("bmi") && __builtin_cpu_supports("bmi2"))
  MC/DC Decision Region (313:9) to (313:72)
+
+  Number of Conditions: 2
+     Condition C1 --> (313:9)
+     Condition C2 --> (313:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { T,  T  = T      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
314
4
        keccakf1600_best = keccakf1600_bmi;
315
4
}
316
#endif
317
318
319
static inline ALWAYS_INLINE void keccak(
320
    uint64_t* out, size_t bits, const uint8_t* data, size_t size)
321
42.0M
{
322
42.0M
    static const size_t word_size = sizeof(uint64_t);
323
42.0M
    const size_t hash_size = bits / 8;
324
42.0M
    const size_t block_size = (1600 - bits * 2) / 8;
325
326
42.0M
    size_t i;
327
42.0M
    uint64_t* state_iter;
328
42.0M
    uint64_t last_word = 0;
329
42.0M
    uint8_t* last_word_iter = (uint8_t*)&last_word;
330
331
42.0M
    uint64_t state[25] = {0};
332
333
60.5M
    while (size >= block_size)
334
18.4M
    {
335
331M
        for (i = 0; i < (block_size / word_size); 
++i312M
)
336
312M
        {
337
312M
            state[i] ^= load_le(data);
338
312M
            data += word_size;
339
312M
        }
340
341
18.4M
        keccakf1600_best(state);
342
343
18.4M
        size -= block_size;
344
18.4M
    }
345
346
42.0M
    state_iter = state;
347
348
296M
    while (size >= word_size)
349
254M
    {
350
254M
        *state_iter ^= load_le(data);
351
254M
        ++state_iter;
352
254M
        data += word_size;
353
254M
        size -= word_size;
354
254M
    }
355
356
149M
    while (size > 0)
357
107M
    {
358
107M
        *last_word_iter = *data;
359
107M
        ++last_word_iter;
360
107M
        ++data;
361
107M
        --size;
362
107M
    }
363
42.0M
    *last_word_iter = 0x01;
364
42.0M
    *state_iter ^= to_le64(last_word);
365
366
42.0M
    state[(block_size / word_size) - 1] ^= 0x8000000000000000;
367
368
42.0M
    keccakf1600_best(state);
369
370
210M
    for (i = 0; i < (hash_size / word_size); 
++i168M
)
371
168M
        out[i] = to_le64(state[i]);
372
42.0M
}
373
374
union ethash_hash256 ethash_keccak256(const uint8_t* data, size_t size)
375
42.0M
{
376
42.0M
    union ethash_hash256 hash;
377
42.0M
    keccak(hash.word64s, 256, data, size);
378
42.0M
    return hash;
379
42.0M
}
380
381
union ethash_hash256 ethash_keccak256_32(const uint8_t data[32])
382
0
{
383
0
    union ethash_hash256 hash;
384
0
    keccak(hash.word64s, 256, data, 32);
385
0
    return hash;
386
0
}
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/keccak.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/keccak.hpp.html new file mode 100644 index 0000000000..f3f10146cb --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/keccak.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/keccak.hpp
Line
Count
Source
1
// ethash: C/C++ implementation of Ethash, the Ethereum Proof of Work algorithm.
2
// Copyright 2018-2019 Pawel Bylica.
3
// Licensed under the Apache License, Version 2.0.
4
5
#pragma once
6
7
#include "keccak.h"
8
9
namespace ethash
10
{
11
inline hash256 keccak256(const uint8_t* data, size_t size) noexcept
12
42.0M
{
13
42.0M
    return ethash_keccak256(data, size);
14
42.0M
}
15
16
inline hash256 keccak256(const hash256& input) noexcept
17
0
{
18
0
    return ethash_keccak256_32(input.bytes);
19
0
}
20
21
static constexpr auto keccak256_32 = ethash_keccak256_32;
22
23
}  // namespace ethash
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/kzg.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/kzg.cpp.html new file mode 100644 index 0000000000..c6b1c77b74 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/kzg.cpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/kzg.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "kzg.hpp"
6
#include <blst.h>
7
#include <algorithm>
8
#include <optional>
9
#include <span>
10
11
namespace evmone::crypto
12
{
13
namespace
14
{
15
/// The field element 1 in Montgomery form.
16
constexpr blst_fp ONE = {0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba,
17
    0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493};
18
19
/// The negation of the subgroup G1 generator -[1]₁ (Jacobian coordinates in Montgomery form).
20
constexpr blst_p1 G1_GENERATOR_NEGATIVE = {
21
    {0x5cb38790fd530c16, 0x7817fc679976fff5, 0x154f95c7143ba1c1, 0xf0ae6acdf3d0e747,
22
        0xedce6ecc21dbf440, 0x120177419e0bfb75},
23
    {0xff526c2af318883a, 0x92899ce4383b0270, 0x89d7738d9fa9d055, 0x12caf35ba344c12a,
24
        0x3cff1b76964b5317, 0x0e44d2ede9774430},
25
    ONE};
26
27
/// The negation of the subgroup G2 generator -[1]₂ (Jacobian coordinates in Montgomery form).
28
constexpr blst_p2 G2_GENERATOR_NEGATIVE{
29
    {{{0xf5f28fa202940a10, 0xb3f5fb2687b4961a, 0xa1a893b53e2ae580, 0x9894999d1a3caee9,
30
          0x6f67b7631863366b, 0x058191924350bcd7},
31
        {0xa5a9c0759e23f606, 0xaaa0c59dbccd60c3, 0x3bb17e18e2867806, 0x1b1ab6cc8541b367,
32
            0xc2b6ed0ef2158547, 0x11922a097360edf3}}},
33
    {{{0x6d8bf5079fb65e61, 0xc52f05df531d63a5, 0x7f4a4d344ca692c9, 0xa887959b8577c95f,
34
          0x4347fe40525c8734, 0x197d145bbaff0bb5},
35
        {0x0c3e036d209afa4e, 0x0601d8f4863f9e23, 0xe0832636bacc0a84, 0xeb2def362a476f84,
36
            0x64044f659f0ee1e9, 0x0ed54f48d5a1caa7}}},
37
    {{ONE, {}}}};
38
39
/// The point from the G2 series, index 1 of the Ethereum KZG trusted setup,
40
/// i.e. [s]₂ where s is the trusted setup's secret.
41
/// Affine coordinates in Montgomery form.
42
/// The original value in compressed form (y-parity bit and Fp2 x coordinate)
43
/// is the ["g2_monomial"][1] of the JSON object found at
44
/// https://github.com/ethereum/consensus-specs/blob/dev/presets/mainnet/trusted_setups/trusted_setup_4096.json#L8200
45
constexpr blst_p2_affine KZG_SETUP_G2_1{
46
    {{{0x6120a2099b0379f9, 0xa2df815cb8210e4e, 0xcb57be5577bd3d4f, 0x62da0ea89a0c93f8,
47
          0x02e0ee16968e150d, 0x171f09aea833acd5},
48
        {0x11a3670749dfd455, 0x04991d7b3abffadc, 0x85446a8e14437f41, 0x27174e7b4e76e3f2,
49
            0x7bfa6dd397f60a20, 0x02fcc329ac07080f}}},
50
    {{{0xaa130838793b2317, 0xe236dd220f891637, 0x6502782925760980, 0xd05c25f60557ec89,
51
          0x6095767a44064474, 0x185693917080d405},
52
        {0x549f9e175b03dc0a, 0x32c0c95a77106cfe, 0x64a74eae5705d080, 0x53deeaf56659ed9e,
53
            0x09a1d368508afb93, 0x12cf3a4525b5e9bd}}}};
54
55
/// Load and validate an element from the group order field.
56
std::optional<blst_scalar> validate_scalar(std::span<const std::byte, 32> b) noexcept
57
1.73k
{
58
1.73k
    blst_scalar v;
59
1.73k
    blst_scalar_from_bendian(&v, reinterpret_cast<const uint8_t*>(b.data()));
60
1.73k
    return blst_scalar_fr_check(&v) ? 
std::optional{v}1.67k
:
std::nullopt60
;
61
1.73k
}
62
63
/// Uncompress and validate a point from G1 subgroup.
64
std::optional<blst_p1_affine> validate_G1(std::span<const std::byte, 48> b) noexcept
65
1.62k
{
66
1.62k
    blst_p1_affine r;
67
1.62k
    if (blst_p1_uncompress(&r, reinterpret_cast<const uint8_t*>(b.data())) != BLST_SUCCESS)
68
18
        return std::nullopt;
69
70
    // Subgroup check is required by the spec but there are no test vectors
71
    // with points outside G1 which would satisfy the final pairings check.
72
1.60k
    if (!blst_p1_affine_in_g1(&r))
73
12
        return std::nullopt;
74
1.59k
    return r;
75
1.60k
}
76
77
/// Add two points from E1 and convert the result to affine form.
78
/// The conversion to affine is very costly so use only if the affine of the result is needed.
79
blst_p1_affine add_or_double(const blst_p1_affine& p, const blst_p1& q) noexcept
80
792
{
81
792
    blst_p1 r;
82
792
    blst_p1_add_or_double_affine(&r, &q, &p);
83
792
    blst_p1_affine ra;
84
792
    blst_p1_to_affine(&ra, &r);
85
792
    return ra;
86
792
}
87
88
blst_p1 mult(const blst_p1& p, const blst_scalar& v) noexcept
89
792
{
90
792
    blst_p1 r;
91
792
    blst_p1_mult(&r, &p, v.b, BLS_MODULUS_BITS);
92
792
    return r;
93
792
}
94
95
/// Add two points from E2 and convert the result to affine form.
96
/// The conversion to affine is very costly so use only if the affine of the result is needed.
97
blst_p2_affine add_or_double(const blst_p2_affine& p, const blst_p2& q) noexcept
98
792
{
99
792
    blst_p2 r;
100
792
    blst_p2_add_or_double_affine(&r, &q, &p);
101
792
    blst_p2_affine ra;
102
792
    blst_p2_to_affine(&ra, &r);
103
792
    return ra;
104
792
}
105
106
blst_p2 mult(const blst_p2& p, const blst_scalar& v) noexcept
107
792
{
108
792
    blst_p2 r;
109
792
    blst_p2_mult(&r, &p, v.b, BLS_MODULUS_BITS);
110
792
    return r;
111
792
}
112
113
bool pairings_verify(
114
    const blst_p1_affine& a1, const blst_p1_affine& b1, const blst_p2_affine& b2) noexcept
115
792
{
116
792
    blst_fp12 left;
117
792
    blst_aggregated_in_g1(&left, &a1);
118
792
    blst_fp12 right;
119
792
    blst_miller_loop(&right, &b2, &b1);
120
792
    return blst_fp12_finalverify(&left, &right);
121
792
}
122
}  // namespace
123
124
bool kzg_verify_proof(const std::byte versioned_hash[VERSIONED_HASH_SIZE], const std::byte z[32],
125
    const std::byte y[32], const std::byte commitment[48], const std::byte proof[48]) noexcept
126
906
{
127
906
    std::byte computed_versioned_hash[32];
128
906
    sha256(computed_versioned_hash, commitment, 48);
129
906
    computed_versioned_hash[0] = VERSIONED_HASH_VERSION_KZG;
130
906
    if (!std::ranges::equal(std::span{versioned_hash, 32}, computed_versioned_hash))
131
24
        return false;
132
133
    // Load and validate scalars z and y.
134
    // TODO(C++26): The span construction can be done as std::snap(z, std::c_<32>).
135
882
    const auto zz = validate_scalar(std::span<const std::byte, 32>{z, 32});
136
882
    if (!zz)
137
30
        return false;
138
852
    const auto yy = validate_scalar(std::span<const std::byte, 32>{y, 32});
139
852
    if (!yy)
140
30
        return false;
141
142
    // Uncompress and validate the points C (representing the polynomial commitment)
143
    // and Pi (representing the proof). They both are valid to be points at infinity
144
    // when they prove a commitment to a constant polynomial,
145
    // see https://hackmd.io/@kevaundray/kzg-is-zero-proof-sound
146
822
    const auto C = validate_G1(std::span<const std::byte, 48>{commitment, 48});
147
822
    if (!C)
148
18
        return false;
149
804
    const auto Pi = validate_G1(std::span<const std::byte, 48>{proof, 48});
150
804
    if (!Pi)
151
12
        return false;
152
153
    // Compute -Y as [y * -1]₁.
154
792
    const auto neg_Y = mult(G1_GENERATOR_NEGATIVE, *yy);
155
156
    // Compute C - Y. It can happen that C == -Y so doubling may be needed.
157
792
    const auto C_sub_Y = add_or_double(*C, neg_Y);
158
159
    // Compute -Z as [z * -1]₂.
160
792
    const auto neg_Z = mult(G2_GENERATOR_NEGATIVE, *zz);
161
162
    // Compute X - Z which is [s - z]₂.
163
792
    const auto X_sub_Z = add_or_double(KZG_SETUP_G2_1, neg_Z);
164
165
    // e(C - [y]₁, [1]₂) =? e(Pi, [s - z]₂)
166
792
    return pairings_verify(C_sub_Y, *Pi, X_sub_Z);
167
804
}
168
}  // namespace evmone::crypto
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/modexp.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/modexp.cpp.html new file mode 100644 index 0000000000..e5e393b232 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/modexp.cpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/modexp.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2025 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "modexp.hpp"
6
#include <evmmax/evmmax.hpp>
7
#include <bit>
8
9
using namespace intx;
10
11
namespace
12
{
13
template <unsigned N>
14
void trunc(std::span<uint8_t> dst, const intx::uint<N>& x) noexcept
15
2.90k
{
16
2.90k
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
2.90k
    const auto d = to_big_endian(x);
18
2.90k
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
2.90k
}
modexp.cpp:void (anonymous namespace)::trunc<128u>(std::span<unsigned char, 18446744073709551615ul>, intx::uint<128u> const&)
Line
Count
Source
15
856
{
16
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
856
    const auto d = to_big_endian(x);
18
856
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
856
}
modexp.cpp:void (anonymous namespace)::trunc<256u>(std::span<unsigned char, 18446744073709551615ul>, intx::uint<256u> const&)
Line
Count
Source
15
1.19k
{
16
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
1.19k
    const auto d = to_big_endian(x);
18
1.19k
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
1.19k
}
modexp.cpp:void (anonymous namespace)::trunc<512u>(std::span<unsigned char, 18446744073709551615ul>, intx::uint<512u> const&)
Line
Count
Source
15
593
{
16
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
593
    const auto d = to_big_endian(x);
18
593
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
593
}
modexp.cpp:void (anonymous namespace)::trunc<1024u>(std::span<unsigned char, 18446744073709551615ul>, intx::uint<1024u> const&)
Line
Count
Source
15
42
{
16
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
42
    const auto d = to_big_endian(x);
18
42
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
42
}
modexp.cpp:void (anonymous namespace)::trunc<2048u>(std::span<unsigned char, 18446744073709551615ul>, intx::uint<2048u> const&)
Line
Count
Source
15
70
{
16
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
70
    const auto d = to_big_endian(x);
18
70
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
70
}
modexp.cpp:void (anonymous namespace)::trunc<8192u>(std::span<unsigned char, 18446744073709551615ul>, intx::uint<8192u> const&)
Line
Count
Source
15
158
{
16
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
158
    const auto d = to_big_endian(x);
18
158
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
158
}
20
21
template <unsigned N>
22
constexpr unsigned ctz(const intx::uint<N>& x) noexcept
23
2.90k
{
24
2.90k
    unsigned tz = 0;
25
4.22k
    for (size_t i = 0; i < intx::uint<N>::num_words; 
++i1.31k
)
26
4.22k
    {
27
4.22k
        if (x[i] != 0)
28
2.90k
        {
29
2.90k
            tz += static_cast<unsigned>(std::countr_zero(x[i]));
30
2.90k
            break;
31
2.90k
        }
32
1.31k
        tz += intx::uint<N>::word_num_bits;
33
1.31k
    }
34
2.90k
    return tz;
35
2.90k
}
modexp.cpp:unsigned int (anonymous namespace)::ctz<128u>(intx::uint<128u> const&)
Line
Count
Source
23
856
{
24
856
    unsigned tz = 0;
25
870
    for (size_t i = 0; i < intx::uint<N>::num_words; 
++i14
)
26
870
    {
27
870
        if (x[i] != 0)
28
856
        {
29
856
            tz += static_cast<unsigned>(std::countr_zero(x[i]));
30
856
            break;
31
856
        }
32
14
        tz += intx::uint<N>::word_num_bits;
33
14
    }
34
856
    return tz;
35
856
}
modexp.cpp:unsigned int (anonymous namespace)::ctz<256u>(intx::uint<256u> const&)
Line
Count
Source
23
1.19k
{
24
1.19k
    unsigned tz = 0;
25
1.67k
    for (size_t i = 0; i < intx::uint<N>::num_words; 
++i486
)
26
1.67k
    {
27
1.67k
        if (x[i] != 0)
28
1.19k
        {
29
1.19k
            tz += static_cast<unsigned>(std::countr_zero(x[i]));
30
1.19k
            break;
31
1.19k
        }
32
486
        tz += intx::uint<N>::word_num_bits;
33
486
    }
34
1.19k
    return tz;
35
1.19k
}
modexp.cpp:unsigned int (anonymous namespace)::ctz<512u>(intx::uint<512u> const&)
Line
Count
Source
23
593
{
24
593
    unsigned tz = 0;
25
593
    for (size_t i = 0; i < intx::uint<N>::num_words; 
++i0
)
26
593
    {
27
593
        if (x[i] != 0)
28
593
        {
29
593
            tz += static_cast<unsigned>(std::countr_zero(x[i]));
30
593
            break;
31
593
        }
32
0
        tz += intx::uint<N>::word_num_bits;
33
0
    }
34
593
    return tz;
35
593
}
modexp.cpp:unsigned int (anonymous namespace)::ctz<1024u>(intx::uint<1024u> const&)
Line
Count
Source
23
42
{
24
42
    unsigned tz = 0;
25
42
    for (size_t i = 0; i < intx::uint<N>::num_words; 
++i0
)
26
42
    {
27
42
        if (x[i] != 0)
28
42
        {
29
42
            tz += static_cast<unsigned>(std::countr_zero(x[i]));
30
42
            break;
31
42
        }
32
0
        tz += intx::uint<N>::word_num_bits;
33
0
    }
34
42
    return tz;
35
42
}
modexp.cpp:unsigned int (anonymous namespace)::ctz<2048u>(intx::uint<2048u> const&)
Line
Count
Source
23
70
{
24
70
    unsigned tz = 0;
25
70
    for (size_t i = 0; i < intx::uint<N>::num_words; 
++i0
)
26
70
    {
27
70
        if (x[i] != 0)
28
70
        {
29
70
            tz += static_cast<unsigned>(std::countr_zero(x[i]));
30
70
            break;
31
70
        }
32
0
        tz += intx::uint<N>::word_num_bits;
33
0
    }
34
70
    return tz;
35
70
}
modexp.cpp:unsigned int (anonymous namespace)::ctz<8192u>(intx::uint<8192u> const&)
Line
Count
Source
23
158
{
24
158
    unsigned tz = 0;
25
970
    for (size_t i = 0; i < intx::uint<N>::num_words; 
++i812
)
26
970
    {
27
970
        if (x[i] != 0)
28
158
        {
29
158
            tz += static_cast<unsigned>(std::countr_zero(x[i]));
30
158
            break;
31
158
        }
32
812
        tz += intx::uint<N>::word_num_bits;
33
812
    }
34
158
    return tz;
35
158
}
36
37
template <typename UIntT>
38
UIntT modexp_odd(const UIntT& base, std::span<const uint8_t> exp, const UIntT& mod) noexcept
39
2.25k
{
40
2.25k
    const evmmax::ModArith<UIntT> arith{mod};
41
2.25k
    const auto base_mont = arith.to_mont(base);
42
43
2.25k
    auto ret = arith.to_mont(1);
44
2.25k
    for (const auto e : exp)
45
40.3k
    {
46
363k
        for (size_t i = 8; i != 0; 
--i323k
)
47
323k
        {
48
323k
            ret = arith.mul(ret, ret);
49
323k
            const auto bit = (e >> (i - 1)) & 1;
50
323k
            if (bit != 0)
51
229k
                ret = arith.mul(ret, base_mont);
52
323k
        }
53
40.3k
    }
54
55
2.25k
    return arith.from_mont(ret);
56
2.25k
}
modexp.cpp:intx::uint<128u> (anonymous namespace)::modexp_odd<intx::uint<128u>>(intx::uint<128u> const&, std::span<unsigned char const, 18446744073709551615ul>, intx::uint<128u> const&)
Line
Count
Source
39
590
{
40
590
    const evmmax::ModArith<UIntT> arith{mod};
41
590
    const auto base_mont = arith.to_mont(base);
42
43
590
    auto ret = arith.to_mont(1);
44
590
    for (const auto e : exp)
45
18.5k
    {
46
166k
        for (size_t i = 8; i != 0; 
--i148k
)
47
148k
        {
48
148k
            ret = arith.mul(ret, ret);
49
148k
            const auto bit = (e >> (i - 1)) & 1;
50
148k
            if (bit != 0)
51
109k
                ret = arith.mul(ret, base_mont);
52
148k
        }
53
18.5k
    }
54
55
590
    return arith.from_mont(ret);
56
590
}
modexp.cpp:intx::uint<256u> (anonymous namespace)::modexp_odd<intx::uint<256u>>(intx::uint<256u> const&, std::span<unsigned char const, 18446744073709551615ul>, intx::uint<256u> const&)
Line
Count
Source
39
842
{
40
842
    const evmmax::ModArith<UIntT> arith{mod};
41
842
    const auto base_mont = arith.to_mont(base);
42
43
842
    auto ret = arith.to_mont(1);
44
842
    for (const auto e : exp)
45
12.7k
    {
46
114k
        for (size_t i = 8; i != 0; 
--i101k
)
47
101k
        {
48
101k
            ret = arith.mul(ret, ret);
49
101k
            const auto bit = (e >> (i - 1)) & 1;
50
101k
            if (bit != 0)
51
73.1k
                ret = arith.mul(ret, base_mont);
52
101k
        }
53
12.7k
    }
54
55
842
    return arith.from_mont(ret);
56
842
}
modexp.cpp:intx::uint<512u> (anonymous namespace)::modexp_odd<intx::uint<512u>>(intx::uint<512u> const&, std::span<unsigned char const, 18446744073709551615ul>, intx::uint<512u> const&)
Line
Count
Source
39
551
{
40
551
    const evmmax::ModArith<UIntT> arith{mod};
41
551
    const auto base_mont = arith.to_mont(base);
42
43
551
    auto ret = arith.to_mont(1);
44
551
    for (const auto e : exp)
45
5.22k
    {
46
47.0k
        for (size_t i = 8; i != 0; 
--i41.7k
)
47
41.7k
        {
48
41.7k
            ret = arith.mul(ret, ret);
49
41.7k
            const auto bit = (e >> (i - 1)) & 1;
50
41.7k
            if (bit != 0)
51
30.8k
                ret = arith.mul(ret, base_mont);
52
41.7k
        }
53
5.22k
    }
54
55
551
    return arith.from_mont(ret);
56
551
}
modexp.cpp:intx::uint<1024u> (anonymous namespace)::modexp_odd<intx::uint<1024u>>(intx::uint<1024u> const&, std::span<unsigned char const, 18446744073709551615ul>, intx::uint<1024u> const&)
Line
Count
Source
39
42
{
40
42
    const evmmax::ModArith<UIntT> arith{mod};
41
42
    const auto base_mont = arith.to_mont(base);
42
43
42
    auto ret = arith.to_mont(1);
44
42
    for (const auto e : exp)
45
70
    {
46
630
        for (size_t i = 8; i != 0; 
--i560
)
47
560
        {
48
560
            ret = arith.mul(ret, ret);
49
560
            const auto bit = (e >> (i - 1)) & 1;
50
560
            if (bit != 0)
51
70
                ret = arith.mul(ret, base_mont);
52
560
        }
53
70
    }
54
55
42
    return arith.from_mont(ret);
56
42
}
modexp.cpp:intx::uint<2048u> (anonymous namespace)::modexp_odd<intx::uint<2048u>>(intx::uint<2048u> const&, std::span<unsigned char const, 18446744073709551615ul>, intx::uint<2048u> const&)
Line
Count
Source
39
70
{
40
70
    const evmmax::ModArith<UIntT> arith{mod};
41
70
    const auto base_mont = arith.to_mont(base);
42
43
70
    auto ret = arith.to_mont(1);
44
70
    for (const auto e : exp)
45
3.66k
    {
46
33.0k
        for (size_t i = 8; i != 0; 
--i29.3k
)
47
29.3k
        {
48
29.3k
            ret = arith.mul(ret, ret);
49
29.3k
            const auto bit = (e >> (i - 1)) & 1;
50
29.3k
            if (bit != 0)
51
14.9k
                ret = arith.mul(ret, base_mont);
52
29.3k
        }
53
3.66k
    }
54
55
70
    return arith.from_mont(ret);
56
70
}
modexp.cpp:intx::uint<8192u> (anonymous namespace)::modexp_odd<intx::uint<8192u>>(intx::uint<8192u> const&, std::span<unsigned char const, 18446744073709551615ul>, intx::uint<8192u> const&)
Line
Count
Source
39
156
{
40
156
    const evmmax::ModArith<UIntT> arith{mod};
41
156
    const auto base_mont = arith.to_mont(base);
42
43
156
    auto ret = arith.to_mont(1);
44
156
    for (const auto e : exp)
45
182
    {
46
1.63k
        for (size_t i = 8; i != 0; 
--i1.45k
)
47
1.45k
        {
48
1.45k
            ret = arith.mul(ret, ret);
49
1.45k
            const auto bit = (e >> (i - 1)) & 1;
50
1.45k
            if (bit != 0)
51
196
                ret = arith.mul(ret, base_mont);
52
1.45k
        }
53
182
    }
54
55
156
    return arith.from_mont(ret);
56
156
}
57
58
template <typename UIntT>
59
UIntT modexp_pow2(const UIntT& base, std::span<const uint8_t> exp, unsigned k) noexcept
60
1.45k
{
61
1.45k
    assert(k != 0);  // Modulus of 1 should be covered as "odd".
62
1.45k
    UIntT ret = 1;
63
1.45k
    for (auto e : exp)
64
23.2k
    {
65
209k
        for (size_t i = 8; i != 0; 
--i185k
)
66
185k
        {
67
185k
            ret *= ret;
68
185k
            const auto bit = (e >> (i - 1)) & 1;
69
185k
            if (bit != 0)
70
119k
                ret *= base;
71
185k
        }
72
23.2k
    }
73
74
1.45k
    const auto mod_pow2_mask = (UIntT{1} << k) - 1;
75
1.45k
    ret &= mod_pow2_mask;
76
1.45k
    return ret;
77
1.45k
}
modexp.cpp:intx::uint<128u> (anonymous namespace)::modexp_pow2<intx::uint<128u>>(intx::uint<128u> const&, std::span<unsigned char const, 18446744073709551615ul>, unsigned int)
Line
Count
Source
60
610
{
61
610
    assert(k != 0);  // Modulus of 1 should be covered as "odd".
62
610
    UIntT ret = 1;
63
610
    for (auto e : exp)
64
15.6k
    {
65
140k
        for (size_t i = 8; i != 0; 
--i125k
)
66
125k
        {
67
125k
            ret *= ret;
68
125k
            const auto bit = (e >> (i - 1)) & 1;
69
125k
            if (bit != 0)
70
88.1k
                ret *= base;
71
125k
        }
72
15.6k
    }
73
74
610
    const auto mod_pow2_mask = (UIntT{1} << k) - 1;
75
610
    ret &= mod_pow2_mask;
76
610
    return ret;
77
610
}
modexp.cpp:intx::uint<256u> (anonymous namespace)::modexp_pow2<intx::uint<256u>>(intx::uint<256u> const&, std::span<unsigned char const, 18446744073709551615ul>, unsigned int)
Line
Count
Source
60
602
{
61
602
    assert(k != 0);  // Modulus of 1 should be covered as "odd".
62
602
    UIntT ret = 1;
63
602
    for (auto e : exp)
64
2.98k
    {
65
26.8k
        for (size_t i = 8; i != 0; 
--i23.9k
)
66
23.9k
        {
67
23.9k
            ret *= ret;
68
23.9k
            const auto bit = (e >> (i - 1)) & 1;
69
23.9k
            if (bit != 0)
70
10.9k
                ret *= base;
71
23.9k
        }
72
2.98k
    }
73
74
602
    const auto mod_pow2_mask = (UIntT{1} << k) - 1;
75
602
    ret &= mod_pow2_mask;
76
602
    return ret;
77
602
}
modexp.cpp:intx::uint<512u> (anonymous namespace)::modexp_pow2<intx::uint<512u>>(intx::uint<512u> const&, std::span<unsigned char const, 18446744073709551615ul>, unsigned int)
Line
Count
Source
60
210
{
61
210
    assert(k != 0);  // Modulus of 1 should be covered as "odd".
62
210
    UIntT ret = 1;
63
210
    for (auto e : exp)
64
1.00k
    {
65
9.07k
        for (size_t i = 8; i != 0; 
--i8.06k
)
66
8.06k
        {
67
8.06k
            ret *= ret;
68
8.06k
            const auto bit = (e >> (i - 1)) & 1;
69
8.06k
            if (bit != 0)
70
5.37k
                ret *= base;
71
8.06k
        }
72
1.00k
    }
73
74
210
    const auto mod_pow2_mask = (UIntT{1} << k) - 1;
75
210
    ret &= mod_pow2_mask;
76
210
    return ret;
77
210
}
Unexecuted instantiation: modexp.cpp:intx::uint<1024u> (anonymous namespace)::modexp_pow2<intx::uint<1024u>>(intx::uint<1024u> const&, std::span<unsigned char const, 18446744073709551615ul>, unsigned int)
modexp.cpp:intx::uint<2048u> (anonymous namespace)::modexp_pow2<intx::uint<2048u>>(intx::uint<2048u> const&, std::span<unsigned char const, 18446744073709551615ul>, unsigned int)
Line
Count
Source
60
14
{
61
14
    assert(k != 0);  // Modulus of 1 should be covered as "odd".
62
14
    UIntT ret = 1;
63
14
    for (auto e : exp)
64
3.58k
    {
65
32.2k
        for (size_t i = 8; i != 0; 
--i28.6k
)
66
28.6k
        {
67
28.6k
            ret *= ret;
68
28.6k
            const auto bit = (e >> (i - 1)) & 1;
69
28.6k
            if (bit != 0)
70
14.8k
                ret *= base;
71
28.6k
        }
72
3.58k
    }
73
74
14
    const auto mod_pow2_mask = (UIntT{1} << k) - 1;
75
14
    ret &= mod_pow2_mask;
76
14
    return ret;
77
14
}
modexp.cpp:intx::uint<8192u> (anonymous namespace)::modexp_pow2<intx::uint<8192u>>(intx::uint<8192u> const&, std::span<unsigned char const, 18446744073709551615ul>, unsigned int)
Line
Count
Source
60
20
{
61
20
    assert(k != 0);  // Modulus of 1 should be covered as "odd".
62
20
    UIntT ret = 1;
63
20
    for (auto e : exp)
64
14
    {
65
126
        for (size_t i = 8; i != 0; 
--i112
)
66
112
        {
67
112
            ret *= ret;
68
112
            const auto bit = (e >> (i - 1)) & 1;
69
112
            if (bit != 0)
70
14
                ret *= base;
71
112
        }
72
14
    }
73
74
20
    const auto mod_pow2_mask = (UIntT{1} << k) - 1;
75
20
    ret &= mod_pow2_mask;
76
20
    return ret;
77
20
}
78
79
/// Computes modular inversion for modulus of 2^k.
80
template <typename UIntT>
81
UIntT modinv_pow2(const UIntT& x, unsigned k) noexcept
82
798
{
83
798
    UIntT b = 1;
84
798
    UIntT res;
85
57.0k
    for (size_t i = 0; i < k; 
++i56.2k
)
86
56.2k
    {
87
56.2k
        const auto t = b & 1;
88
56.2k
        b = (b - x * t) >> 1;
89
56.2k
        res |= t << i;
90
56.2k
    }
91
798
    return res;
92
798
}
modexp.cpp:intx::uint<128u> (anonymous namespace)::modinv_pow2<intx::uint<128u>>(intx::uint<128u> const&, unsigned int)
Line
Count
Source
82
344
{
83
344
    UIntT b = 1;
84
344
    UIntT res;
85
2.84k
    for (size_t i = 0; i < k; 
++i2.50k
)
86
2.50k
    {
87
2.50k
        const auto t = b & 1;
88
2.50k
        b = (b - x * t) >> 1;
89
2.50k
        res |= t << i;
90
2.50k
    }
91
344
    return res;
92
344
}
modexp.cpp:intx::uint<256u> (anonymous namespace)::modinv_pow2<intx::uint<256u>>(intx::uint<256u> const&, unsigned int)
Line
Count
Source
82
254
{
83
254
    UIntT b = 1;
84
254
    UIntT res;
85
1.32k
    for (size_t i = 0; i < k; 
++i1.07k
)
86
1.07k
    {
87
1.07k
        const auto t = b & 1;
88
1.07k
        b = (b - x * t) >> 1;
89
1.07k
        res |= t << i;
90
1.07k
    }
91
254
    return res;
92
254
}
modexp.cpp:intx::uint<512u> (anonymous namespace)::modinv_pow2<intx::uint<512u>>(intx::uint<512u> const&, unsigned int)
Line
Count
Source
82
168
{
83
168
    UIntT b = 1;
84
168
    UIntT res;
85
364
    for (size_t i = 0; i < k; 
++i196
)
86
196
    {
87
196
        const auto t = b & 1;
88
196
        b = (b - x * t) >> 1;
89
196
        res |= t << i;
90
196
    }
91
168
    return res;
92
168
}
Unexecuted instantiation: modexp.cpp:intx::uint<1024u> (anonymous namespace)::modinv_pow2<intx::uint<1024u>>(intx::uint<1024u> const&, unsigned int)
modexp.cpp:intx::uint<2048u> (anonymous namespace)::modinv_pow2<intx::uint<2048u>>(intx::uint<2048u> const&, unsigned int)
Line
Count
Source
82
14
{
83
14
    UIntT b = 1;
84
14
    UIntT res;
85
56
    for (size_t i = 0; i < k; 
++i42
)
86
42
    {
87
42
        const auto t = b & 1;
88
42
        b = (b - x * t) >> 1;
89
42
        res |= t << i;
90
42
    }
91
14
    return res;
92
14
}
modexp.cpp:intx::uint<8192u> (anonymous namespace)::modinv_pow2<intx::uint<8192u>>(intx::uint<8192u> const&, unsigned int)
Line
Count
Source
82
18
{
83
18
    UIntT b = 1;
84
18
    UIntT res;
85
52.4k
    for (size_t i = 0; i < k; 
++i52.4k
)
86
52.4k
    {
87
52.4k
        const auto t = b & 1;
88
52.4k
        b = (b - x * t) >> 1;
89
52.4k
        res |= t << i;
90
52.4k
    }
91
18
    return res;
92
18
}
93
94
template <typename UIntT>
95
UIntT load(std::span<const uint8_t> data) noexcept
96
5.81k
{
97
5.81k
    static constexpr auto UINT_SIZE = sizeof(UIntT);
98
5.81k
    assert(data.size() <= UINT_SIZE);
99
5.81k
    uint8_t tmp[UINT_SIZE]{};
100
5.81k
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
101
5.81k
    return be::load<UIntT>(tmp);
102
5.81k
}
modexp.cpp:intx::uint<128u> (anonymous namespace)::load<intx::uint<128u>>(std::span<unsigned char const, 18446744073709551615ul>)
Line
Count
Source
96
1.71k
{
97
1.71k
    static constexpr auto UINT_SIZE = sizeof(UIntT);
98
    assert(data.size() <= UINT_SIZE);
99
1.71k
    uint8_t tmp[UINT_SIZE]{};
100
1.71k
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
101
1.71k
    return be::load<UIntT>(tmp);
102
1.71k
}
modexp.cpp:intx::uint<256u> (anonymous namespace)::load<intx::uint<256u>>(std::span<unsigned char const, 18446744073709551615ul>)
Line
Count
Source
96
2.38k
{
97
2.38k
    static constexpr auto UINT_SIZE = sizeof(UIntT);
98
    assert(data.size() <= UINT_SIZE);
99
2.38k
    uint8_t tmp[UINT_SIZE]{};
100
2.38k
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
101
2.38k
    return be::load<UIntT>(tmp);
102
2.38k
}
modexp.cpp:intx::uint<512u> (anonymous namespace)::load<intx::uint<512u>>(std::span<unsigned char const, 18446744073709551615ul>)
Line
Count
Source
96
1.18k
{
97
1.18k
    static constexpr auto UINT_SIZE = sizeof(UIntT);
98
    assert(data.size() <= UINT_SIZE);
99
1.18k
    uint8_t tmp[UINT_SIZE]{};
100
1.18k
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
101
1.18k
    return be::load<UIntT>(tmp);
102
1.18k
}
modexp.cpp:intx::uint<1024u> (anonymous namespace)::load<intx::uint<1024u>>(std::span<unsigned char const, 18446744073709551615ul>)
Line
Count
Source
96
84
{
97
84
    static constexpr auto UINT_SIZE = sizeof(UIntT);
98
    assert(data.size() <= UINT_SIZE);
99
84
    uint8_t tmp[UINT_SIZE]{};
100
84
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
101
84
    return be::load<UIntT>(tmp);
102
84
}
modexp.cpp:intx::uint<2048u> (anonymous namespace)::load<intx::uint<2048u>>(std::span<unsigned char const, 18446744073709551615ul>)
Line
Count
Source
96
140
{
97
140
    static constexpr auto UINT_SIZE = sizeof(UIntT);
98
    assert(data.size() <= UINT_SIZE);
99
140
    uint8_t tmp[UINT_SIZE]{};
100
140
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
101
140
    return be::load<UIntT>(tmp);
102
140
}
modexp.cpp:intx::uint<8192u> (anonymous namespace)::load<intx::uint<8192u>>(std::span<unsigned char const, 18446744073709551615ul>)
Line
Count
Source
96
316
{
97
316
    static constexpr auto UINT_SIZE = sizeof(UIntT);
98
    assert(data.size() <= UINT_SIZE);
99
316
    uint8_t tmp[UINT_SIZE]{};
100
316
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
101
316
    return be::load<UIntT>(tmp);
102
316
}
103
104
template <size_t Size>
105
void modexp_impl(std::span<const uint8_t> base_bytes, std::span<const uint8_t> exp,
106
    std::span<const uint8_t> mod_bytes, uint8_t* output) noexcept
107
2.90k
{
108
2.90k
    using UIntT = intx::uint<Size * 8>;
109
2.90k
    const auto base = load<UIntT>(base_bytes);
110
2.90k
    const auto mod = load<UIntT>(mod_bytes);
111
112
2.90k
    UIntT result;
113
2.90k
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
114
1.45k
    {
115
1.45k
        result = modexp_odd(base, exp, mod);
116
1.45k
    }
117
1.45k
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
118
658
    {
119
658
        result = modexp_pow2(base, exp, mod_tz);
120
658
    }
121
798
    else  // is even
122
798
    {
123
798
        const auto x1 = modexp_odd(base, exp, mod_odd);
124
798
        const auto x2 = modexp_pow2(base, exp, mod_tz);
125
126
798
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
127
128
798
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
129
798
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
130
798
    }
131
132
2.90k
    trunc(std::span{output, mod_bytes.size()}, result);
133
2.90k
}
modexp.cpp:void (anonymous namespace)::modexp_impl<16ul>(std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul>, unsigned char*)
Line
Count
Source
107
856
{
108
856
    using UIntT = intx::uint<Size * 8>;
109
856
    const auto base = load<UIntT>(base_bytes);
110
856
    const auto mod = load<UIntT>(mod_bytes);
111
112
856
    UIntT result;
113
856
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
114
246
    {
115
246
        result = modexp_odd(base, exp, mod);
116
246
    }
117
610
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
118
266
    {
119
266
        result = modexp_pow2(base, exp, mod_tz);
120
266
    }
121
344
    else  // is even
122
344
    {
123
344
        const auto x1 = modexp_odd(base, exp, mod_odd);
124
344
        const auto x2 = modexp_pow2(base, exp, mod_tz);
125
126
344
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
127
128
344
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
129
344
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
130
344
    }
131
132
856
    trunc(std::span{output, mod_bytes.size()}, result);
133
856
}
modexp.cpp:void (anonymous namespace)::modexp_impl<32ul>(std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul>, unsigned char*)
Line
Count
Source
107
1.19k
{
108
1.19k
    using UIntT = intx::uint<Size * 8>;
109
1.19k
    const auto base = load<UIntT>(base_bytes);
110
1.19k
    const auto mod = load<UIntT>(mod_bytes);
111
112
1.19k
    UIntT result;
113
1.19k
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
114
588
    {
115
588
        result = modexp_odd(base, exp, mod);
116
588
    }
117
602
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
118
348
    {
119
348
        result = modexp_pow2(base, exp, mod_tz);
120
348
    }
121
254
    else  // is even
122
254
    {
123
254
        const auto x1 = modexp_odd(base, exp, mod_odd);
124
254
        const auto x2 = modexp_pow2(base, exp, mod_tz);
125
126
254
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
127
128
254
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
129
254
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
130
254
    }
131
132
1.19k
    trunc(std::span{output, mod_bytes.size()}, result);
133
1.19k
}
modexp.cpp:void (anonymous namespace)::modexp_impl<64ul>(std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul>, unsigned char*)
Line
Count
Source
107
593
{
108
593
    using UIntT = intx::uint<Size * 8>;
109
593
    const auto base = load<UIntT>(base_bytes);
110
593
    const auto mod = load<UIntT>(mod_bytes);
111
112
593
    UIntT result;
113
593
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
114
383
    {
115
383
        result = modexp_odd(base, exp, mod);
116
383
    }
117
210
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
118
42
    {
119
42
        result = modexp_pow2(base, exp, mod_tz);
120
42
    }
121
168
    else  // is even
122
168
    {
123
168
        const auto x1 = modexp_odd(base, exp, mod_odd);
124
168
        const auto x2 = modexp_pow2(base, exp, mod_tz);
125
126
168
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
127
128
168
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
129
168
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
130
168
    }
131
132
593
    trunc(std::span{output, mod_bytes.size()}, result);
133
593
}
modexp.cpp:void (anonymous namespace)::modexp_impl<128ul>(std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul>, unsigned char*)
Line
Count
Source
107
42
{
108
42
    using UIntT = intx::uint<Size * 8>;
109
42
    const auto base = load<UIntT>(base_bytes);
110
42
    const auto mod = load<UIntT>(mod_bytes);
111
112
42
    UIntT result;
113
42
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
114
42
    {
115
42
        result = modexp_odd(base, exp, mod);
116
42
    }
117
0
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
118
0
    {
119
0
        result = modexp_pow2(base, exp, mod_tz);
120
0
    }
121
0
    else  // is even
122
0
    {
123
0
        const auto x1 = modexp_odd(base, exp, mod_odd);
124
0
        const auto x2 = modexp_pow2(base, exp, mod_tz);
125
126
0
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
127
128
0
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
129
0
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
130
0
    }
131
132
42
    trunc(std::span{output, mod_bytes.size()}, result);
133
42
}
modexp.cpp:void (anonymous namespace)::modexp_impl<256ul>(std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul>, unsigned char*)
Line
Count
Source
107
70
{
108
70
    using UIntT = intx::uint<Size * 8>;
109
70
    const auto base = load<UIntT>(base_bytes);
110
70
    const auto mod = load<UIntT>(mod_bytes);
111
112
70
    UIntT result;
113
70
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
114
56
    {
115
56
        result = modexp_odd(base, exp, mod);
116
56
    }
117
14
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
118
0
    {
119
0
        result = modexp_pow2(base, exp, mod_tz);
120
0
    }
121
14
    else  // is even
122
14
    {
123
14
        const auto x1 = modexp_odd(base, exp, mod_odd);
124
14
        const auto x2 = modexp_pow2(base, exp, mod_tz);
125
126
14
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
127
128
14
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
129
14
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
130
14
    }
131
132
70
    trunc(std::span{output, mod_bytes.size()}, result);
133
70
}
modexp.cpp:void (anonymous namespace)::modexp_impl<1024ul>(std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul>, std::span<unsigned char const, 18446744073709551615ul>, unsigned char*)
Line
Count
Source
107
158
{
108
158
    using UIntT = intx::uint<Size * 8>;
109
158
    const auto base = load<UIntT>(base_bytes);
110
158
    const auto mod = load<UIntT>(mod_bytes);
111
112
158
    UIntT result;
113
158
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
114
138
    {
115
138
        result = modexp_odd(base, exp, mod);
116
138
    }
117
20
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
118
2
    {
119
2
        result = modexp_pow2(base, exp, mod_tz);
120
2
    }
121
18
    else  // is even
122
18
    {
123
18
        const auto x1 = modexp_odd(base, exp, mod_odd);
124
18
        const auto x2 = modexp_pow2(base, exp, mod_tz);
125
126
18
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
127
128
18
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
129
18
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
130
18
    }
131
132
158
    trunc(std::span{output, mod_bytes.size()}, result);
133
158
}
134
}  // namespace
135
136
namespace evmone::crypto
137
{
138
void modexp(std::span<const uint8_t> base, std::span<const uint8_t> exp,
139
    std::span<const uint8_t> mod, uint8_t* output) noexcept
140
2.90k
{
141
2.90k
    static constexpr auto MAX_INPUT_SIZE = 1024;
142
2.90k
    assert(base.size() <= MAX_INPUT_SIZE);
143
2.90k
    assert(mod.size() <= MAX_INPUT_SIZE);
144
145
66.6k
    const auto it = std::ranges::find_if(exp, [](auto x) { return x != 0; });
146
2.90k
    exp = std::span{it, exp.end()};
147
148
2.90k
    if (const auto size = std::max(mod.size(), base.size()); size <= 16)
149
856
        modexp_impl<16>(base, exp, mod, output);
150
2.05k
    else if (size <= 32)
151
1.19k
        modexp_impl<32>(base, exp, mod, output);
152
863
    else if (size <= 64)
153
593
        modexp_impl<64>(base, exp, mod, output);
154
270
    else if (size <= 128)
155
42
        modexp_impl<128>(base, exp, mod, output);
156
228
    else if (size <= 256)
157
70
        modexp_impl<256>(base, exp, mod, output);
158
158
    else
159
158
        modexp_impl<MAX_INPUT_SIZE>(base, exp, mod, output);
160
2.90k
}
161
}  // namespace evmone::crypto
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/bn254/fields.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/bn254/fields.hpp.html new file mode 100644 index 0000000000..138a695912 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/bn254/fields.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/pairing/bn254/fields.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include "../../bn254.hpp"
7
#include "../../ecc.hpp"
8
#include "../field_template.hpp"
9
10
namespace evmmax::bn254
11
{
12
using namespace intx;
13
14
/// Specifies base field value type and modular arithmetic for bn254 curve.
15
struct BaseFieldConfig
16
{
17
    using ValueT = uint256;
18
    static constexpr auto& MOD_ARITH = Curve::Fp;
19
    static constexpr auto ONE = MOD_ARITH.to_mont(1);
20
};
21
using Fq = ecc::BaseFieldElem<BaseFieldConfig>;
22
23
// Extension fields implemented based on https://hackmd.io/@jpw/bn254#Field-extension-towers
24
25
/// Specifies Fq^2 extension field for bn254 curve. Base field extended with irreducible `u^2 + 1`
26
/// polynomial over the base field. `u` is the Fq^2 element.
27
struct Fq2Config
28
{
29
    using BaseFieldT = Fq;
30
    using ValueT = Fq;
31
    static constexpr auto DEGREE = 2;
32
};
33
using Fq2 = ecc::ExtFieldElem<Fq2Config>;
34
35
/// Specifies Fq^6 extension field for bn254 curve. Fq^2 field extended with irreducible
36
/// `v^3 - (9 + u)` polynomial over the Fq^2 field. `v` is the Fq^6 field element.
37
struct Fq6Config
38
{
39
    using BaseFieldT = Fq;
40
    using ValueT = Fq2;
41
    static constexpr uint8_t DEGREE = 3;
42
    static constexpr auto ksi = Fq2({Fq::from_int(9_u256), Fq::from_int(1_u256)});
43
    static constexpr auto _3_ksi_inv = Fq2({
44
        Fq::from_int(0x2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5_u256),
45
        Fq::from_int(0x9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2_u256),
46
    });
47
};
48
using Fq6 = ecc::ExtFieldElem<Fq6Config>;
49
50
/// Specifies Fq^12 extension field for bn254 curve. Fq^6 field extended with irreducible
51
/// `w^2 - v` polynomial over the Fq^2 field. `v` is the Fq^6 field element.
52
/// `w` is Fq^12 field element.
53
struct Fq12Config
54
{
55
    using BaseFieldT = Fq;
56
    using ValueT = Fq6;
57
58
    static constexpr uint8_t DEGREE = 2;
59
};
60
using Fq12 = ecc::ExtFieldElem<Fq12Config>;
61
62
/// Multiplies two Fq^2 field elements
63
constexpr Fq2 multiply(const Fq2& a, const Fq2& b)
64
7.54M
{
65
7.54M
    return Fq2({
66
7.54M
        a.coeffs[0] * b.coeffs[0] - a.coeffs[1] * b.coeffs[1],
67
7.54M
        a.coeffs[1] * b.coeffs[0] + a.coeffs[0] * b.coeffs[1],
68
7.54M
    });
69
7.54M
}
70
71
/// Multiplies two Fq^6 field elements
72
constexpr Fq6 multiply(const Fq6& a, const Fq6& b)
73
235k
{
74
235k
    const auto& a0 = a.coeffs[0];
75
235k
    const auto& a1 = a.coeffs[1];
76
235k
    const auto& a2 = a.coeffs[2];
77
235k
    const auto& b0 = b.coeffs[0];
78
235k
    const auto& b1 = b.coeffs[1];
79
235k
    const auto& b2 = b.coeffs[2];
80
81
235k
    const Fq2& ksi = Fq6Config::ksi;
82
83
235k
    const auto t0 = a0 * b0;
84
235k
    const auto t1 = a1 * b1;
85
235k
    const auto t2 = a2 * b2;
86
87
235k
    const auto c0 = ((a1 + a2) * (b1 + b2) - t1 - t2) * ksi + t0;
88
235k
    const auto c1 = (a0 + a1) * (b0 + b1) - t0 - t1 + ksi * t2;
89
235k
    const auto c2 = (a0 + a2) * (b0 + b2) - t0 - t2 + t1;
90
91
235k
    return Fq6({c0, c1, c2});
92
235k
}
93
94
/// Multiplies two Fq^12 field elements
95
constexpr Fq12 multiply(const Fq12& a, const Fq12& b)
96
35.0k
{
97
35.0k
    const auto& a0 = a.coeffs[0];
98
35.0k
    const auto& a1 = a.coeffs[1];
99
35.0k
    const auto& b0 = b.coeffs[0];
100
35.0k
    const auto& b1 = b.coeffs[1];
101
102
35.0k
    const auto t0 = a0 * b0;
103
35.0k
    const auto t1 = a1 * b1;
104
105
35.0k
    const Fq2& ksi = Fq6Config::ksi;
106
107
35.0k
    const auto c0 = t0 + Fq6({ksi * t1.coeffs[2], t1.coeffs[0], t1.coeffs[1]});  // gamma is sparse.
108
35.0k
    const auto c1 = (a0 + a1) * (b0 + b1) - t0 - t1;
109
110
35.0k
    return Fq12({c0, c1});
111
35.0k
}
112
113
/// Inverses the base field element
114
inline Fq inverse(const Fq& x)
115
516
{
116
516
    return Fq(BaseFieldConfig::MOD_ARITH.inv(x.value()));
117
516
}
118
119
/// Inverses the Fq^2 field element
120
inline Fq2 inverse(const Fq2& f)
121
516
{
122
516
    const auto& a0 = f.coeffs[0];
123
516
    const auto& a1 = f.coeffs[1];
124
516
    auto t0 = a0 * a0;
125
516
    auto t1 = a1 * a1;
126
127
516
    t0 = t0 + t1;
128
516
    t1 = t0.inv();
129
130
516
    const auto c0 = a0 * t1;
131
516
    const auto c1 = -(a1 * t1);
132
133
516
    return Fq2({c0, c1});
134
516
}
135
136
/// Inverses the Fq^6 field element
137
inline Fq6 inverse(const Fq6& f)
138
516
{
139
516
    const auto& a0 = f.coeffs[0];
140
516
    const auto& a1 = f.coeffs[1];
141
516
    const auto& a2 = f.coeffs[2];
142
143
516
    const Fq2& ksi = Fq6Config::ksi;
144
145
516
    const auto t0 = a0 * a0;
146
516
    const auto t1 = a1 * a1;
147
516
    const auto t2 = a2 * a2;
148
149
516
    const auto t3 = a0 * a1;
150
516
    const auto t4 = a0 * a2;
151
516
    const auto t5 = a2 * a1;
152
153
516
    const auto c0 = t0 - ksi * t5;
154
516
    const auto c1 = ksi * t2 - t3;
155
516
    const auto c2 = t1 - t4;
156
157
516
    const auto t = a0 * c0 + (a2 * c1 + a1 * c2) * ksi;
158
516
    const auto t6 = t.inv();
159
160
516
    return Fq6({c0 * t6, c1 * t6, c2 * t6});
161
516
}
162
163
/// Inverses the Fq^12 field element
164
inline Fq12 inverse(const Fq12& f)
165
516
{
166
516
    const auto& a0 = f.coeffs[0];
167
516
    const auto& a1 = f.coeffs[1];
168
169
516
    auto t0 = a0 * a0;
170
516
    auto t1 = a1 * a1;
171
172
516
    const Fq2& ksi = Fq6Config::ksi;
173
174
516
    t0 = t0 - Fq6({ksi * t1.coeffs[2], t1.coeffs[0], t1.coeffs[1]});  // gamma is sparse.
175
516
    t1 = t0.inv();
176
177
516
    const auto c0 = a0 * t1;
178
516
    const auto c1 = -(a1 * t1);
179
180
516
    return Fq12({c0, c1});
181
516
}
182
}  // namespace evmmax::bn254
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/bn254/pairing.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/bn254/pairing.cpp.html new file mode 100644 index 0000000000..782161cf2d --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/bn254/pairing.cpp.html @@ -0,0 +1,80 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/pairing/bn254/pairing.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "../../bn254.hpp"
6
#include "fields.hpp"
7
#include "utils.hpp"
8
#include <vector>
9
10
namespace evmmax::bn254
11
{
12
namespace
13
{
14
/// Multiplies `fr` (Fq12) values by sparse `v` (Fq12) value of the form
15
/// [[t[0] * y, 0, 0],[t[1] * x, t[0], 0]] where `v` coefficients are from Fq2
16
constexpr void multiply_by_lin_func_value(
17
    Fq12& fr, std::array<Fq2, 3> t, const Fq& x, const Fq& y) noexcept
18
87.1k
{
19
87.1k
    const Fq12 f = fr;
20
87.1k
    const auto& ksi = Fq6Config::ksi;
21
22
87.1k
    const auto t0y = t[0] * y;
23
87.1k
    const auto t1x = t[1] * x;
24
87.1k
    const auto t2ksi = t[2] * ksi;
25
26
87.1k
    fr.coeffs[0].coeffs[0] = f.coeffs[0].coeffs[0] * t0y + f.coeffs[1].coeffs[2] * t1x * ksi +
27
87.1k
                             f.coeffs[1].coeffs[1] * t2ksi;
28
87.1k
    fr.coeffs[0].coeffs[1] =
29
87.1k
        f.coeffs[0].coeffs[1] * t0y + f.coeffs[1].coeffs[0] * t1x + f.coeffs[1].coeffs[2] * t2ksi;
30
87.1k
    fr.coeffs[0].coeffs[2] =
31
87.1k
        f.coeffs[0].coeffs[2] * t0y + f.coeffs[1].coeffs[1] * t1x + f.coeffs[1].coeffs[0] * t[2];
32
87.1k
    fr.coeffs[1].coeffs[0] =
33
87.1k
        f.coeffs[1].coeffs[0] * t0y + f.coeffs[0].coeffs[0] * t1x + f.coeffs[0].coeffs[2] * t2ksi;
34
87.1k
    fr.coeffs[1].coeffs[1] =
35
87.1k
        f.coeffs[1].coeffs[1] * t0y + f.coeffs[0].coeffs[1] * t1x + f.coeffs[0].coeffs[0] * t[2];
36
87.1k
    fr.coeffs[1].coeffs[2] =
37
87.1k
        f.coeffs[1].coeffs[2] * t0y + f.coeffs[0].coeffs[2] * t1x + f.coeffs[0].coeffs[1] * t[2];
38
87.1k
}
39
40
// 0000000100010010000010000000010000100010000000010010000000001000000100100000010000000000100000100001001000000010001000000001000101
41
// NAF rep 00 -> 0, 01 -> 1, 10 -> -1
42
// miller loop goes from L-2 to 0 inclusively. NAF rep of 29793968203157093288 (6x+2) is two bits
43
// longer, but we omit lowest 2 bits.
44
inline constexpr auto ATE_LOOP_COUNT_NAF = 0x1120804220120081204008212022011_u128;
45
inline constexpr int LOG_ATE_LOOP_COUNT = 63;
46
47
/// Miller loop according to https://eprint.iacr.org/2010/354.pdf Algorithm 1.
48
Fq12 miller_loop(const ecc::Point<Fq2>& Q, const ecc::Point<Fq>& P) noexcept
49
1.00k
{
50
1.00k
    auto T = ecc::JacPoint<Fq2>::from(Q);
51
1.00k
    auto nQ = -Q;
52
1.00k
    auto f = Fq12::one();
53
1.00k
    std::array<Fq2, 3> t;
54
1.00k
    auto naf = ATE_LOOP_COUNT_NAF;
55
1.00k
    const auto ny = -P.y;
56
57
65.1k
    for (int i = 0; i <= LOG_ATE_LOOP_COUNT; 
++i64.1k
)
58
64.1k
    {
59
64.1k
        T = lin_func_and_dbl(T, t);
60
64.1k
        f = square(f);
61
64.1k
        multiply_by_lin_func_value(f, t, P.x, ny);
62
63
64.1k
        if (naf & 1)
64
9.01k
        {
65
9.01k
            T = lin_func_and_add(T, Q, t);
66
9.01k
            multiply_by_lin_func_value(f, t, P.x, P.y);
67
9.01k
        }
68
55.1k
        else if (naf & 2)
69
12.0k
        {
70
12.0k
            T = lin_func_and_add(T, nQ, t);
71
12.0k
            multiply_by_lin_func_value(f, t, P.x, P.y);
72
12.0k
        }
73
64.1k
        naf >>= 2;
74
64.1k
    }
75
76
    // Frobenius endomorphism for point Q from twisted curve over Fq2 field.
77
    // It's essentially untwist -> frobenius -> twist chain of transformation.
78
1.00k
    const auto Q1 = endomorphism<1>(Q);
79
80
    // Similar to above one. It makes untwist -> frobenius^2 -> twist transformation plus
81
    // negation according to miller loop spec.
82
1.00k
    const auto nQ2 = -endomorphism<2>(Q);
83
84
1.00k
    T = lin_func_and_add(T, Q1, t);
85
1.00k
    multiply_by_lin_func_value(f, t, P.x, P.y);
86
87
1.00k
    lin_func(T, nQ2, t);
88
1.00k
    multiply_by_lin_func_value(f, t, P.x, P.y);
89
90
1.00k
    return f;
91
1.00k
}
92
93
/// Final exponentiation formula.
94
/// Based on https://eprint.iacr.org/2010/354.pdf 4.2 Algorithm 31.
95
Fq12 final_exp(const Fq12& v) noexcept
96
516
{
97
516
    auto f = v;
98
516
    auto f1 = f.conjugate();
99
100
516
    f = f1 * f.inv();            // easy 1
101
516
    f = endomorphism<2>(f) * f;  // easy 2
102
103
516
    f1 = f.conjugate();
104
105
516
    const auto ft1 = cyclotomic_pow_to_X(f);
106
516
    const auto ft2 = cyclotomic_pow_to_X(ft1);
107
516
    const auto ft3 = cyclotomic_pow_to_X(ft2);
108
516
    const auto fp1 = endomorphism<1>(f);
109
516
    const auto fp2 = endomorphism<2>(f);
110
516
    const auto fp3 = endomorphism<3>(f);
111
516
    const auto y0 = fp1 * fp2 * fp3;
112
516
    const auto y1 = f1;
113
516
    const auto y2 = endomorphism<2>(ft2);
114
516
    const auto y3 = endomorphism<1>(ft1).conjugate();
115
516
    const auto y4 = (endomorphism<1>(ft2) * ft1).conjugate();
116
516
    const auto y5 = ft2.conjugate();
117
516
    const auto y6 = (endomorphism<1>(ft3) * ft3).conjugate();
118
119
516
    auto t0 = cyclotomic_square(y6) * y4 * y5;
120
516
    auto t1 = y3 * y5 * t0;
121
516
    t0 = t0 * y2;
122
516
    t1 = cyclotomic_square(t1) * t0;
123
516
    t1 = cyclotomic_square(t1);
124
516
    t0 = t1 * y1;
125
516
    t1 = t1 * y0;
126
516
    t0 = cyclotomic_square(t0);
127
516
    return t1 * t0;
128
516
}
129
}  // namespace
130
131
std::optional<bool> pairing_check(std::span<const std::pair<Point, ExtPoint>> pairs) noexcept
132
1.59k
{
133
1.59k
    if (pairs.empty())
134
284
        return true;
135
136
1.31k
    auto f = Fq12::one();
137
138
1.31k
    for (const auto& [p, q] : pairs)
139
2.05k
    {
140
2.05k
        if (!is_field_element(p.x) || 
!is_field_element(p.y)2.01k
||
!is_field_element(q.x.first)2.01k
||
141
2.05k
            
!is_field_element(q.x.second)1.98k
||
!is_field_element(q.y.first)1.97k
||
142
2.05k
            
!is_field_element(q.y.second)1.94k
)
  MC/DC Decision Region (140:13) to (142:42)
+
+  Number of Conditions: 6
+     Condition C1 --> (140:13)
+     Condition C2 --> (140:39)
+     Condition C3 --> (140:65)
+     Condition C4 --> (141:13)
+     Condition C5 --> (141:46)
+     Condition C6 --> (142:13)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3, C4, C5, C6    Result
+  1 { F,  F,  F,  F,  F,  F  = F      }
+  2 { F,  F,  F,  F,  F,  T  = T      }
+  3 { F,  F,  F,  F,  T,  -  = T      }
+  4 { F,  F,  F,  T,  -,  -  = T      }
+  5 { F,  F,  T,  -,  -,  -  = T      }
+  6 { F,  T,  -,  -,  -,  -  = T      }
+  7 { T,  -,  -,  -,  -,  -  = T      }
+
+  C1-Pair: covered: (1,7)
+  C2-Pair: covered: (1,6)
+  C3-Pair: covered: (1,5)
+  C4-Pair: covered: (1,4)
+  C5-Pair: covered: (1,3)
+  C6-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
143
132
        {
144
132
            return std::nullopt;
145
132
        }
146
147
        // Converts points' coefficients in Montgomery form.
148
1.92k
        const auto P_aff = ecc::Point<Fq>{Fq::from_int(p.x), Fq::from_int(p.y)};
149
1.92k
        const auto Q_aff = ecc::Point<Fq2>{Fq2({Fq::from_int(q.x.first), Fq::from_int(q.x.second)}),
150
1.92k
            Fq2({Fq::from_int(q.y.first), Fq::from_int(q.y.second)})};
151
152
1.92k
        const bool g1_is_inf = is_infinity(P_aff);
153
1.92k
        const bool g2_is_inf = g2_is_infinity(Q_aff);
154
155
        // Verify that P in on curve. For this group it also means that P is in G1.
156
1.92k
        if (!g1_is_inf && 
!is_on_curve(P_aff)1.58k
)
  MC/DC Decision Region (156:13) to (156:46)
+
+  Number of Conditions: 2
+     Condition C1 --> (156:13)
+     Condition C2 --> (156:27)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
157
108
            return std::nullopt;
158
159
        // Verify that Q in on curve and in proper subgroup. This subgroup is much smaller than
160
        // group containing all the points from twisted curve over Fq2 field.
161
1.81k
        if (!g2_is_inf && 
(1.60k
!is_on_twisted_curve(Q_aff)1.60k
||
!g2_subgroup_check(Q_aff)1.51k
))
  MC/DC Decision Region (161:13) to (161:85)
+
+  Number of Conditions: 3
+     Condition C1 --> (161:13)
+     Condition C2 --> (161:28)
+     Condition C3 --> (161:59)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  F,  F  = F      }
+  3 { T,  F,  T  = T      }
+  4 { T,  T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,4)
+  C3-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
162
558
            return std::nullopt;
163
164
        // If any of the points is infinity it means that miller_loop returns 1. so we can skip it.
165
1.25k
        if (!g1_is_inf && 
!g2_is_inf1.14k
)
  MC/DC Decision Region (165:13) to (165:37)
+
+  Number of Conditions: 2
+     Condition C1 --> (165:13)
+     Condition C2 --> (165:27)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
166
1.00k
            f = f * miller_loop(Q_aff, P_aff);
167
1.25k
    }
168
169
    // final exp is calculated on accumulated value
170
516
    return final_exp(f) == Fq12::one();
171
1.31k
}
172
}  // namespace evmmax::bn254
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/bn254/utils.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/bn254/utils.hpp.html new file mode 100644 index 0000000000..0adccf31ef --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/bn254/utils.hpp.html @@ -0,0 +1,33 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/pairing/bn254/utils.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include "fields.hpp"
7
8
namespace evmmax::bn254
9
{
10
consteval Fq2 make_fq2(const uint256& a, const uint256& b) noexcept
11
{
12
    return Fq2({Fq::from_int(a), Fq::from_int(b)});
13
}
14
15
/// Defines coefficients needed for fast Frobenius endomorphism computation.
16
/// For more ref see https://eprint.iacr.org/2010/354.pdf 3.2 Frobenius Operator.
17
/// TODO: Make it constexpr.
18
static inline std::array<std::array<Fq2, 5>, 3> FROBENIUS_COEFFS = {
19
    {
20
        {
21
            make_fq2(
22
                8376118865763821496583973867626364092589906065868298776909617916018768340080_u256,
23
                16469823323077808223889137241176536799009286646108169935659301613961712198316_u256),
24
            make_fq2(
25
                21575463638280843010398324269430826099269044274347216827212613867836435027261_u256,
26
                10307601595873709700152284273816112264069230130616436755625194854815875713954_u256),
27
            make_fq2(
28
                2821565182194536844548159561693502659359617185244120367078079554186484126554_u256,
29
                3505843767911556378687030309984248845540243509899259641013678093033130930403_u256),
30
            make_fq2(
31
                2581911344467009335267311115468803099551665605076196740867805258568234346338_u256,
32
                19937756971775647987995932169929341994314640652964949448313374472400716661030_u256),
33
            make_fq2(
34
                685108087231508774477564247770172212460312782337200605669322048753928464687_u256,
35
                8447204650696766136447902020341177575205426561248465145919723016860428151883_u256),
36
        },
37
        {
38
            make_fq2(
39
                21888242871839275220042445260109153167277707414472061641714758635765020556617_u256,
40
                0_u256),
41
            make_fq2(
42
                21888242871839275220042445260109153167277707414472061641714758635765020556616_u256,
43
                0_u256),
44
            make_fq2(
45
                21888242871839275222246405745257275088696311157297823662689037894645226208582_u256,
46
                0_u256),
47
            make_fq2(2203960485148121921418603742825762020974279258880205651966_u256, 0_u256),
48
            make_fq2(2203960485148121921418603742825762020974279258880205651967_u256, 0_u256),
49
        },
50
        {
51
            make_fq2(
52
                11697423496358154304825782922584725312912383441159505038794027105778954184319_u256,
53
                303847389135065887422783454877609941456349188919719272345083954437860409601_u256),
54
            make_fq2(
55
                3772000881919853776433695186713858239009073593817195771773381919316419345261_u256,
56
                2236595495967245188281701248203181795121068902605861227855261137820944008926_u256),
57
            make_fq2(
58
                19066677689644738377698246183563772429336693972053703295610958340458742082029_u256,
59
                18382399103927718843559375435273026243156067647398564021675359801612095278180_u256),
60
            make_fq2(
61
                5324479202449903542726783395506214481928257762400643279780343368557297135718_u256,
62
                16208900380737693084919495127334387981393726419856888799917914180988844123039_u256),
63
            make_fq2(
64
                8941241848238582420466759817324047081148088512956452953208002715982955420483_u256,
65
                10338197737521362862238855242243140895517409139741313354160881284257516364953_u256),
66
        },
67
    },
68
};
69
70
/// Verifies that value is in the proper prime field.
71
constexpr bool is_field_element(const uint256& v)
72
11.9k
{
73
11.9k
    return v < Curve::FIELD_PRIME;
74
11.9k
}
75
76
/// Verifies that affine point is on the curve (not twisted)
77
constexpr bool is_on_curve(const ecc::Point<Fq>& p) noexcept
78
1.58k
{
79
    // TODO(C++23): make static
80
1.58k
    constexpr auto B = Fq::from_int(3);
81
82
1.58k
    const auto x3 = p.x * p.x * p.x;
83
1.58k
    const auto y2 = p.y * p.y;
84
1.58k
    return y2 == x3 + B;
85
1.58k
}
86
87
/// Verifies that affine point over Fq^2 field is on the twisted curve.
88
constexpr bool is_on_twisted_curve(const evmmax::ecc::Point<Fq2>& p)
89
1.60k
{
90
1.60k
    const auto x3 = p.x * p.x * p.x;
91
1.60k
    const auto y2 = p.y * p.y;
92
93
1.60k
    return y2 == x3 + Fq6Config::_3_ksi_inv;
94
1.60k
}
95
96
/// Verifies that affine point over the base field is infinity.
97
constexpr bool is_infinity(const evmmax::ecc::Point<Fq>& p)
98
1.92k
{
99
1.92k
    return p.x.is_zero() && 
p.y.is_zero()360
;
  MC/DC Decision Region (99:12) to (99:42)
+
+  Number of Conditions: 2
+     Condition C1 --> (99:12)
+     Condition C2 --> (99:29)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
100
1.92k
}
101
102
/// Verifies that affine point over the Fq^2 extended field is infinity.
103
constexpr bool g2_is_infinity(const evmmax::ecc::Point<Fq2>& p)
104
1.92k
{
105
1.92k
    return p.x == Fq2::zero() && 
p.y == Fq2::zero()276
;
  MC/DC Decision Region (105:12) to (105:52)
+
+  Number of Conditions: 2
+     Condition C1 --> (105:12)
+     Condition C2 --> (105:34)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
106
1.92k
}
107
108
// Forbenius endomorphism related functions are implemented based on
109
// https://hackmd.io/@jpw/bn254#mathbb-G_2-membership-check-using-efficient-endomorphism
110
// and
111
// https://eprint.iacr.org/2010/354.pdf 3.2 Frobenius Operator
112
113
/// Computes Frobenius endomorphism of point `p` in Jacobian coordinates from twisted curve
114
/// over Fq2 extended field.
115
/// This specialisation computes Frobenius and Frobenius^3
116
/// TODO: add reference that it's exactly the same as untwist->frobenius->twist
117
template <int P>
118
constexpr ecc::JacPoint<Fq2> endomorphism(const ecc::JacPoint<Fq2>& p) noexcept
119
    requires(P == 1 || P == 3)
120
4.55k
{
121
4.55k
    return {
122
4.55k
        p.x.conjugate() * FROBENIUS_COEFFS[P - 1][1],
123
4.55k
        p.y.conjugate() * FROBENIUS_COEFFS[P - 1][2],
124
4.55k
        p.z.conjugate(),
125
4.55k
    };
126
4.55k
}
127
128
/// Computes Frobenius endomorphism of point `p` in Jacobian coordinates from twisted curve
129
/// over Fq^2 extended field.
130
/// This specialisation computes Frobenius^2
131
template <int P>
132
constexpr ecc::JacPoint<Fq2> endomorphism(const ecc::JacPoint<Fq2>& p) noexcept
133
    requires(P == 2)
134
1.51k
{
135
1.51k
    return {
136
1.51k
        p.x * FROBENIUS_COEFFS[1][1],
137
1.51k
        p.y * FROBENIUS_COEFFS[1][2],
138
1.51k
        p.z,
139
1.51k
    };
140
1.51k
}
141
142
/// Computes Frobenius endomorphism of point `p` in affine coordinates from twisted curve
143
/// over Fq^2 extended field.
144
/// This specialisation computes Frobenius and Frobenius^3
145
template <int P>
146
constexpr ecc::Point<Fq2> endomorphism(const ecc::Point<Fq2>& p) noexcept
147
    requires(P == 1 || P == 3)
148
1.00k
{
149
1.00k
    return {
150
1.00k
        p.x.conjugate() * FROBENIUS_COEFFS[P - 1][1],
151
1.00k
        p.y.conjugate() * FROBENIUS_COEFFS[P - 1][2],
152
1.00k
    };
153
1.00k
}
154
155
/// Computes Frobenius endomorphism of point `p` in affine coordinates from twisted curve
156
/// over Fq^2 extended field.
157
/// This specialisation computes Frobenius^2
158
template <int P>
159
constexpr ecc::Point<Fq2> endomorphism(const ecc::Point<Fq2>& p) noexcept
160
    requires(P == 2)
161
1.00k
{
162
1.00k
    return {
163
1.00k
        p.x * FROBENIUS_COEFFS[1][1],
164
1.00k
        p.y * FROBENIUS_COEFFS[1][2],
165
1.00k
    };
166
1.00k
}
167
168
/// Computes Frobenius endomorphism for Fq12 field member values
169
/// This specialisation computes Frobenius and Frobenius^3
170
template <int P>
171
constexpr Fq12 endomorphism(const Fq12& f) noexcept
172
    requires(P == 1 || P == 3)
173
2.58k
{
174
2.58k
    return Fq12({
175
2.58k
        Fq6({
176
2.58k
            f.coeffs[0].coeffs[0].conjugate(),
177
2.58k
            f.coeffs[0].coeffs[1].conjugate() * FROBENIUS_COEFFS[P - 1][1],
178
2.58k
            f.coeffs[0].coeffs[2].conjugate() * FROBENIUS_COEFFS[P - 1][3],
179
2.58k
        }),
180
2.58k
        Fq6({
181
2.58k
            f.coeffs[1].coeffs[0].conjugate() * FROBENIUS_COEFFS[P - 1][0],
182
2.58k
            f.coeffs[1].coeffs[1].conjugate() * FROBENIUS_COEFFS[P - 1][2],
183
2.58k
            f.coeffs[1].coeffs[2].conjugate() * FROBENIUS_COEFFS[P - 1][4],
184
2.58k
        }),
185
2.58k
    });
186
2.58k
}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> evmmax::bn254::endomorphism<1>(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&) requires T == 1 || T == 3
Line
Count
Source
173
2.06k
{
174
2.06k
    return Fq12({
175
2.06k
        Fq6({
176
2.06k
            f.coeffs[0].coeffs[0].conjugate(),
177
2.06k
            f.coeffs[0].coeffs[1].conjugate() * FROBENIUS_COEFFS[P - 1][1],
178
2.06k
            f.coeffs[0].coeffs[2].conjugate() * FROBENIUS_COEFFS[P - 1][3],
179
2.06k
        }),
180
2.06k
        Fq6({
181
2.06k
            f.coeffs[1].coeffs[0].conjugate() * FROBENIUS_COEFFS[P - 1][0],
182
2.06k
            f.coeffs[1].coeffs[1].conjugate() * FROBENIUS_COEFFS[P - 1][2],
183
2.06k
            f.coeffs[1].coeffs[2].conjugate() * FROBENIUS_COEFFS[P - 1][4],
184
2.06k
        }),
185
2.06k
    });
186
2.06k
}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> evmmax::bn254::endomorphism<3>(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&) requires T == 1 || T == 3
Line
Count
Source
173
516
{
174
516
    return Fq12({
175
516
        Fq6({
176
516
            f.coeffs[0].coeffs[0].conjugate(),
177
516
            f.coeffs[0].coeffs[1].conjugate() * FROBENIUS_COEFFS[P - 1][1],
178
516
            f.coeffs[0].coeffs[2].conjugate() * FROBENIUS_COEFFS[P - 1][3],
179
516
        }),
180
516
        Fq6({
181
516
            f.coeffs[1].coeffs[0].conjugate() * FROBENIUS_COEFFS[P - 1][0],
182
516
            f.coeffs[1].coeffs[1].conjugate() * FROBENIUS_COEFFS[P - 1][2],
183
516
            f.coeffs[1].coeffs[2].conjugate() * FROBENIUS_COEFFS[P - 1][4],
184
516
        }),
185
516
    });
186
516
}
187
188
/// Computes Frobenius operator for Fq12 field member values
189
/// This specialization computes Frobenius^2
190
template <int P>
191
constexpr Fq12 endomorphism(const Fq12& f) noexcept
192
    requires(P == 2)
193
1.54k
{
194
1.54k
    return Fq12({
195
1.54k
        Fq6({
196
1.54k
            f.coeffs[0].coeffs[0],
197
1.54k
            f.coeffs[0].coeffs[1] * FROBENIUS_COEFFS[1][1],
198
1.54k
            f.coeffs[0].coeffs[2] * FROBENIUS_COEFFS[1][3],
199
1.54k
        }),
200
1.54k
        Fq6({
201
1.54k
            f.coeffs[1].coeffs[0] * FROBENIUS_COEFFS[1][0],
202
1.54k
            f.coeffs[1].coeffs[1] * FROBENIUS_COEFFS[1][2],
203
1.54k
            f.coeffs[1].coeffs[2] * FROBENIUS_COEFFS[1][4],
204
1.54k
        }),
205
1.54k
    });
206
1.54k
}
207
208
209
/// Computes `P0 + P1` in Jacobian coordinates.
210
constexpr ecc::JacPoint<Fq2> add(
211
    const ecc::JacPoint<Fq2>& P0, const ecc::JacPoint<Fq2>& P1) noexcept
212
30.3k
{
213
30.3k
    const auto& x0 = P0.x;
214
30.3k
    const auto& y0 = P0.y;
215
30.3k
    const auto& z0 = P0.z;
216
217
30.3k
    const auto& x1 = P1.x;
218
30.3k
    const auto& y1 = P1.y;
219
30.3k
    const auto& z1 = P1.z;
220
221
30.3k
    const auto z0_squared = z0 * z0;
222
30.3k
    const auto z0_cubed = z0 * z0_squared;
223
224
30.3k
    const auto z1_squared = z1 * z1;
225
30.3k
    const auto z1_cubed = z1 * z1_squared;
226
227
30.3k
    const auto U1 = x0 * z1_squared;
228
30.3k
    const auto U2 = x1 * z0_squared;
229
30.3k
    const auto S1 = y0 * z1_cubed;
230
30.3k
    const auto S2 = y1 * z0_cubed;
231
30.3k
    const auto H = U2 - U1;  // x1 * z0^2 - x0 * z1^2
232
30.3k
    const auto R = S2 - S1;  // y1 * z0^3 - y0 * z1 ^3
233
234
30.3k
    const auto H_squared = H * H;
235
30.3k
    const auto H_cubed = H * H_squared;
236
30.3k
    const auto R_squared = R * R;
237
238
30.3k
    const auto V = U1 * H_squared;
239
240
30.3k
    const auto X3 = R_squared - H_cubed - (V + V);
241
30.3k
    const auto Y3 = R * (U1 * H_squared - X3) - S1 * H_cubed;
242
30.3k
    const auto Z3 = H * z0 * z1;
243
244
30.3k
    return {X3, Y3, Z3};
245
30.3k
}
246
247
/// Computes `Q + Q` in Jacobian coordinates.
248
constexpr ecc::JacPoint<Fq2> dbl(const ecc::JacPoint<Fq2>& Q) noexcept
249
95.6k
{
250
95.6k
    const auto& x = Q.x;
251
95.6k
    const auto& y = Q.y;
252
95.6k
    const auto& z = Q.z;
253
254
95.6k
    const auto y_squared = y * y;
255
95.6k
    const auto x_squared = x * x;
256
95.6k
    const auto z_squared = z * z;
257
95.6k
    const auto y_4 = y_squared * y_squared;
258
95.6k
    const auto _4y_4 = y_4 + y_4 + y_4 + y_4;
259
260
95.6k
    const auto R = y_squared + y_squared;
261
95.6k
    const auto A = (x + R);
262
95.6k
    const auto S = A * A - x_squared - _4y_4;  // 2xR = (x+R)^2 - x^2 - R^2
263
95.6k
    const auto M = x_squared + x_squared + x_squared;
264
265
95.6k
    const auto N = y + z;
266
267
95.6k
    const auto Xp = M * M - (S + S);
268
95.6k
    const auto Yp = M * (S - Xp) - (_4y_4 + _4y_4);
269
95.6k
    const auto Zp = N * N - y_squared - z_squared;  // 2yz = (y+z)^2 - y^2 - z^2
270
271
95.6k
    return {Xp, Yp, Zp};
272
95.6k
}
273
274
/// Computes `N` doubles of the point `a` in Jacobian coordinates.
275
template <int N>
276
constexpr ecc::JacPoint<Fq2> n_dbl(const ecc::JacPoint<Fq2>& a) noexcept
277
12.1k
{
278
12.1k
    auto r = dbl(a);
279
86.5k
    for (int i = 0; i < N - 1; 
++i74.3k
)
280
74.3k
        r = dbl(r);
281
282
12.1k
    return r;
283
12.1k
}
evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> evmmax::bn254::n_dbl<6>(evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> const&)
Line
Count
Source
277
6.07k
{
278
6.07k
    auto r = dbl(a);
279
36.4k
    for (int i = 0; i < N - 1; 
++i30.3k
)
280
30.3k
        r = dbl(r);
281
282
6.07k
    return r;
283
6.07k
}
evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> evmmax::bn254::n_dbl<7>(evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> const&)
Line
Count
Source
277
1.51k
{
278
1.51k
    auto r = dbl(a);
279
10.6k
    for (int i = 0; i < N - 1; 
++i9.10k
)
280
9.10k
        r = dbl(r);
281
282
1.51k
    return r;
283
1.51k
}
evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> evmmax::bn254::n_dbl<8>(evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> const&)
Line
Count
Source
277
3.03k
{
278
3.03k
    auto r = dbl(a);
279
24.2k
    for (int i = 0; i < N - 1; 
++i21.2k
)
280
21.2k
        r = dbl(r);
281
282
3.03k
    return r;
283
3.03k
}
evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> evmmax::bn254::n_dbl<10>(evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> const&)
Line
Count
Source
277
1.51k
{
278
1.51k
    auto r = dbl(a);
279
15.1k
    for (int i = 0; i < N - 1; 
++i13.6k
)
280
13.6k
        r = dbl(r);
281
282
1.51k
    return r;
283
1.51k
}
284
285
/// Addchain generated algorithm which multiplies point `a` in Jacobian coordinated
286
/// by X (curve seed).
287
constexpr ecc::JacPoint<Fq2> mul_by_X(const ecc::JacPoint<Fq2>& a) noexcept
288
1.51k
{
289
1.51k
    auto t0 = dbl(a);
290
1.51k
    auto t2 = dbl(t0);
291
1.51k
    auto c = dbl(t2);
292
1.51k
    auto t4 = dbl(c);
293
1.51k
    auto t6 = add(a, t4);
294
1.51k
    t4 = add(t6, t0);
295
1.51k
    auto t8 = add(a, t4);
296
1.51k
    auto t10 = add(c, t6);
297
1.51k
    auto t12 = dbl(t6);
298
1.51k
    t8 = add(t8, t4);
299
1.51k
    t4 = add(t8, t0);
300
1.51k
    t12 = n_dbl<6>(t12);
301
1.51k
    t2 = add(t12, t2);
302
1.51k
    t2 = add(t2, t10);
303
1.51k
    t2 = n_dbl<7>(t2);
304
1.51k
    t10 = add(t2, t10);
305
1.51k
    t10 = n_dbl<8>(t10);
306
1.51k
    t10 = add(t10, t4);
307
1.51k
    t0 = add(t10, t0);
308
1.51k
    t0 = n_dbl<6>(t0);
309
1.51k
    t6 = add(t0, t6);
310
1.51k
    t6 = n_dbl<8>(t6);
311
1.51k
    t6 = add(t6, t4);
312
1.51k
    t6 = n_dbl<6>(t6);
313
1.51k
    t6 = add(t6, t4);
314
1.51k
    t6 = n_dbl<10>(t6);
315
1.51k
    t8 = add(t6, t8);
316
1.51k
    t8 = n_dbl<6>(t8);
317
1.51k
    t4 = add(t4, t8);
318
1.51k
    c = add(t4, c);
319
320
1.51k
    return c;
321
1.51k
}
322
323
/// Checks that point `p_aff` is in proper subgroup of points from twisted curve over Fq2 field.
324
/// For more details see https://eprint.iacr.org/2022/348.pdf Example 1 from 3.1.2 Examples
325
constexpr bool g2_subgroup_check(const ecc::Point<Fq2>& p_aff)
326
1.51k
{
327
1.51k
    const auto p = ecc::JacPoint<Fq2>::from(p_aff);
328
329
1.51k
    const auto px = mul_by_X(p);
330
1.51k
    const auto px1 = add(px, p);
331
1.51k
    const auto _2px = dbl(px);
332
333
1.51k
    const auto e_px = endomorphism<1>(px);
334
1.51k
    const auto ee_px = endomorphism<1>(e_px);
335
1.51k
    const auto eee_2px = endomorphism<1>(endomorphism<2>(_2px));
336
337
1.51k
    const auto l = add(add(px1, e_px), ee_px);
338
339
1.51k
    return l == eee_2px;
340
1.51k
}
341
342
/// Computes point Q doubling for twisted curve + line tangent (in untwisted Q) to
343
/// the curve (not twisted curve) evaluated at point P
344
/// Returns live evaluation coefficients (-t, tw, tvw)
345
/// For more details see https://notes.ethereum.org/@ipsilon/Hkn2a2qk0
346
constexpr ecc::JacPoint<Fq2> lin_func_and_dbl(
347
    const ecc::JacPoint<Fq2>& Q, std::array<Fq2, 3>& t) noexcept
348
64.1k
{
349
64.1k
    const auto& x = Q.x;
350
64.1k
    const auto& y = Q.y;
351
64.1k
    const auto& z = Q.z;
352
353
64.1k
    const auto y_squared = y * y;
354
64.1k
    const auto x_squared = x * x;
355
64.1k
    const auto z_squared = z * z;
356
64.1k
    const auto y_4 = y_squared * y_squared;
357
64.1k
    const auto _4y_4 = y_4 + y_4 + y_4 + y_4;
358
359
64.1k
    const auto R = y_squared + y_squared;
360
64.1k
    const auto A = (x + R);
361
64.1k
    const auto S = A * A - x_squared - _4y_4;  // 2xR = (x+R)^2 - x^2 - R^2
362
64.1k
    const auto M = x_squared + x_squared + x_squared;
363
364
64.1k
    const auto N = y + z;
365
366
64.1k
    const auto Xp = M * M - (S + S);
367
64.1k
    const auto Yp = M * (S - Xp) - (_4y_4 + _4y_4);
368
64.1k
    const auto Zp = N * N - y_squared - z_squared;  // 2yz = (y+z)^2 - y^2 - z^2
369
370
64.1k
    t[0] = Zp * z_squared;
371
64.1k
    t[1] = M * z_squared;
372
64.1k
    t[2] = R - M * x;
373
374
64.1k
    return ecc::JacPoint<Fq2>{Xp, Yp, Zp};
375
64.1k
}
376
377
/// Computes points P0 and P1 addition for twisted curve + line defined by untwisted P1 and P2
378
/// points on the curve (not twisted curve) evaluated at point P. Formula is simplified for P1.z
379
/// == 1. For more details see https://notes.ethereum.org/@ipsilon/Hkn2a2qk0
380
[[nodiscard]] constexpr ecc::JacPoint<Fq2> lin_func_and_add(
381
    const ecc::JacPoint<Fq2>& P0, const ecc::Point<Fq2>& P1, std::array<Fq2, 3>& t) noexcept
382
22.0k
{
383
22.0k
    const auto& x0 = P0.x;
384
22.0k
    const auto& y0 = P0.y;
385
22.0k
    const auto& z0 = P0.z;
386
387
22.0k
    const auto& x1 = P1.x;
388
22.0k
    const auto& y1 = P1.y;
389
390
22.0k
    const auto z0_squared = z0 * z0;
391
22.0k
    const auto z0_cubed = z0 * z0_squared;
392
393
22.0k
    const auto U2 = x1 * z0_squared;
394
22.0k
    const auto S2 = y1 * z0_cubed;
395
22.0k
    const auto H = U2 - x0;  // x1 * z0^2 - x0 * z1^2
396
22.0k
    const auto R = S2 - y0;  // y1 * z0^3 - y0 * z1 ^3
397
398
22.0k
    const auto H_squared = H * H;
399
22.0k
    const auto H_cubed = H * H_squared;
400
22.0k
    const auto R_squared = R * R;
401
402
22.0k
    const auto V = x0 * H_squared;
403
404
22.0k
    const auto X3 = R_squared - H_cubed - (V + V);
405
22.0k
    const auto Y3 = R * (x0 * H_squared - X3) - y0 * H_cubed;
406
22.0k
    const auto Z3 = H * z0;
407
408
22.0k
    t[0] = (z0 * z0_squared * x0 - U2 * z0_cubed);
409
22.0k
    t[1] = (S2 * z0_squared - y0 * z0_squared);
410
22.0k
    t[2] = y0 * U2 - x0 * S2;
411
412
22.0k
    return ecc::JacPoint<Fq2>{X3, Y3, Z3};
413
22.0k
}
414
415
/// Computes points P0 and P1 addition for twisted curve + line defined by untwisted P1 and P2
416
/// points on the curve (not twisted curve) evaluated at point P. Formula is simplified for P1.z
417
/// == 1. For more details see https://notes.ethereum.org/@ipsilon/Hkn2a2qk0
418
constexpr void lin_func(
419
    const ecc::JacPoint<Fq2>& P0, const ecc::Point<Fq2>& P1, std::array<Fq2, 3>& t) noexcept
420
1.00k
{
421
1.00k
    const auto& x0 = P0.x;
422
1.00k
    const auto& y0 = P0.y;
423
1.00k
    const auto& z0 = P0.z;
424
425
1.00k
    const auto& x1 = P1.x;
426
1.00k
    const auto& y1 = P1.y;
427
428
1.00k
    const auto z0_squared = z0 * z0;
429
1.00k
    const auto z0_cubed = z0 * z0_squared;
430
431
1.00k
    const auto U2 = x1 * z0_squared;
432
1.00k
    const auto S2 = y1 * z0_cubed;
433
434
1.00k
    t[0] = (z0 * z0_squared * x0 - U2 * z0_cubed);
435
1.00k
    t[1] = (S2 * z0_squared - y0 * z0_squared);
436
1.00k
    t[2] = y0 * U2 - x0 * S2;
437
1.00k
}
438
439
/// Computes f^2 for f in Fq12. For more ref https://eprint.iacr.org/2010/354.pdf Algorithm 22
440
[[nodiscard]] constexpr Fq12 square(const Fq12& f) noexcept
441
64.1k
{
442
64.1k
    const Fq2& ksi = Fq6Config::ksi;
443
444
64.1k
    const auto& a0 = f.coeffs[0];
445
64.1k
    const auto& a1 = f.coeffs[1];
446
64.1k
    auto c0 = a0 - a1;
447
64.1k
    auto c3 = a0 - Fq6({ksi * a1.coeffs[2], a1.coeffs[0], a1.coeffs[1]});
448
64.1k
    auto c2 = a0 * a1;
449
64.1k
    c0 = c0 * c3 + c2;
450
64.1k
    const auto c1 = c2 + c2;
451
64.1k
    c2 = Fq6({ksi * c2.coeffs[2], c2.coeffs[0], c2.coeffs[1]});
452
64.1k
    c0 = c0 + c2;
453
454
64.1k
    return Fq12({c0, c1});
455
64.1k
}
456
457
/// Computes `a^2` for `a` from `Fq^4 = Fq^2[V](V^2 - ksi)` where `V` is from Fq^2 extended field.
458
/// For more reference see https://eprint.iacr.org/2010/354.pdf Algorithm 9
459
constexpr std::pair<Fq2, Fq2> fq4_square(const std::pair<Fq2, Fq2>& a)
460
294k
{
461
294k
    const auto& a0 = a.first;
462
294k
    const auto& a1 = a.second;
463
464
294k
    const auto t0 = a0 * a0;
465
294k
    const auto t1 = a1 * a1;
466
467
294k
    const auto c0 = t1 * Fq6Config::ksi + t0;
468
294k
    auto c1 = a0 + a1;
469
294k
    c1 = c1 * c1 - t0 - t1;
470
471
294k
    return {c0, c1};
472
294k
}
473
474
/// Computes `c^2` for `x` from Fq^12 where `x^(FieldPrime^6 - 1) == 1`.
475
/// This is Fq^12 subgroup called cyclotomic polynomials or group of `r` roots of unity.
476
constexpr Fq12 cyclotomic_square(const Fq12& c)
477
98.0k
{
478
98.0k
    const auto& g = c.coeffs[0];
479
98.0k
    const auto& h = c.coeffs[1];
480
481
98.0k
    const auto& g0 = g.coeffs[0];
482
98.0k
    const auto& g1 = g.coeffs[1];
483
98.0k
    const auto& g2 = g.coeffs[2];
484
485
98.0k
    const auto& h0 = h.coeffs[0];
486
98.0k
    const auto& h1 = h.coeffs[1];
487
98.0k
    const auto& h2 = h.coeffs[2];
488
489
98.0k
    const auto [t00, t11] = fq4_square({g0, h1});
490
98.0k
    const auto [t01, t12] = fq4_square({h0, g2});  // Typo in paper t01 <-> t12
491
98.0k
    const auto [t02, aux] = fq4_square({g1, h2});
492
493
98.0k
    const auto t10 = aux * Fq6Config::ksi;
494
495
98.0k
    const auto c00 = (t00 + t00 + t00) - (g0 + g0);
496
98.0k
    const auto c01 = (t01 + t01 + t01) - (g1 + g1);
497
98.0k
    const auto c02 = (t02 + t02 + t02) - (g2 + g2);
498
499
98.0k
    const auto c10 = h0 + h0 + t10 + t10 + t10;
500
98.0k
    const auto c11 = h1 + h1 + t11 + t11 + t11;
501
98.0k
    const auto c12 = h2 + h2 + t12 + t12 + t12;
502
503
98.0k
    return Fq12({Fq6({c00, c01, c02}), Fq6({c10, c11, c12})});
504
98.0k
}
505
506
/// Computes `cyclotomic_square` N times.
507
template <int N>
508
constexpr Fq12 n_cyclotomic_square(const Fq12& c)
509
12.3k
{
510
12.3k
    auto r = c;
511
100k
    for (int i = 0; i < N; 
++i88.2k
)
512
88.2k
        r = cyclotomic_square(r);
513
514
12.3k
    return r;
515
12.3k
}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> evmmax::bn254::n_cyclotomic_square<6>(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&)
Line
Count
Source
509
6.19k
{
510
6.19k
    auto r = c;
511
43.3k
    for (int i = 0; i < N; 
++i37.1k
)
512
37.1k
        r = cyclotomic_square(r);
513
514
6.19k
    return r;
515
6.19k
}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> evmmax::bn254::n_cyclotomic_square<7>(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&)
Line
Count
Source
509
1.54k
{
510
1.54k
    auto r = c;
511
12.3k
    for (int i = 0; i < N; 
++i10.8k
)
512
10.8k
        r = cyclotomic_square(r);
513
514
1.54k
    return r;
515
1.54k
}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> evmmax::bn254::n_cyclotomic_square<8>(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&)
Line
Count
Source
509
3.09k
{
510
3.09k
    auto r = c;
511
27.8k
    for (int i = 0; i < N; 
++i24.7k
)
512
24.7k
        r = cyclotomic_square(r);
513
514
3.09k
    return r;
515
3.09k
}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> evmmax::bn254::n_cyclotomic_square<10>(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&)
Line
Count
Source
509
1.54k
{
510
1.54k
    auto r = c;
511
17.0k
    for (int i = 0; i < N; 
++i15.4k
)
512
15.4k
        r = cyclotomic_square(r);
513
514
1.54k
    return r;
515
1.54k
}
516
517
/// Computes `a^X` where `X` is the curve seed parameter
518
/// and `a` is from cyclotomic subgroup of Fq^12.
519
constexpr Fq12 cyclotomic_pow_to_X(const Fq12& a)
520
1.54k
{
521
1.54k
    auto t0 = cyclotomic_square(a);
522
1.54k
    auto t2 = cyclotomic_square(t0);
523
1.54k
    auto c = cyclotomic_square(t2);
524
1.54k
    auto t4 = cyclotomic_square(c);
525
1.54k
    auto t6 = a * t4;
526
1.54k
    t4 = t6 * t0;
527
1.54k
    auto t8 = a * t4;
528
1.54k
    auto t10 = c * t6;
529
1.54k
    auto t12 = cyclotomic_square(t6);
530
1.54k
    t8 = t8 * t4;
531
1.54k
    t4 = t8 * t0;
532
1.54k
    t12 = n_cyclotomic_square<6>(t12);
533
1.54k
    t2 = t12 * t2;
534
1.54k
    t2 = t2 * t10;
535
1.54k
    t2 = n_cyclotomic_square<7>(t2);
536
1.54k
    t10 = t2 * t10;
537
1.54k
    t10 = n_cyclotomic_square<8>(t10);
538
1.54k
    t10 = t10 * t4;
539
1.54k
    t0 = t10 * t0;
540
1.54k
    t0 = n_cyclotomic_square<6>(t0);
541
1.54k
    t6 = t0 * t6;
542
1.54k
    t6 = n_cyclotomic_square<8>(t6);
543
1.54k
    t6 = t6 * t4;
544
1.54k
    t6 = n_cyclotomic_square<6>(t6);
545
1.54k
    t6 = t6 * t4;
546
1.54k
    t6 = n_cyclotomic_square<10>(t6);
547
1.54k
    t8 = t6 * t8;
548
1.54k
    t8 = n_cyclotomic_square<6>(t8);
549
1.54k
    t4 = t4 * t8;
550
1.54k
    c = t4 * c;
551
552
1.54k
    return c;
553
1.54k
}
554
555
}  // namespace evmmax::bn254
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/field_template.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/field_template.hpp.html new file mode 100644 index 0000000000..ea604dc6da --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/pairing/field_template.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/pairing/field_template.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <array>
7
8
namespace evmmax::ecc
9
{
10
/// Implements computations over base field defined by prime number.
11
/// Wraps around ModArith struct and implements additional functions needed for pairing.
12
/// It is a template struct which can be reused for different pairing implementations.
13
template <typename ConfigT>
14
class BaseFieldElem
15
{
16
    using ValueT = typename ConfigT::ValueT;
17
18
    static constexpr ModArith<ValueT> Fp = ConfigT::MOD_ARITH;
19
20
    ValueT m_value;
21
22
public:
23
119k
    constexpr BaseFieldElem() noexcept = default;
24
25
71.3M
    explicit constexpr BaseFieldElem(const ValueT& v) noexcept : m_value(v) {}
26
27
    static constexpr BaseFieldElem from_int(const ValueT& v) noexcept
28
11.5k
    {
29
11.5k
        return BaseFieldElem(Fp.to_mont(v));
30
11.5k
    }
31
32
516
    constexpr const ValueT& value() const noexcept { return m_value; }
33
34
516
    BaseFieldElem inv() const noexcept { return inverse(*this); }
35
36
2.28k
    constexpr bool is_zero() const noexcept { return m_value == 0; }
37
38
5.35k
    static constexpr BaseFieldElem one() noexcept { return BaseFieldElem(ConfigT::ONE); }
39
40
    static constexpr BaseFieldElem zero() noexcept { return BaseFieldElem(0); }
41
42
    friend constexpr BaseFieldElem operator+(
43
        const BaseFieldElem& e1, const BaseFieldElem& e2) noexcept
44
24.2M
    {
45
24.2M
        return BaseFieldElem(Fp.add(e1.m_value, e2.m_value));
46
24.2M
    }
47
48
    friend constexpr BaseFieldElem operator-(
49
        const BaseFieldElem& e1, const BaseFieldElem& e2) noexcept
50
16.4M
    {
51
16.4M
        return BaseFieldElem(Fp.sub(e1.m_value, e2.m_value));
52
16.4M
    }
53
54
    friend constexpr BaseFieldElem operator*(
55
        const BaseFieldElem& e1, const BaseFieldElem& e2) noexcept
56
30.5M
    {
57
30.5M
        return BaseFieldElem(Fp.mul(e1.m_value, e2.m_value));
58
30.5M
    }
59
60
    friend constexpr BaseFieldElem operator-(const BaseFieldElem& e) noexcept
61
58.3k
    {
62
58.3k
        return BaseFieldElem(Fp.sub(ValueT{0}, e.m_value));
63
58.3k
    }
64
65
    friend constexpr bool operator==(
66
17.5k
        const BaseFieldElem& e1, const BaseFieldElem& e2) noexcept = default;
67
};
68
69
/// Implements extension field over the base field or other extension fields.
70
/// It is a template struct which can be reused for different pairing implementations.
71
template <typename ConfigT>
72
struct ExtFieldElem
73
{
74
    using ValueT = typename ConfigT::ValueT;
75
    using Base = typename ConfigT::BaseFieldT;
76
    static constexpr auto DEGREE = ConfigT::DEGREE;
77
    using CoeffArrT = std::array<ValueT, DEGREE>;
78
79
    // TODO: Add operator[] for nicer access.
80
    CoeffArrT coeffs = {};
81
82
58.2k
    constexpr ExtFieldElem() noexcept = default;
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config>::ExtFieldElem()
Line
Count
Source
82
2.83k
    constexpr ExtFieldElem() noexcept = default;
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config>::ExtFieldElem()
Line
Count
Source
82
8.49k
    constexpr ExtFieldElem() noexcept = default;
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>::ExtFieldElem()
Line
Count
Source
82
46.8k
    constexpr ExtFieldElem() noexcept = default;
83
84
    /// Create an element from an array of coefficients.
85
    /// TODO: This constructor may be optimized to avoid copying the array.
86
21.7M
    explicit constexpr ExtFieldElem(const CoeffArrT& cs) noexcept : coeffs{cs} {}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>::ExtFieldElem(std::array<evmmax::ecc::BaseFieldElem<evmmax::bn254::BaseFieldConfig>, 2ul> const&)
Line
Count
Source
86
20.4M
    explicit constexpr ExtFieldElem(const CoeffArrT& cs) noexcept : coeffs{cs} {}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config>::ExtFieldElem(std::array<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>, 3ul> const&)
Line
Count
Source
86
1.10M
    explicit constexpr ExtFieldElem(const CoeffArrT& cs) noexcept : coeffs{cs} {}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config>::ExtFieldElem(std::array<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config>, 2ul> const&)
Line
Count
Source
86
204k
    explicit constexpr ExtFieldElem(const CoeffArrT& cs) noexcept : coeffs{cs} {}
87
88
    constexpr ExtFieldElem conjugate() const noexcept
89
34.2k
    {
90
34.2k
        auto res = this->coeffs;
91
68.4k
        for (size_t i = 1; i < DEGREE; 
i += 234.2k
)
92
34.2k
            res[i] = -res[i];
93
34.2k
        return ExtFieldElem(res);
94
34.2k
    }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>::conjugate() const
Line
Count
Source
89
31.1k
    {
90
31.1k
        auto res = this->coeffs;
91
62.2k
        for (size_t i = 1; i < DEGREE; 
i += 231.1k
)
92
31.1k
            res[i] = -res[i];
93
31.1k
        return ExtFieldElem(res);
94
31.1k
    }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config>::conjugate() const
Line
Count
Source
89
3.09k
    {
90
3.09k
        auto res = this->coeffs;
91
6.19k
        for (size_t i = 1; i < DEGREE; 
i += 23.09k
)
92
3.09k
            res[i] = -res[i];
93
3.09k
        return ExtFieldElem(res);
94
3.09k
    }
95
96
    static constexpr ExtFieldElem one() noexcept
97
11.0k
    {
98
11.0k
        ExtFieldElem res;
99
11.0k
        res.coeffs[0] = ValueT::one();
100
11.0k
        return res;
101
11.0k
    }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config>::one()
Line
Count
Source
97
2.83k
    {
98
2.83k
        ExtFieldElem res;
99
2.83k
        res.coeffs[0] = ValueT::one();
100
2.83k
        return res;
101
2.83k
    }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config>::one()
Line
Count
Source
97
2.83k
    {
98
2.83k
        ExtFieldElem res;
99
2.83k
        res.coeffs[0] = ValueT::one();
100
2.83k
        return res;
101
2.83k
    }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>::one()
Line
Count
Source
97
5.35k
    {
98
5.35k
        ExtFieldElem res;
99
5.35k
        res.coeffs[0] = ValueT::one();
100
5.35k
        return res;
101
5.35k
    }
102
103
2.19k
    static constexpr ExtFieldElem zero() noexcept { return ExtFieldElem{}; }
104
105
1.54k
    constexpr ExtFieldElem inv() const noexcept { return inverse(*this); }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config>::inv() const
Line
Count
Source
105
516
    constexpr ExtFieldElem inv() const noexcept { return inverse(*this); }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config>::inv() const
Line
Count
Source
105
516
    constexpr ExtFieldElem inv() const noexcept { return inverse(*this); }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>::inv() const
Line
Count
Source
105
516
    constexpr ExtFieldElem inv() const noexcept { return inverse(*this); }
106
107
    friend constexpr ExtFieldElem operator+(const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept
108
8.65M
    {
109
8.65M
        auto res = e1.coeffs;
110
26.2M
        for (size_t i = 0; i < DEGREE; 
++i17.6M
)
111
17.6M
            res[i] = res[i] + e2.coeffs[i];
112
8.65M
        return ExtFieldElem(res);
113
8.65M
    }
evmmax::ecc::operator+(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&)
Line
Count
Source
108
8.35M
    {
109
8.35M
        auto res = e1.coeffs;
110
25.0M
        for (size_t i = 0; i < DEGREE; 
++i16.7M
)
111
16.7M
            res[i] = res[i] + e2.coeffs[i];
112
8.35M
        return ExtFieldElem(res);
113
8.35M
    }
evmmax::ecc::operator+(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&)
Line
Count
Source
108
297k
    {
109
297k
        auto res = e1.coeffs;
110
1.19M
        for (size_t i = 0; i < DEGREE; 
++i892k
)
111
892k
            res[i] = res[i] + e2.coeffs[i];
112
297k
        return ExtFieldElem(res);
113
297k
    }
114
115
    friend constexpr ExtFieldElem operator-(const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept
116
4.65M
    {
117
4.65M
        auto res = e1.coeffs;
118
14.1M
        for (size_t i = 0; i < DEGREE; 
++i9.51M
)
119
9.51M
            res[i] = res[i] - e2.coeffs[i];
120
4.65M
        return ExtFieldElem(res);
121
4.65M
    }
evmmax::ecc::operator-(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&)
Line
Count
Source
116
4.45M
    {
117
4.45M
        auto res = e1.coeffs;
118
13.3M
        for (size_t i = 0; i < DEGREE; 
++i8.91M
)
119
8.91M
            res[i] = res[i] - e2.coeffs[i];
120
4.45M
        return ExtFieldElem(res);
121
4.45M
    }
evmmax::ecc::operator-(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&)
Line
Count
Source
116
198k
    {
117
198k
        auto res = e1.coeffs;
118
795k
        for (size_t i = 0; i < DEGREE; 
++i596k
)
119
596k
            res[i] = res[i] - e2.coeffs[i];
120
198k
        return ExtFieldElem(res);
121
198k
    }
122
123
    friend constexpr ExtFieldElem operator-(const ExtFieldElem& e) noexcept
124
16.4k
    {
125
16.4k
        CoeffArrT ret;
126
52.9k
        for (size_t i = 0; i < DEGREE; 
++i36.5k
)
127
36.5k
            ret[i] = -e.coeffs[i];
128
16.4k
        return ExtFieldElem(ret);
129
16.4k
    }
evmmax::ecc::operator-(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&)
Line
Count
Source
124
12.8k
    {
125
12.8k
        CoeffArrT ret;
126
38.5k
        for (size_t i = 0; i < DEGREE; 
++i25.6k
)
127
25.6k
            ret[i] = -e.coeffs[i];
128
12.8k
        return ExtFieldElem(ret);
129
12.8k
    }
evmmax::ecc::operator-(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&)
Line
Count
Source
124
3.61k
    {
125
3.61k
        CoeffArrT ret;
126
14.4k
        for (size_t i = 0; i < DEGREE; 
++i10.8k
)
127
10.8k
            ret[i] = -e.coeffs[i];
128
3.61k
        return ExtFieldElem(ret);
129
3.61k
    }
130
131
    friend constexpr ExtFieldElem operator*(const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept
132
7.81M
    {
133
7.81M
        return multiply(e1, e2);
134
7.81M
    }
evmmax::ecc::operator*(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&)
Line
Count
Source
132
7.54M
    {
133
7.54M
        return multiply(e1, e2);
134
7.54M
    }
evmmax::ecc::operator*(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&)
Line
Count
Source
132
35.0k
    {
133
35.0k
        return multiply(e1, e2);
134
35.0k
    }
evmmax::ecc::operator*(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&)
Line
Count
Source
132
235k
    {
133
235k
        return multiply(e1, e2);
134
235k
    }
135
136
    friend constexpr bool operator==(
137
10.5k
        const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept = default;
evmmax::ecc::operator==(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&)
Line
Count
Source
137
9.06k
        const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept = default;
evmmax::ecc::operator==(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&)
Line
Count
Source
137
516
        const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept = default;
evmmax::ecc::operator==(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&)
Line
Count
Source
137
954
        const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept = default;
138
139
    friend constexpr ExtFieldElem operator*(const ExtFieldElem& e, const Base& s) noexcept
140
174k
    {
141
174k
        auto res = e;
142
174k
        for (auto& c : res.coeffs)
143
348k
            c = c * s;
144
174k
        return res;
145
174k
    }
146
};
147
148
}  // namespace evmmax::ecc
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/ripemd160.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/ripemd160.cpp.html new file mode 100644 index 0000000000..ed493adccb --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/ripemd160.cpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/ripemd160.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "ripemd160.hpp"
6
#include <algorithm>
7
#include <array>
8
#include <bit>
9
#include <cstdint>
10
#include <type_traits>
11
#include <utility>
12
13
#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 180000
14
// libc++ before version 18 has incorrect std::rotl signature
15
// https://github.com/llvm/llvm-project/commit/45500fa08acdf3849de9de470cdee5f4c8ee2f32
16
#pragma clang diagnostic ignored "-Wsign-conversion"
17
#endif
18
19
namespace evmone::crypto
20
{
21
namespace
22
{
23
// TODO(C++23): Use std::byteswap.
24
template <std::integral T>
25
constexpr T byteswap(T value) noexcept
26
{
27
    static_assert(std::has_unique_object_representations_v<T>, "T may not have padding bits");
28
    auto value_representation = std::bit_cast<std::array<std::byte, sizeof(T)>>(value);
29
    std::ranges::reverse(value_representation);
30
    return std::bit_cast<T>(value_representation);
31
}
32
33
/// @file
34
/// The implementation of the RIPEMD-160 hash function
35
/// based on the "RIPEMD-160: A Strengthened Version of RIPEMD"
36
/// https://homes.esat.kuleuven.be/~bosselae/ripemd160/pdf/AB-9601/AB-9601.pdf
37
38
constexpr size_t L = 2;      ///< Number of lines.
39
constexpr size_t R = 5;      ///< Number of rounds.
40
constexpr size_t B = 16;     ///< Number of steps per round and words in a block.
41
constexpr size_t N = R * B;  ///< Number of steps.
42
43
using State = std::array<uint32_t, RIPEMD160_HASH_SIZE / sizeof(uint32_t)>;
44
45
using BinaryFunction = uint32_t (*)(uint32_t, uint32_t, uint32_t) noexcept;
46
47
// TODO: Functions from the array of function pointers are not inlined by GCC:
48
//       https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114452
49
// TODO(C++23): Mark these as [[always_inline]]
50
constexpr BinaryFunction binary_functions[R] = {
51
    // f₁(x, y, z) = x ⊕ y ⊕ z
52
19.9k
    [](uint32_t x, uint32_t y, uint32_t z) noexcept { return x ^ y ^ z; },
53
54
    // f₂(x, y, z) = (x ∧ y) ∨ (¬x ∧ z) ⇔ ((y ⊕ z) ∧ x) ⊕ z
55
19.9k
    [](uint32_t x, uint32_t y, uint32_t z) noexcept { return ((y ^ z) & x) ^ z; },
56
57
    // f₃(x, y, z) = (x ∨ ¬y) ⊕ z
58
19.9k
    [](uint32_t x, uint32_t y, uint32_t z) noexcept { return (x | ~y) ^ z; },
59
60
    // f₄(x, y, z) = (x ∧ z) ∨ (y ∧ ¬z) ⇔ ((x ⊕ y) ∧ z) ⊕ y
61
19.9k
    [](uint32_t x, uint32_t y, uint32_t z) noexcept { return ((x ^ y) & z) ^ y; },
62
63
    // f₅(x, y, z) = x ⊕ (y ∨ ¬z)
64
19.9k
    [](uint32_t x, uint32_t y, uint32_t z) noexcept { return x ^ (y | ~z); },
65
};
66
67
/// Added constants.
68
constexpr uint32_t constants[L][R] = {
69
    {
70
        0,
71
        0x5a827999,
72
        0x6ed9eba1,
73
        0x8f1bbcdc,
74
        0xa953fd4e,
75
    },
76
    {
77
        0x50a28be6,
78
        0x5c4dd124,
79
        0x6d703ef3,
80
        0x7a6d76e9,
81
        0,
82
    },
83
};
84
85
86
/// Selection of message word.
87
constexpr size_t word_index[L][N] = {
88
    {
89
        /*r ( 0..15) = */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,  //
90
        /*r (16..31) = */ 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,  //
91
        /*r (32..47) = */ 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,  //
92
        /*r (48..63) = */ 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,  //
93
        /*r (64..79) = */ 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13,  //
94
    },
95
    {
96
        /*r′( 0..15) = */ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,  //
97
        /*r′(16..31) = */ 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,  //
98
        /*r′(32..47) = */ 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,  //
99
        /*r′(48..63) = */ 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,  //
100
        /*r′(64..79) = */ 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11,  //
101
    },
102
};
103
104
/// Amount for rotate left.
105
constexpr int rotate_amount[L][N] = {
106
    {
107
        /* s ( 0..15) = */ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,  //
108
        /* s (16..31) = */ 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,  //
109
        /* s (32..47) = */ 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,  //
110
        /* s (48..63) = */ 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,  //
111
        /* s (64..79) = */ 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6,  //
112
    },
113
    {
114
        /* s′( 0..15) = */ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,  //
115
        /* s′(16..31) = */ 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,  //
116
        /* s′(32..47) = */ 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,  //
117
        /* s′(48..63) = */ 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,  //
118
        /* s′(64..79) = */ 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11,  //
119
    },
120
};
121
122
/// Converts native representation to/from little-endian.
123
inline auto to_le(std::integral auto x) noexcept
124
103k
{
125
    if constexpr (std::endian::native == std::endian::big)
126
        return byteswap(x);
127
103k
    return x;
128
103k
}
ripemd160.cpp:auto evmone::crypto::(anonymous namespace)::to_le<unsigned int>(unsigned int)
Line
Count
Source
124
102k
{
125
    if constexpr (std::endian::native == std::endian::big)
126
        return byteswap(x);
127
102k
    return x;
128
102k
}
ripemd160.cpp:auto evmone::crypto::(anonymous namespace)::to_le<unsigned long>(unsigned long)
Line
Count
Source
124
568
{
125
    if constexpr (std::endian::native == std::endian::big)
126
        return byteswap(x);
127
568
    return x;
128
568
}
129
130
template <typename T>
131
inline T load_le(const std::byte* data) noexcept
132
99.8k
{
133
99.8k
    std::array<std::byte, sizeof(T)> bytes{};
134
99.8k
    std::copy_n(data, sizeof(T), bytes.begin());
135
99.8k
    return to_le(std::bit_cast<T>(bytes));
136
99.8k
}
137
138
inline std::byte* store_le(std::byte* out, std::integral auto x) noexcept
139
3.40k
{
140
3.40k
    return std::ranges::copy(std::bit_cast<std::array<std::byte, sizeof(x)>>(to_le(x)), out).out;
141
3.40k
}
ripemd160.cpp:std::byte* evmone::crypto::(anonymous namespace)::store_le<unsigned long>(std::byte*, unsigned long)
Line
Count
Source
139
568
{
140
568
    return std::ranges::copy(std::bit_cast<std::array<std::byte, sizeof(x)>>(to_le(x)), out).out;
141
568
}
ripemd160.cpp:std::byte* evmone::crypto::(anonymous namespace)::store_le<unsigned int>(std::byte*, unsigned int)
Line
Count
Source
139
2.84k
{
140
2.84k
    return std::ranges::copy(std::bit_cast<std::array<std::byte, sizeof(x)>>(to_le(x)), out).out;
141
2.84k
}
142
143
template <size_t J>
144
inline void step(State z[L], const std::byte* block) noexcept
145
49.9k
{
146
49.9k
    static constexpr auto I = J / B;  // round index
147
49.9k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
149k
    for (size_t i = 0; i < L; 
++i99.8k
)
150
99.8k
    {
151
99.8k
        const auto f = fs[i];
152
99.8k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
99.8k
        const auto k = constants[i][I];
154
99.8k
        const auto s = rotate_amount[i][J];
155
156
99.8k
        const auto a = z[i][0];
157
99.8k
        const auto b = z[i][1];
158
99.8k
        const auto c = z[i][2];
159
99.8k
        const auto d = z[i][3];
160
99.8k
        const auto e = z[i][4];
161
162
99.8k
        z[i][0] = e;
163
99.8k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
99.8k
        z[i][2] = b;
165
99.8k
        z[i][3] = std::rotl(c, 10);
166
99.8k
        z[i][4] = d;
167
99.8k
    }
168
49.9k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<0ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<1ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<2ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<3ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<4ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<5ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<6ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<7ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<8ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<9ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<10ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<11ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<12ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<13ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<14ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<15ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<16ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<17ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<18ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<19ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<20ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<21ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<22ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<23ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<24ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<25ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<26ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<27ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<28ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<29ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<30ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<31ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<32ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<33ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<34ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<35ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<36ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<37ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<38ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<39ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<40ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<41ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<42ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<43ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<44ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<45ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<46ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<47ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<48ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<49ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<50ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<51ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<52ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<53ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<54ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<55ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<56ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<57ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<58ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<59ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<60ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<61ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<62ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<63ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<64ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<65ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<66ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<67ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<68ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<69ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<70ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<71ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<72ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<73ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<74ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<75ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<76ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<77ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<78ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<79ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
624
{
146
624
    static constexpr auto I = J / B;  // round index
147
624
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.87k
    for (size_t i = 0; i < L; 
++i1.24k
)
150
1.24k
    {
151
1.24k
        const auto f = fs[i];
152
1.24k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
1.24k
        const auto k = constants[i][I];
154
1.24k
        const auto s = rotate_amount[i][J];
155
156
1.24k
        const auto a = z[i][0];
157
1.24k
        const auto b = z[i][1];
158
1.24k
        const auto c = z[i][2];
159
1.24k
        const auto d = z[i][3];
160
1.24k
        const auto e = z[i][4];
161
162
1.24k
        z[i][0] = e;
163
1.24k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
1.24k
        z[i][2] = b;
165
1.24k
        z[i][3] = std::rotl(c, 10);
166
1.24k
        z[i][4] = d;
167
1.24k
    }
168
624
}
169
170
171
// TODO(C++23): This could be a lambda, but [[always_inline]] does not work.
172
// TODO: Try arguments instead of capture.
173
template <std::size_t... J>
174
[[gnu::always_inline]] inline void steps(
175
    State z[L], const std::byte* block, std::integer_sequence<std::size_t, J...>) noexcept
176
624
{
177
624
    (step<J>(z, block), ...);
178
624
}
179
180
void compress(State& h, const std::byte* block) noexcept
181
624
{
182
624
    State z[L]{h, h};
183
624
    steps(z, block, std::make_index_sequence<N>{});
184
185
624
    State t;
186
3.74k
    for (size_t i = 0, M = t.size(); i < M; 
++i3.12k
)
187
3.12k
        t[i] = h[(i + 1) % M] + z[0][(i + 2) % M] + z[1][(i + 3) % M];
188
624
    h = t;
189
624
}
190
}  // namespace
191
192
void ripemd160(std::byte hash[RIPEMD160_HASH_SIZE], const std::byte* data, size_t size) noexcept
193
568
{
194
568
    static constexpr size_t BLOCK_SIZE = B * sizeof(uint32_t);
195
568
    State h{0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0};
196
197
568
    const auto tail_size = size % BLOCK_SIZE;
198
624
    for (const auto tail_begin = &data[size - tail_size]; data != tail_begin; 
data += BLOCK_SIZE56
)
199
56
        compress(h, data);
200
201
568
    {
202
568
        std::array<std::byte, BLOCK_SIZE> padding_block{};
203
568
        const auto padded_tail_end = std::copy_n(data, tail_size, padding_block.data());
204
568
        *padded_tail_end = std::byte{0x80};  // The padding bit placed just after the input bytes.
205
206
        // Store the input length in bits in the last two words of the padded block.
207
568
        const auto length_in_bits = uint64_t{size} * 8;
208
568
        const auto length_begin = &padding_block[BLOCK_SIZE - sizeof(length_in_bits)];
209
568
        if (padded_tail_end >= length_begin)  // If not enough space, create one more block.
210
0
        {
211
0
            compress(h, padding_block.data());
212
0
            padding_block = {};
213
0
        }
214
568
        store_le(length_begin, length_in_bits);
215
568
        compress(h, padding_block.data());
216
568
    }
217
218
568
    for (const auto e : h)
219
2.84k
        hash = store_le(hash, e);
220
568
}
221
}  // namespace evmone::crypto
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/secp256k1.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/secp256k1.cpp.html new file mode 100644 index 0000000000..27c4591236 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/secp256k1.cpp.html @@ -0,0 +1,23 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/secp256k1.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#include "secp256k1.hpp"
5
#include "keccak.hpp"
6
7
namespace evmmax::secp256k1
8
{
9
namespace
10
{
11
constexpr auto B = Curve::Fp.to_mont(7);
12
13
constexpr AffinePoint G{0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798_u256,
14
    0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8_u256};
15
}  // namespace
16
17
// FIXME: Change to "uncompress_point".
18
std::optional<uint256> calculate_y(
19
    const ModArith<uint256>& m, const uint256& x, bool y_parity) noexcept
20
730
{
21
    // Calculate sqrt(x^3 + 7)
22
730
    const auto x3 = m.mul(m.mul(x, x), x);
23
730
    const auto y = field_sqrt(m, m.add(x3, B));
24
730
    if (!y.has_value())
25
48
        return std::nullopt;
26
27
    // Negate if different parity requested
28
682
    const auto candidate_parity = (m.from_mont(*y) & 1) != 0;
29
682
    return (candidate_parity == y_parity) ? 
*y256
:
m.sub(0, *y)426
;
30
730
}
31
32
AffinePoint mul(const AffinePoint& p, const uint256& c) noexcept
33
0
{
34
0
    const auto r = ecc::mul(p, c);
35
0
    return ecc::to_affine<Curve>(r);
36
0
}
37
38
evmc::address to_address(const AffinePoint& pt) noexcept
39
676
{
40
    // This performs Ethereum's address hashing on an uncompressed pubkey.
41
676
    uint8_t serialized[64];
42
676
    pt.to_bytes(serialized);
43
44
676
    const auto hashed = ethash::keccak256(serialized, sizeof(serialized));
45
676
    evmc::address ret{};
46
676
    std::memcpy(ret.bytes, hashed.bytes + 12, 20);
47
48
676
    return ret;
49
676
}
50
51
std::optional<AffinePoint> secp256k1_ecdsa_recover(
52
    const ethash::hash256& e, const uint256& r, const uint256& s, bool v) noexcept
53
952
{
54
    // Follows
55
    // https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Public_key_recovery
56
57
    // 1. Validate r and s are within [1, n-1].
58
952
    if (r == 0 || 
r >= Curve::ORDER946
||
s == 0934
||
s >= Curve::ORDER742
)
  MC/DC Decision Region (58:9) to (58:67)
+
+  Number of Conditions: 4
+     Condition C1 --> (58:9)
+     Condition C2 --> (58:19)
+     Condition C3 --> (58:40)
+     Condition C4 --> (58:50)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3, C4    Result
+  1 { F,  F,  F,  F  = F      }
+  2 { F,  F,  F,  T  = T      }
+  3 { F,  F,  T,  -  = T      }
+  4 { F,  T,  -,  -  = T      }
+  5 { T,  -,  -,  -  = T      }
+
+  C1-Pair: covered: (1,5)
+  C2-Pair: covered: (1,4)
+  C3-Pair: covered: (1,3)
+  C4-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
59
222
        return std::nullopt;
60
61
    // 3. Hash of the message is already calculated in e.
62
    // 4. Convert hash e to z field element by doing z = e % n.
63
    //    https://www.rfc-editor.org/rfc/rfc6979#section-2.3.2
64
    //    We can do this by n - e because n > 2^255.
65
730
    static_assert(Curve::ORDER > 1_u256 << 255);
66
730
    auto z = intx::be::load<uint256>(e.bytes);
67
730
    if (z >= Curve::ORDER)
68
0
        z -= Curve::ORDER;
69
70
730
    const ModArith n{Curve::ORDER};
71
72
    // 5. Calculate u1 and u2.
73
730
    const auto r_n = n.to_mont(r);
74
730
    const auto r_inv = n.inv(r_n);
75
76
730
    const auto z_mont = n.to_mont(z);
77
730
    const auto z_neg = n.sub(0, z_mont);
78
730
    const auto u1_mont = n.mul(z_neg, r_inv);
79
730
    const auto u1 = n.from_mont(u1_mont);
80
81
730
    const auto s_mont = n.to_mont(s);
82
730
    const auto u2_mont = n.mul(s_mont, r_inv);
83
730
    const auto u2 = n.from_mont(u2_mont);
84
730
    assert(u2 != 0);  // Because s != 0 and r_inv != 0.
85
86
    // 2. Calculate y coordinate of R from r and v.
87
730
    static constexpr auto& Fp = Curve::Fp;
88
730
    const auto r_mont = Fp.to_mont(r);
89
730
    const auto y_mont = calculate_y(Fp, r_mont, v);
90
730
    if (!y_mont.has_value())
91
48
        return std::nullopt;
92
93
    // 6. Calculate public key point Q.
94
682
    const auto R = AffinePoint{AffinePoint::FE::wrap(r_mont), AffinePoint::FE::wrap(*y_mont)};
95
682
    const auto T1 = ecc::mul(G, u1);
96
682
    const auto T2 = ecc::mul(R, u2);
97
682
    assert(T2 != 0);  // Because u2 != 0 and R != 0.
98
682
    const auto pQ = ecc::add(T1, T2);
99
100
682
    const auto Q = ecc::to_affine<Curve>(pQ);
101
102
682
    if (Q == 0)
103
6
        return std::nullopt;
104
105
676
    return Q;
106
682
}
107
108
std::optional<evmc::address> ecrecover(
109
    const ethash::hash256& e, const uint256& r, const uint256& s, bool v) noexcept
110
952
{
111
952
    const auto point = secp256k1_ecdsa_recover(e, r, s, v);
112
952
    if (!point.has_value())
113
276
        return std::nullopt;
114
115
676
    return to_address(*point);
116
952
}
117
118
std::optional<uint256> field_sqrt(const ModArith<uint256>& m, const uint256& x) noexcept
119
730
{
120
    // Computes modular exponentiation
121
    // x^0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff0c
122
    // Operations: 253 squares 13 multiplies
123
    // Main part generated by github.com/mmcloughlin/addchain v0.4.0.
124
    //   addchain search 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff0c
125
    //     > secp256k1_sqrt.acc
126
    //   addchain gen -tmpl expmod.tmpl secp256k1_sqrt.acc
127
    //     > secp256k1_sqrt.cpp
128
    //
129
    // Exponentiation computation is derived from the addition chain:
130
    //
131
    // _10      = 2*1
132
    // _11      = 1 + _10
133
    // _1100    = _11 << 2
134
    // _1111    = _11 + _1100
135
    // _11110   = 2*_1111
136
    // _11111   = 1 + _11110
137
    // _1111100 = _11111 << 2
138
    // _1111111 = _11 + _1111100
139
    // x11      = _1111111 << 4 + _1111
140
    // x22      = x11 << 11 + x11
141
    // x27      = x22 << 5 + _11111
142
    // x54      = x27 << 27 + x27
143
    // x108     = x54 << 54 + x54
144
    // x216     = x108 << 108 + x108
145
    // x223     = x216 << 7 + _1111111
146
    // return     ((x223 << 23 + x22) << 6 + _11) << 2
147
148
    // Allocate Temporaries.
149
730
    uint256 z;
150
730
    uint256 t0;
151
730
    uint256 t1;
152
730
    uint256 t2;
153
730
    uint256 t3;
154
155
156
    // Step 1: z = x^0x2
157
730
    z = m.mul(x, x);
158
159
    // Step 2: z = x^0x3
160
730
    z = m.mul(x, z);
161
162
    // Step 4: t0 = x^0xc
163
730
    t0 = m.mul(z, z);
164
1.46k
    for (int i = 1; i < 2; 
++i730
)
165
730
        t0 = m.mul(t0, t0);
166
167
    // Step 5: t0 = x^0xf
168
730
    t0 = m.mul(z, t0);
169
170
    // Step 6: t1 = x^0x1e
171
730
    t1 = m.mul(t0, t0);
172
173
    // Step 7: t2 = x^0x1f
174
730
    t2 = m.mul(x, t1);
175
176
    // Step 9: t1 = x^0x7c
177
730
    t1 = m.mul(t2, t2);
178
1.46k
    for (int i = 1; i < 2; 
++i730
)
179
730
        t1 = m.mul(t1, t1);
180
181
    // Step 10: t1 = x^0x7f
182
730
    t1 = m.mul(z, t1);
183
184
    // Step 14: t3 = x^0x7f0
185
730
    t3 = m.mul(t1, t1);
186
2.92k
    for (int i = 1; i < 4; 
++i2.19k
)
187
2.19k
        t3 = m.mul(t3, t3);
188
189
    // Step 15: t0 = x^0x7ff
190
730
    t0 = m.mul(t0, t3);
191
192
    // Step 26: t3 = x^0x3ff800
193
730
    t3 = m.mul(t0, t0);
194
8.03k
    for (int i = 1; i < 11; 
++i7.30k
)
195
7.30k
        t3 = m.mul(t3, t3);
196
197
    // Step 27: t0 = x^0x3fffff
198
730
    t0 = m.mul(t0, t3);
199
200
    // Step 32: t3 = x^0x7ffffe0
201
730
    t3 = m.mul(t0, t0);
202
3.65k
    for (int i = 1; i < 5; 
++i2.92k
)
203
2.92k
        t3 = m.mul(t3, t3);
204
205
    // Step 33: t2 = x^0x7ffffff
206
730
    t2 = m.mul(t2, t3);
207
208
    // Step 60: t3 = x^0x3ffffff8000000
209
730
    t3 = m.mul(t2, t2);
210
19.7k
    for (int i = 1; i < 27; 
++i18.9k
)
211
18.9k
        t3 = m.mul(t3, t3);
212
213
    // Step 61: t2 = x^0x3fffffffffffff
214
730
    t2 = m.mul(t2, t3);
215
216
    // Step 115: t3 = x^0xfffffffffffffc0000000000000
217
730
    t3 = m.mul(t2, t2);
218
39.4k
    for (int i = 1; i < 54; 
++i38.6k
)
219
38.6k
        t3 = m.mul(t3, t3);
220
221
    // Step 116: t2 = x^0xfffffffffffffffffffffffffff
222
730
    t2 = m.mul(t2, t3);
223
224
    // Step 224: t3 = x^0xfffffffffffffffffffffffffff000000000000000000000000000
225
730
    t3 = m.mul(t2, t2);
226
78.8k
    for (int i = 1; i < 108; 
++i78.1k
)
227
78.1k
        t3 = m.mul(t3, t3);
228
229
    // Step 225: t2 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffffffff
230
730
    t2 = m.mul(t2, t3);
231
232
    // Step 232: t2 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffffffff80
233
5.84k
    for (int i = 0; i < 7; 
++i5.11k
)
234
5.11k
        t2 = m.mul(t2, t2);
235
236
    // Step 233: t1 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffff
237
730
    t1 = m.mul(t1, t2);
238
239
    // Step 256: t1 = x^0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffff800000
240
17.5k
    for (int i = 0; i < 23; 
++i16.7k
)
241
16.7k
        t1 = m.mul(t1, t1);
242
243
    // Step 257: t0 = x^0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff
244
730
    t0 = m.mul(t0, t1);
245
246
    // Step 263: t0 = x^0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc0
247
5.11k
    for (int i = 0; i < 6; 
++i4.38k
)
248
4.38k
        t0 = m.mul(t0, t0);
249
250
    // Step 264: z = x^0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc3
251
730
    z = m.mul(z, t0);
252
253
    // Step 266: z = x^0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff0c
254
2.19k
    for (int i = 0; i < 2; 
++i1.46k
)
255
1.46k
        z = m.mul(z, z);
256
257
730
    if (m.mul(z, z) != x)
258
48
        return std::nullopt;  // Computed value is not the square root.
259
260
682
    return z;
261
730
}
262
}  // namespace evmmax::secp256k1
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/secp256r1.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/secp256r1.cpp.html new file mode 100644 index 0000000000..9fcf8301c7 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/secp256r1.cpp.html @@ -0,0 +1,39 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/secp256r1.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2025 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#include "secp256r1.hpp"
5
6
namespace evmmax::secp256r1
7
{
8
namespace
9
{
10
bool is_on_curve(const AffinePoint& p) noexcept
11
572
{
12
572
    static constexpr AffinePoint::FE A{Curve::A};
13
572
    static constexpr AffinePoint::FE B{Curve::B};
14
572
    return p.y * p.y == p.x * p.x * p.x + A * p.x + B;
15
572
}
16
}  // namespace
17
18
bool verify(const ethash::hash256& h, const uint256& r, const uint256& s, const uint256& qx,
19
    const uint256& qy) noexcept
20
710
{
21
    // The implementation follows "Elliptic Curve Digital Signature Algorithm"
22
    // https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Signature_verification_algorithm
23
    // but EIP-7951 spec is also a good source:
24
    // https://eips.ethereum.org/EIPS/eip-7951#signature-verification-algorithm
25
26
    // 1. Validate r and s are within [1, n-1].
27
710
    if (r == 0 || 
r >= Curve::ORDER686
||
s == 0616
||
s >= Curve::ORDER606
)
  MC/DC Decision Region (27:9) to (27:67)
+
+  Number of Conditions: 4
+     Condition C1 --> (27:9)
+     Condition C2 --> (27:19)
+     Condition C3 --> (27:40)
+     Condition C4 --> (27:50)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3, C4    Result
+  1 { F,  F,  F,  F  = F      }
+  2 { F,  F,  F,  T  = T      }
+  3 { F,  F,  T,  -  = T      }
+  4 { F,  T,  -,  -  = T      }
+  5 { T,  -,  -,  -  = T      }
+
+  C1-Pair: covered: (1,5)
+  C2-Pair: covered: (1,4)
+  C3-Pair: covered: (1,3)
+  C4-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
28
126
        return false;
29
30
    // Check that Q is not equal to the identity element O, and its coordinates are otherwise valid.
31
584
    if (qx >= Curve::FIELD_PRIME || 
qy >= Curve::FIELD_PRIME580
)
  MC/DC Decision Region (31:9) to (31:61)
+
+  Number of Conditions: 2
+     Condition C1 --> (31:9)
+     Condition C2 --> (31:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
32
8
        return false;
33
576
    const AffinePoint Q{AffinePoint::FE{qx}, AffinePoint::FE{qy}};
34
576
    if (Q == 0)
35
4
        return false;
36
37
    // Check that Q lies on the curve.
38
572
    if (!is_on_curve(Q))
39
50
        return false;
40
41
522
    const ModArith n{Curve::ORDER};
42
43
    // 3. Let z be the Lₙ leftmost bits of e = HASH(m).
44
522
    static_assert(Curve::ORDER > 1_u256 << 255);
45
522
    const auto z = intx::be::load<uint256>(h.bytes);
46
47
    // 4. Calculate u₁ = zs⁻¹ mod n and u₂ = rs⁻¹ mod n.
48
522
    const auto s_inv = n.inv(n.to_mont(s));
49
522
    const auto u1 = n.from_mont(n.mul(n.to_mont(z), s_inv));
50
522
    const auto u2 = n.from_mont(n.mul(n.to_mont(r), s_inv));
51
52
    // 5. Calculate the curve point R = (x₁, y₁) = u₁×G + u₂×Q.
53
522
    const auto T1 = ecc::mul(G, u1);
54
522
    const auto T2 = ecc::mul(Q, u2);
55
522
    const auto jR = ecc::add(T1, T2);
56
522
    const auto R = ecc::to_affine(jR);
57
58
    //    If R is at infinity, the signature is invalid.
59
    //    In this case x₁ is 0 and cannot be equal to r.
60
    // 6. The signature is valid if r ≡ x₁ (mod n).
61
522
    auto x1 = R.x.value();
62
522
    if (x1 >= Curve::ORDER)
63
6
        x1 -= Curve::ORDER;
64
65
522
    return x1 == r;
66
572
}
67
}  // namespace evmmax::secp256r1
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/sha256.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/sha256.cpp.html new file mode 100644 index 0000000000..3cd0c40cbf --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/lib/evmone_precompiles/sha256.cpp.html @@ -0,0 +1,29 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/lib/evmone_precompiles/sha256.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The Silkworm & evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
/// @file
6
/// SHA256 implementation.
7
/// Initial version copied from the Silkworm project (https://github.com/erigontech/silkworm).
8
/// Based on several bits of code released to public domain:
9
/// https://github.com/amosnier/sha-2 (Author: Alain Mosnier)
10
/// https://github.com/noloader/SHA-Intrinsics (Author: Jeffrey Walton)
11
/// https://github.com/Mysticial/FeatureDetector (Author: Alexander Yee)
12
13
#include "sha256.hpp"
14
#include <bit>
15
#include <cstdint>
16
#include <cstring>
17
18
#if defined(__x86_64__)
19
20
#include <cpuid.h>
21
#include <x86intrin.h>
22
23
#elif defined(__aarch64__) && defined(__APPLE__)
24
25
#include <arm_neon.h>
26
27
#if defined(__linux__)
28
#include <asm/hwcap.h>
29
#include <sys/auxv.h>
30
#elif defined(__APPLE__)
31
#include <sys/sysctl.h>
32
#endif  // defined(__linux__), defined(__APPLE__)
33
34
#endif  // defined(__x86_64__), defined(__aarch64__)
35
36
namespace evmone::crypto
37
{
38
39
233k
#define CHUNK_SIZE 64
40
131k
#define TOTAL_LEN_LEN 8
41
42
/*
43
 * Comments from pseudo-code at https://en.wikipedia.org/wiki/SHA-2 are reproduced here.
44
 * When useful for clarification, portions of the pseudo-code are reproduced here too.
45
 */
46
47
/*
48
 * Initialize array of round constants:
49
 * (first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311):
50
 */
51
static const uint32_t k[] = {0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
52
    0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe,
53
    0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa,
54
    0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
55
    0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb,
56
    0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624,
57
    0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
58
    0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb,
59
    0xbef9a3f7, 0xc67178f2};
60
61
struct BufferState
62
{
63
    const std::byte* p;
64
    size_t len;
65
    size_t total_len;
66
    bool single_one_delivered = false;
67
    bool total_len_delivered = false;
68
69
    constexpr BufferState(const std::byte* input, size_t size)
70
65.5k
      : p{input}, len{size}, total_len{size}
71
65.5k
    {}
72
};
73
74
static bool calc_chunk(uint8_t chunk[CHUNK_SIZE], struct BufferState* state)
75
156k
{
76
156k
    if (state->total_len_delivered)
77
65.5k
    {
78
65.5k
        return false;
79
65.5k
    }
80
81
91.1k
    if (state->len >= CHUNK_SIZE)
82
25.6k
    {
83
25.6k
        memcpy(chunk, state->p, CHUNK_SIZE);
84
25.6k
        state->p += CHUNK_SIZE;
85
25.6k
        state->len -= CHUNK_SIZE;
86
25.6k
        return true;
87
25.6k
    }
88
89
65.5k
    size_t space_in_chunk = CHUNK_SIZE - state->len;
90
65.5k
    if (state->len != 0)
91
3.70k
    {  // avoid adding 0 to nullptr
92
3.70k
        memcpy(chunk, state->p, state->len);
93
3.70k
        chunk += state->len;
94
3.70k
        state->p += state->len;
95
3.70k
    }
96
65.5k
    state->len = 0;
97
98
    /* If we are here, space_in_chunk is one at minimum. */
99
65.5k
    if (!state->single_one_delivered)
100
65.5k
    {
101
65.5k
        *chunk++ = 0x80;
102
65.5k
        space_in_chunk -= 1;
103
65.5k
        state->single_one_delivered = true;
104
65.5k
    }
105
106
    /*
107
     * Now:
108
     * - either there is enough space left for the total length, and we can conclude,
109
     * - or there is too little space left, and we have to pad the rest of this chunk with zeroes.
110
     * In the latter case, we will conclude at the next invocation of this function.
111
     */
112
65.5k
    if (space_in_chunk >= TOTAL_LEN_LEN)
113
65.5k
    {
114
65.5k
        const size_t left = space_in_chunk - TOTAL_LEN_LEN;
115
65.5k
        size_t len = state->total_len;
116
65.5k
        int i = 0;
117
65.5k
        memset(chunk, 0x00, left);
118
65.5k
        chunk += left;
119
120
        /* Storing of len * 8 as a big endian 64-bit without overflow. */
121
65.5k
        chunk[7] = (uint8_t)(len << 3);
122
65.5k
        len >>= 5;
123
524k
        for (i = 6; i >= 0; 
i--458k
)
124
458k
        {
125
458k
            chunk[i] = (uint8_t)len;
126
458k
            len >>= 8;
127
458k
        }
128
65.5k
        state->total_len_delivered = true;
129
65.5k
    }
130
6
    else
131
6
    {
132
6
        memset(chunk, 0x00, space_in_chunk);
133
6
    }
134
135
65.5k
    return true;
136
91.1k
}
137
138
[[gnu::always_inline, msvc::forceinline]] static void sha_256_implementation(
139
    uint32_t h[8], const std::byte* input, size_t len)
140
65.5k
{
141
    /*
142
     * Note 1: All integers (expect indexes) are 32-bit unsigned integers and addition is calculated
143
     * modulo 2^32.
144
     *
145
     * Note 2: For each round, there is one round constant k[i] and one entry in the message
146
     * schedule array w[i], 0 = i = 63
147
     *
148
     * Note 3: The compression function uses 8 working variables, a through h
149
     *
150
     * Note 4: Big-endian convention is used when expressing the constants in this pseudocode,
151
     *     and when parsing message block data from bytes to words, for example,
152
     *     the first word of the input message "abc" after padding is 0x61626380
153
     */
154
155
65.5k
    BufferState state{input, len};
156
157
    /* 512-bit chunks is what we will operate on. */
158
65.5k
    uint8_t chunk[CHUNK_SIZE];
159
160
156k
    while (calc_chunk(chunk, &state))
161
91.1k
    {
162
91.1k
        unsigned i = 0;
163
91.1k
        unsigned j = 0;
164
165
91.1k
        uint32_t ah[8];
166
        /* Initialize working variables to current hash value: */
167
820k
        for (i = 0; i < 8; 
i++729k
)
168
729k
        {
169
729k
            ah[i] = h[i];
170
729k
        }
171
172
91.1k
        const uint8_t* p = chunk;
173
174
        /*
175
         * The w-array is really w[64], but since we only need 16 of them at a time, we save stack
176
         * by calculating 16 at a time.
177
         *
178
         * This optimization was not there initially and the rest of the comments about w[64] are
179
         * kept in their initial state.
180
         */
181
182
        /*
183
         * create a 64-entry message schedule array w[0..63] of 32-bit words (The initial values in
184
         * w[0..63] don't matter, so many implementations zero them here) copy chunk into first 16
185
         * words w[0..15] of the message schedule array
186
         */
187
91.1k
        uint32_t w[16];
188
189
        /* Compression function main loop: */
190
455k
        for (i = 0; i < 4; 
i++364k
)
191
364k
        {
192
6.20M
            for (j = 0; j < 16; 
j++5.83M
)
193
5.83M
            {
194
5.83M
                if (i == 0)
195
1.45M
                {
196
1.45M
                    w[j] = (uint32_t)p[0] << 24 | (uint32_t)p[1] << 16 | (uint32_t)p[2] << 8 |
197
1.45M
                           (uint32_t)p[3];
198
1.45M
                    p += 4;
199
1.45M
                }
200
4.37M
                else
201
4.37M
                {
202
                    /* Extend the first 16 words into the remaining 48 words w[16..63] of the
203
                     * message schedule array: */
204
4.37M
                    const uint32_t s0 = std::rotr(w[(j + 1) & 0xf], 7) ^
205
4.37M
                                        std::rotr(w[(j + 1) & 0xf], 18) ^ (w[(j + 1) & 0xf] >> 3);
206
4.37M
                    const uint32_t s1 = std::rotr(w[(j + 14) & 0xf], 17) ^
207
4.37M
                                        std::rotr(w[(j + 14) & 0xf], 19) ^
208
4.37M
                                        (w[(j + 14) & 0xf] >> 10);
209
4.37M
                    w[j] = w[j] + s0 + w[(j + 9) & 0xf] + s1;
210
4.37M
                }
211
5.83M
                const uint32_t s1 =
212
5.83M
                    std::rotr(ah[4], 6) ^ std::rotr(ah[4], 11) ^ std::rotr(ah[4], 25);
213
5.83M
                const uint32_t ch = (ah[4] & ah[5]) ^ (~ah[4] & ah[6]);
214
5.83M
                const uint32_t temp1 = ah[7] + s1 + ch + k[i << 4 | j] + w[j];
215
5.83M
                const uint32_t s0 =
216
5.83M
                    std::rotr(ah[0], 2) ^ std::rotr(ah[0], 13) ^ std::rotr(ah[0], 22);
217
5.83M
                const uint32_t maj = (ah[0] & ah[1]) ^ (ah[0] & ah[2]) ^ (ah[1] & ah[2]);
218
5.83M
                const uint32_t temp2 = s0 + maj;
219
220
5.83M
                ah[7] = ah[6];
221
5.83M
                ah[6] = ah[5];
222
5.83M
                ah[5] = ah[4];
223
5.83M
                ah[4] = ah[3] + temp1;
224
5.83M
                ah[3] = ah[2];
225
5.83M
                ah[2] = ah[1];
226
5.83M
                ah[1] = ah[0];
227
5.83M
                ah[0] = temp1 + temp2;
228
5.83M
            }
229
364k
        }
230
231
        /* Add the compressed chunk to the current hash value: */
232
820k
        for (i = 0; i < 8; 
i++729k
)
233
729k
        {
234
729k
            h[i] += ah[i];
235
729k
        }
236
91.1k
    }
237
65.5k
}
238
239
static void sha_256_generic(uint32_t h[8], const std::byte* input, size_t len)
240
0
{
241
0
    sha_256_implementation(h, input, len);
242
0
}
243
244
static void (*sha_256_best)(uint32_t h[8], const std::byte* input, size_t len) = sha_256_generic;
245
246
#if defined(__x86_64__)
247
248
__attribute__((target("bmi,bmi2"))) static void sha_256_x86_bmi(
249
    uint32_t h[8], const std::byte* input, size_t len)
250
65.5k
{
251
65.5k
    sha_256_implementation(h, input, len);
252
65.5k
}
253
254
[[gnu::always_inline]] static __m128i set(uint64_t a, uint64_t b) noexcept
255
0
{
256
    // NOLINTNEXTLINE(*-runtime-int)
257
0
    return _mm_set_epi64x(static_cast<long long>(a), static_cast<long long>(b));
258
0
}
259
260
// The following function was adapted from
261
// https://github.com/noloader/SHA-Intrinsics/blob/master/sha256-x86.c
262
/*   Intel SHA extensions using C intrinsics               */
263
/*   Written and place in public domain by Jeffrey Walton  */
264
/*   Based on code from Intel, and by Sean Gulley for      */
265
/*   the miTLS project.                                    */
266
__attribute__((target("sha,sse4.1"))) static void sha_256_x86_sha(
267
    uint32_t h[8], const std::byte* input, size_t len)
268
0
{
269
    // NOLINTBEGIN(readability-isolate-declaration)
270
0
    __m128i STATE0, STATE1;
271
0
    __m128i MSG, TMP;
272
0
    __m128i MSG0, MSG1, MSG2, MSG3;
273
0
    __m128i ABEF_SAVE, CDGH_SAVE;
274
    // NOLINTEND(readability-isolate-declaration)
275
276
0
    const __m128i MASK = set(0x0c0d0e0f08090a0b, 0x0405060700010203);
277
278
    // NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast)
279
    // NOLINTBEGIN(portability-simd-intrinsics)
280
    /* Load initial values */
281
0
    TMP = _mm_loadu_si128((const __m128i*)&h[0]);
282
0
    STATE1 = _mm_loadu_si128((const __m128i*)&h[4]);
283
284
0
    TMP = _mm_shuffle_epi32(TMP, 0xB1);          /* CDAB */
285
0
    STATE1 = _mm_shuffle_epi32(STATE1, 0x1B);    /* EFGH */
286
0
    STATE0 = _mm_alignr_epi8(TMP, STATE1, 8);    /* ABEF */
287
0
    STATE1 = _mm_blend_epi16(STATE1, TMP, 0xF0); /* CDGH */
288
289
0
    BufferState state{input, len};
290
291
    /* 512-bit chunks is what we will operate on. */
292
0
    uint8_t chunk[CHUNK_SIZE];
293
294
0
    while (calc_chunk(chunk, &state))
295
0
    {
296
        /* Save current state */
297
0
        ABEF_SAVE = STATE0;
298
0
        CDGH_SAVE = STATE1;
299
300
        /* Rounds 0-3 */
301
0
        MSG = _mm_loadu_si128((const __m128i*)(chunk + 0));
302
0
        MSG0 = _mm_shuffle_epi8(MSG, MASK);
303
0
        MSG = _mm_add_epi32(MSG0, set(0xE9B5DBA5B5C0FBCF, 0x71374491428A2F98));
304
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
305
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
306
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
307
308
        /* Rounds 4-7 */
309
0
        MSG1 = _mm_loadu_si128((const __m128i*)(chunk + 16));
310
0
        MSG1 = _mm_shuffle_epi8(MSG1, MASK);
311
0
        MSG = _mm_add_epi32(MSG1, set(0xAB1C5ED5923F82A4, 0x59F111F13956C25B));
312
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
313
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
314
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
315
0
        MSG0 = _mm_sha256msg1_epu32(MSG0, MSG1);
316
317
        /* Rounds 8-11 */
318
0
        MSG2 = _mm_loadu_si128((const __m128i*)(chunk + 32));
319
0
        MSG2 = _mm_shuffle_epi8(MSG2, MASK);
320
0
        MSG = _mm_add_epi32(MSG2, set(0x550C7DC3243185BE, 0x12835B01D807AA98));
321
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
322
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
323
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
324
0
        MSG1 = _mm_sha256msg1_epu32(MSG1, MSG2);
325
326
        /* Rounds 12-15 */
327
0
        MSG3 = _mm_loadu_si128((const __m128i*)(chunk + 48));
328
0
        MSG3 = _mm_shuffle_epi8(MSG3, MASK);
329
0
        MSG = _mm_add_epi32(MSG3, set(0xC19BF1749BDC06A7, 0x80DEB1FE72BE5D74));
330
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
331
0
        TMP = _mm_alignr_epi8(MSG3, MSG2, 4);
332
0
        MSG0 = _mm_add_epi32(MSG0, TMP);
333
0
        MSG0 = _mm_sha256msg2_epu32(MSG0, MSG3);
334
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
335
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
336
0
        MSG2 = _mm_sha256msg1_epu32(MSG2, MSG3);
337
338
        /* Rounds 16-19 */
339
0
        MSG = _mm_add_epi32(MSG0, set(0x240CA1CC0FC19DC6, 0xEFBE4786E49B69C1));
340
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
341
0
        TMP = _mm_alignr_epi8(MSG0, MSG3, 4);
342
0
        MSG1 = _mm_add_epi32(MSG1, TMP);
343
0
        MSG1 = _mm_sha256msg2_epu32(MSG1, MSG0);
344
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
345
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
346
0
        MSG3 = _mm_sha256msg1_epu32(MSG3, MSG0);
347
348
        /* Rounds 20-23 */
349
0
        MSG = _mm_add_epi32(MSG1, set(0x76F988DA5CB0A9DC, 0x4A7484AA2DE92C6F));
350
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
351
0
        TMP = _mm_alignr_epi8(MSG1, MSG0, 4);
352
0
        MSG2 = _mm_add_epi32(MSG2, TMP);
353
0
        MSG2 = _mm_sha256msg2_epu32(MSG2, MSG1);
354
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
355
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
356
0
        MSG0 = _mm_sha256msg1_epu32(MSG0, MSG1);
357
358
        /* Rounds 24-27 */
359
0
        MSG = _mm_add_epi32(MSG2, set(0xBF597FC7B00327C8, 0xA831C66D983E5152));
360
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
361
0
        TMP = _mm_alignr_epi8(MSG2, MSG1, 4);
362
0
        MSG3 = _mm_add_epi32(MSG3, TMP);
363
0
        MSG3 = _mm_sha256msg2_epu32(MSG3, MSG2);
364
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
365
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
366
0
        MSG1 = _mm_sha256msg1_epu32(MSG1, MSG2);
367
368
        /* Rounds 28-31 */
369
0
        MSG = _mm_add_epi32(MSG3, set(0x1429296706CA6351, 0xD5A79147C6E00BF3));
370
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
371
0
        TMP = _mm_alignr_epi8(MSG3, MSG2, 4);
372
0
        MSG0 = _mm_add_epi32(MSG0, TMP);
373
0
        MSG0 = _mm_sha256msg2_epu32(MSG0, MSG3);
374
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
375
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
376
0
        MSG2 = _mm_sha256msg1_epu32(MSG2, MSG3);
377
378
        /* Rounds 32-35 */
379
0
        MSG = _mm_add_epi32(MSG0, set(0x53380D134D2C6DFC, 0x2E1B213827B70A85));
380
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
381
0
        TMP = _mm_alignr_epi8(MSG0, MSG3, 4);
382
0
        MSG1 = _mm_add_epi32(MSG1, TMP);
383
0
        MSG1 = _mm_sha256msg2_epu32(MSG1, MSG0);
384
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
385
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
386
0
        MSG3 = _mm_sha256msg1_epu32(MSG3, MSG0);
387
388
        /* Rounds 36-39 */
389
0
        MSG = _mm_add_epi32(MSG1, set(0x92722C8581C2C92E, 0x766A0ABB650A7354));
390
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
391
0
        TMP = _mm_alignr_epi8(MSG1, MSG0, 4);
392
0
        MSG2 = _mm_add_epi32(MSG2, TMP);
393
0
        MSG2 = _mm_sha256msg2_epu32(MSG2, MSG1);
394
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
395
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
396
0
        MSG0 = _mm_sha256msg1_epu32(MSG0, MSG1);
397
398
        /* Rounds 40-43 */
399
0
        MSG = _mm_add_epi32(MSG2, set(0xC76C51A3C24B8B70, 0xA81A664BA2BFE8A1));
400
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
401
0
        TMP = _mm_alignr_epi8(MSG2, MSG1, 4);
402
0
        MSG3 = _mm_add_epi32(MSG3, TMP);
403
0
        MSG3 = _mm_sha256msg2_epu32(MSG3, MSG2);
404
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
405
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
406
0
        MSG1 = _mm_sha256msg1_epu32(MSG1, MSG2);
407
408
        /* Rounds 44-47 */
409
0
        MSG = _mm_add_epi32(MSG3, set(0x106AA070F40E3585, 0xD6990624D192E819));
410
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
411
0
        TMP = _mm_alignr_epi8(MSG3, MSG2, 4);
412
0
        MSG0 = _mm_add_epi32(MSG0, TMP);
413
0
        MSG0 = _mm_sha256msg2_epu32(MSG0, MSG3);
414
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
415
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
416
0
        MSG2 = _mm_sha256msg1_epu32(MSG2, MSG3);
417
418
        /* Rounds 48-51 */
419
0
        MSG = _mm_add_epi32(MSG0, set(0x34B0BCB52748774C, 0x1E376C0819A4C116));
420
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
421
0
        TMP = _mm_alignr_epi8(MSG0, MSG3, 4);
422
0
        MSG1 = _mm_add_epi32(MSG1, TMP);
423
0
        MSG1 = _mm_sha256msg2_epu32(MSG1, MSG0);
424
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
425
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
426
0
        MSG3 = _mm_sha256msg1_epu32(MSG3, MSG0);
427
428
        /* Rounds 52-55 */
429
0
        MSG = _mm_add_epi32(MSG1, set(0x682E6FF35B9CCA4F, 0x4ED8AA4A391C0CB3));
430
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
431
0
        TMP = _mm_alignr_epi8(MSG1, MSG0, 4);
432
0
        MSG2 = _mm_add_epi32(MSG2, TMP);
433
0
        MSG2 = _mm_sha256msg2_epu32(MSG2, MSG1);
434
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
435
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
436
437
        /* Rounds 56-59 */
438
0
        MSG = _mm_add_epi32(MSG2, set(0x8CC7020884C87814, 0x78A5636F748F82EE));
439
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
440
0
        TMP = _mm_alignr_epi8(MSG2, MSG1, 4);
441
0
        MSG3 = _mm_add_epi32(MSG3, TMP);
442
0
        MSG3 = _mm_sha256msg2_epu32(MSG3, MSG2);
443
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
444
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
445
446
        /* Rounds 60-63 */
447
0
        MSG = _mm_add_epi32(MSG3, set(0xC67178F2BEF9A3F7, 0xA4506CEB90BEFFFA));
448
0
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
449
0
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
450
0
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
451
452
        /* Combine state  */
453
0
        STATE0 = _mm_add_epi32(STATE0, ABEF_SAVE);
454
0
        STATE1 = _mm_add_epi32(STATE1, CDGH_SAVE);
455
0
    }
456
457
0
    TMP = _mm_shuffle_epi32(STATE0, 0x1B);       /* FEBA */
458
0
    STATE1 = _mm_shuffle_epi32(STATE1, 0xB1);    /* DCHG */
459
0
    STATE0 = _mm_blend_epi16(TMP, STATE1, 0xF0); /* DCBA */
460
0
    STATE1 = _mm_alignr_epi8(STATE1, TMP, 8);    /* ABEF */
461
462
    /* Save state */
463
0
    _mm_storeu_si128((__m128i*)&h[0], STATE0);
464
0
    _mm_storeu_si128((__m128i*)&h[4], STATE1);
465
    // NOLINTEND(portability-simd-intrinsics)
466
    // NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast)
467
0
}
468
469
// https://stackoverflow.com/questions/6121792/how-to-check-if-a-cpu-supports-the-sse3-instruction-set
470
static void cpuid(int info[4], int InfoType)  // NOLINT(readability-non-const-parameter)
471
6
{
472
6
    __cpuid_count(InfoType, 0, info[0], info[1], info[2], info[3]);
473
6
}
474
475
__attribute__((constructor)) static void select_sha256_implementation()
476
2
{
477
2
    int info[4];
478
2
    cpuid(info, 0);
479
2
    const int nIds = info[0];
480
481
2
    bool hw_sse41 = false;
482
2
    bool hw_bmi1 = false;
483
2
    bool hw_bmi2 = false;
484
2
    bool hw_sha = false;
485
486
2
    if (nIds >= 0x00000001)
487
2
    {
488
2
        cpuid(info, 0x00000001);
489
2
        hw_sse41 = (info[2] & (1 << 19)) != 0;
490
2
    }
491
2
    if (nIds >= 0x00000007)
492
2
    {
493
2
        cpuid(info, 0x00000007);
494
2
        hw_bmi1 = (info[1] & (1 << 3)) != 0;
495
2
        hw_bmi2 = (info[1] & (1 << 8)) != 0;
496
2
        hw_sha = (info[1] & (1 << 29)) != 0;
497
2
    }
498
499
2
    if (hw_sse41 && hw_sha)
  MC/DC Decision Region (499:9) to (499:27)
+
+  Number of Conditions: 2
+     Condition C1 --> (499:9)
+     Condition C2 --> (499:21)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { T,  F  = F      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
500
0
    {
501
0
        sha_256_best = sha_256_x86_sha;
502
0
    }
503
2
    else if (hw_bmi1 && hw_bmi2)
  MC/DC Decision Region (503:14) to (503:32)
+
+  Number of Conditions: 2
+     Condition C1 --> (503:14)
+     Condition C2 --> (503:25)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { T,  T  = T      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
504
2
    {
505
2
        sha_256_best = sha_256_x86_bmi;
506
2
    }
507
2
}
508
509
#elif defined(__aarch64__) && defined(__APPLE__)
510
511
// The following function was adapted from
512
// https://github.com/noloader/SHA-Intrinsics/blob/master/sha256-arm.c
513
/* sha256-arm.c - ARMv8 SHA extensions using C intrinsics     */
514
/*   Written and placed in public domain by Jeffrey Walton    */
515
/*   Based on code from ARM, and by Johannes Schneiders, Skip */
516
/*   Hovsmith and Barry O'Rourke for the mbedTLS project.     */
517
static void sha_256_arm_v8(uint32_t h[8], const std::byte* input, size_t len)
518
{
519
    uint32x4_t STATE0, STATE1, ABEF_SAVE, CDGH_SAVE;
520
    uint32x4_t MSG0, MSG1, MSG2, MSG3;
521
    uint32x4_t TMP0, TMP1, TMP2;
522
523
    /* Load state */
524
    STATE0 = vld1q_u32(&h[0]);
525
    STATE1 = vld1q_u32(&h[4]);
526
527
    BufferState state{input, len};
528
529
    /* 512-bit chunks is what we will operate on. */
530
    uint8_t chunk[CHUNK_SIZE];
531
532
    while (calc_chunk(chunk, &state))
533
    {
534
        /* Save state */
535
        ABEF_SAVE = STATE0;
536
        CDGH_SAVE = STATE1;
537
538
        /* Load message */
539
        MSG0 = vld1q_u32((const uint32_t*)(chunk + 0));
540
        MSG1 = vld1q_u32((const uint32_t*)(chunk + 16));
541
        MSG2 = vld1q_u32((const uint32_t*)(chunk + 32));
542
        MSG3 = vld1q_u32((const uint32_t*)(chunk + 48));
543
544
        /* Reverse for little endian */
545
        MSG0 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG0)));
546
        MSG1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG1)));
547
        MSG2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG2)));
548
        MSG3 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG3)));
549
550
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&k[0x00]));
551
552
        /* Rounds 0-3 */
553
        MSG0 = vsha256su0q_u32(MSG0, MSG1);
554
        TMP2 = STATE0;
555
        TMP1 = vaddq_u32(MSG1, vld1q_u32(&k[0x04]));
556
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
557
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
558
        MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);
559
560
        /* Rounds 4-7 */
561
        MSG1 = vsha256su0q_u32(MSG1, MSG2);
562
        TMP2 = STATE0;
563
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&k[0x08]));
564
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
565
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
566
        MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);
567
568
        /* Rounds 8-11 */
569
        MSG2 = vsha256su0q_u32(MSG2, MSG3);
570
        TMP2 = STATE0;
571
        TMP1 = vaddq_u32(MSG3, vld1q_u32(&k[0x0c]));
572
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
573
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
574
        MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);
575
576
        /* Rounds 12-15 */
577
        MSG3 = vsha256su0q_u32(MSG3, MSG0);
578
        TMP2 = STATE0;
579
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&k[0x10]));
580
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
581
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
582
        MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);
583
584
        /* Rounds 16-19 */
585
        MSG0 = vsha256su0q_u32(MSG0, MSG1);
586
        TMP2 = STATE0;
587
        TMP1 = vaddq_u32(MSG1, vld1q_u32(&k[0x14]));
588
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
589
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
590
        MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);
591
592
        /* Rounds 20-23 */
593
        MSG1 = vsha256su0q_u32(MSG1, MSG2);
594
        TMP2 = STATE0;
595
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&k[0x18]));
596
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
597
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
598
        MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);
599
600
        /* Rounds 24-27 */
601
        MSG2 = vsha256su0q_u32(MSG2, MSG3);
602
        TMP2 = STATE0;
603
        TMP1 = vaddq_u32(MSG3, vld1q_u32(&k[0x1c]));
604
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
605
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
606
        MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);
607
608
        /* Rounds 28-31 */
609
        MSG3 = vsha256su0q_u32(MSG3, MSG0);
610
        TMP2 = STATE0;
611
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&k[0x20]));
612
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
613
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
614
        MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);
615
616
        /* Rounds 32-35 */
617
        MSG0 = vsha256su0q_u32(MSG0, MSG1);
618
        TMP2 = STATE0;
619
        TMP1 = vaddq_u32(MSG1, vld1q_u32(&k[0x24]));
620
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
621
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
622
        MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);
623
624
        /* Rounds 36-39 */
625
        MSG1 = vsha256su0q_u32(MSG1, MSG2);
626
        TMP2 = STATE0;
627
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&k[0x28]));
628
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
629
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
630
        MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);
631
632
        /* Rounds 40-43 */
633
        MSG2 = vsha256su0q_u32(MSG2, MSG3);
634
        TMP2 = STATE0;
635
        TMP1 = vaddq_u32(MSG3, vld1q_u32(&k[0x2c]));
636
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
637
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
638
        MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);
639
640
        /* Rounds 44-47 */
641
        MSG3 = vsha256su0q_u32(MSG3, MSG0);
642
        TMP2 = STATE0;
643
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&k[0x30]));
644
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
645
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
646
        MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);
647
648
        /* Rounds 48-51 */
649
        TMP2 = STATE0;
650
        TMP1 = vaddq_u32(MSG1, vld1q_u32(&k[0x34]));
651
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
652
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
653
654
        /* Rounds 52-55 */
655
        TMP2 = STATE0;
656
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&k[0x38]));
657
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
658
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
659
660
        /* Rounds 56-59 */
661
        TMP2 = STATE0;
662
        TMP1 = vaddq_u32(MSG3, vld1q_u32(&k[0x3c]));
663
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
664
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
665
666
        /* Rounds 60-63 */
667
        TMP2 = STATE0;
668
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
669
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
670
671
        /* Combine state */
672
        STATE0 = vaddq_u32(STATE0, ABEF_SAVE);
673
        STATE1 = vaddq_u32(STATE1, CDGH_SAVE);
674
    }
675
676
    /* Save state */
677
    vst1q_u32(&h[0], STATE0);
678
    vst1q_u32(&h[4], STATE1);
679
}
680
681
__attribute__((constructor)) static void select_sha256_implementation(void)
682
{
683
#if defined(__linux__)
684
    if ((getauxval(AT_HWCAP) & HWCAP_SHA2) != 0)
685
    {
686
        sha_256_best = sha_256_arm_v8;
687
    }
688
#elif defined(__APPLE__)
689
    int64_t hw_cap = 0;
690
    size_t size = sizeof(hw_cap);
691
692
    if (sysctlbyname("hw.optional.armv8_2_sha3", &hw_cap, &size, NULL, 0) == 0)
693
    {
694
        // Use SHA3 as proxy for SHA2 (sysctl hw doesn't list SHA2 for Apple M1)
695
        if (hw_cap == 1)
696
        {
697
            sha_256_best = sha_256_arm_v8;
698
        }
699
    }
700
#endif  // defined(__linux__), defined(__APPLE__)
701
}
702
703
#endif  // defined(__x86_64__), defined(__aarch64__)
704
705
/*
706
 * Limitations:
707
 * - Since input is a pointer in RAM, the data to hash should be in RAM, which could be a problem
708
 *   for large data sizes.
709
 * - SHA algorithms theoretically operate on bit strings. However, this implementation has no
710
 * support for bit string lengths that are not multiples of eight, and it really operates on arrays
711
 * of bytes. In particular, the len parameter is a number of bytes.
712
 */
713
void sha256(std::byte hash[SHA256_HASH_SIZE], const std::byte* data, size_t size)
714
65.5k
{
715
    /*
716
     * Initialize hash values:
717
     * (first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19):
718
     */
719
65.5k
    uint32_t h[] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c,
720
65.5k
        0x1f83d9ab, 0x5be0cd19};
721
722
65.5k
    sha_256_best(h, data, size);
723
724
    /* Produce the final hash value (big-endian): */
725
589k
    for (unsigned i = 0, j = 0; i < 8; 
i++524k
)
726
524k
    {
727
524k
        hash[j++] = static_cast<std::byte>(h[i] >> 24);
728
524k
        hash[j++] = static_cast<std::byte>(h[i] >> 16);
729
524k
        hash[j++] = static_cast<std::byte>(h[i] >> 8);
730
524k
        hash[j++] = static_cast<std::byte>(h[i]);
731
524k
    }
732
65.5k
}
733
734
}  // namespace evmone::crypto
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/account.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/account.hpp.html new file mode 100644 index 0000000000..4ff3379c8e --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/account.hpp.html @@ -0,0 +1,20 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/account.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2021 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <evmc/evmc.hpp>
7
#include <intx/intx.hpp>
8
#include <unordered_map>
9
10
namespace evmone::state
11
{
12
using evmc::address;
13
using evmc::bytes;
14
using evmc::bytes32;
15
using namespace evmc::literals;
16
17
/// The representation of the account storage value.
18
struct StorageValue
19
{
20
    /// The current value.
21
    bytes32 current;
22
23
    /// The original value.
24
    bytes32 original;
25
26
    evmc_access_status access_status = EVMC_ACCESS_COLD;
27
};
28
29
/// The state account.
30
struct Account
31
{
32
    /// The maximum allowed nonce value.
33
    static constexpr auto NonceMax = std::numeric_limits<uint64_t>::max();
34
35
    /// The keccak256 hash of the empty input. Used to identify empty account's code.
36
    static constexpr auto EMPTY_CODE_HASH =
37
        0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470_bytes32;
38
39
    /// The account nonce.
40
    uint64_t nonce = 0;
41
42
    /// The account balance.
43
    intx::uint256 balance;
44
45
    bytes32 code_hash = EMPTY_CODE_HASH;
46
47
    /// If the account has non-empty initial storage (when accessing the cold account).
48
    bool has_initial_storage = false;
49
50
    /// The cached and modified account storage entries.
51
    std::unordered_map<bytes32, StorageValue> storage;
52
53
    /// The EIP-1153 transient (transaction-level lifetime) storage.
54
    std::unordered_map<bytes32, bytes32> transient_storage;
55
56
    /// The cache of the account code.
57
    ///
58
    /// Check code_hash to know if an account code is empty.
59
    /// Empty here only means it has not been loaded from the initial storage.
60
    bytes code;
61
62
    /// The account has been destructed and should be erased at the end of a transaction.
63
    bool destructed = false;
64
65
    /// The account should be erased if it is empty at the end of a transaction.
66
    /// This flag means the account has been "touched" as defined in EIP-161,
67
    /// or it is a newly created temporary account.
68
    ///
69
    /// Yellow Paper uses term "delete" but it is a keyword in C++ while
70
    /// the term "erase" is used for deleting objects from C++ collections.
71
    bool erase_if_empty = false;
72
73
    /// The account has been created in the current transaction.
74
    bool just_created = false;
75
76
    // This account's code has been modified.
77
    bool code_changed = false;
78
79
    evmc_access_status access_status = EVMC_ACCESS_COLD;
80
81
    [[nodiscard]] bool is_empty() const noexcept
82
2.43M
    {
83
2.43M
        return nonce == 0 && 
balance == 02.09M
&&
code_hash == EMPTY_CODE_HASH1.04M
;
  MC/DC Decision Region (83:16) to (83:74)
+
+  Number of Conditions: 3
+     Condition C1 --> (83:16)
+     Condition C2 --> (83:30)
+     Condition C3 --> (83:46)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  F,  -  = F      }
+  3 { T,  T,  F  = F      }
+  4 { T,  T,  T  = T      }
+
+  C1-Pair: covered: (1,4)
+  C2-Pair: covered: (2,4)
+  C3-Pair: covered: (3,4)
+  MC/DC Coverage for Expression: 100.00%
+
84
2.43M
    }
85
};
86
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/blob_schedule.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/blob_schedule.hpp.html new file mode 100644 index 0000000000..396051b8e3 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/blob_schedule.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/blob_schedule.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2025 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include <evmc/evmc.hpp>
8
9
namespace evmone::state
10
{
11
/// The cost of a single blob in gas units (EIP-4844).
12
constexpr auto GAS_PER_BLOB = 0x20000;  // 2**17
13
14
/// The maximum number of blobs that can be included in a transaction (EIP-7594).
15
constexpr auto MAX_TX_BLOB_COUNT = 6;
16
17
/// The blob schedule for an EVM revision (EIP-7840).
18
struct BlobSchedule
19
{
20
    uint16_t target = 0;
21
    uint16_t max = 0;
22
    uint32_t base_fee_update_fraction = 0;
23
};
24
25
/// Returns the blob schedule for the given EVM revision.
26
constexpr BlobSchedule get_blob_schedule(evmc_revision rev) noexcept
27
379k
{
28
379k
    if (rev >= EVMC_PRAGUE)
29
259k
        return {6, 9, 5007716};
30
120k
    return {3, 6, 3338477};
31
379k
}
32
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/block.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/block.cpp.html new file mode 100644 index 0000000000..0c24840a92 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/block.cpp.html @@ -0,0 +1,17 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/block.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "block.hpp"
6
#include "blob_schedule.hpp"
7
#include "rlp.hpp"
8
#include "transaction.hpp"
9
10
namespace evmone::state
11
{
12
static constexpr auto GAS_LIMIT_ELASTICITY_MULTIPLIER = 2;
13
static constexpr auto BASE_FEE_MAX_CHANGE_DENOMINATOR = 8;
14
15
uint64_t calc_base_fee(
16
    int64_t parent_gas_limit, int64_t parent_gas_used, uint64_t parent_base_fee) noexcept
17
73.3k
{
18
73.3k
    auto parent_gas_target = parent_gas_limit / GAS_LIMIT_ELASTICITY_MULTIPLIER;
19
20
    // Special logic for block activating EIP-1559 is not implemented, because test don't cover it.
21
73.3k
    if (parent_gas_used == parent_gas_target)
22
672
    {
23
672
        return parent_base_fee;
24
672
    }
25
72.6k
    else if (parent_gas_used > parent_gas_target)
26
0
    {
27
0
        const auto gas_used_delta = parent_gas_used - parent_gas_target;
28
0
        const auto base_fee_delta =
29
0
            std::max(intx::uint256{parent_base_fee} * gas_used_delta / parent_gas_target /
30
0
                         BASE_FEE_MAX_CHANGE_DENOMINATOR,
31
0
                intx::uint256{1});
32
0
        return parent_base_fee + static_cast<uint64_t>(base_fee_delta);
33
0
    }
34
72.6k
    else
35
72.6k
    {
36
72.6k
        const auto gas_used_delta = parent_gas_target - parent_gas_used;
37
72.6k
        const auto base_fee_delta = intx::uint256{parent_base_fee} * gas_used_delta /
38
72.6k
                                    parent_gas_target / BASE_FEE_MAX_CHANGE_DENOMINATOR;
39
72.6k
        return parent_base_fee - static_cast<uint64_t>(base_fee_delta);
40
72.6k
    }
41
73.3k
}
42
43
uint64_t max_blob_gas_per_block(evmc_revision rev) noexcept
44
123k
{
45
123k
    return get_blob_schedule(rev).max * GAS_PER_BLOB;
46
123k
}
47
48
49
intx::uint256 compute_blob_gas_price(evmc_revision rev, uint64_t excess_blob_gas) noexcept
50
190k
{
51
    /// A helper function approximating `factor * e ** (numerator / denominator)`.
52
    /// https://eips.ethereum.org/EIPS/eip-4844#helpers
53
190k
    static constexpr auto fake_exponential = [](uint64_t factor, uint64_t numerator,
54
190k
                                                 uint64_t denominator) noexcept {
55
190k
        intx::uint256 i = 1;
56
190k
        intx::uint256 output = 0;
57
190k
        intx::uint256 numerator_accum = factor * denominator;
58
190k
        const intx::uint256 numerator256 = numerator;
59
486k
        while (numerator_accum > 0)
60
296k
        {
61
296k
            output += numerator_accum;
62
            // Ensure the multiplication won't overflow 256 bits.
63
296k
            if (const auto p = intx::umul(numerator_accum, numerator256);
64
296k
                p <= std::numeric_limits<intx::uint256>::max())
65
296k
                numerator_accum = intx::uint256(p) / (denominator * i);
66
480
            else
67
480
                return std::numeric_limits<intx::uint256>::max();
68
296k
            i += 1;
69
296k
        }
70
189k
        return output / denominator;
71
190k
    };
72
73
190k
    static constexpr auto MIN_BLOB_GASPRICE = 1;
74
190k
    const auto fraction = get_blob_schedule(rev).base_fee_update_fraction;
75
190k
    return fake_exponential(MIN_BLOB_GASPRICE, excess_blob_gas, fraction);
76
190k
}
77
78
uint64_t calc_excess_blob_gas(evmc_revision rev, uint64_t parent_blob_gas_used,
79
    uint64_t parent_excess_blob_gas, uint64_t parent_base_fee,
80
    const intx::uint256& parent_blob_base_fee) noexcept
81
65.8k
{
82
    /// The base cost of a blob (EIP-7918).
83
65.8k
    constexpr auto BLOB_BASE_COST = 0x2000;
84
85
65.8k
    const auto schedule = get_blob_schedule(rev);
86
65.8k
    const auto target_blob_gas_per_block = uint64_t{schedule.target} * GAS_PER_BLOB;
87
65.8k
    if (parent_excess_blob_gas + parent_blob_gas_used < target_blob_gas_per_block)
88
58.2k
        return 0;
89
90
7.62k
    if (rev >= EVMC_OSAKA && 
BLOB_BASE_COST * parent_base_fee > GAS_PER_BLOB * parent_blob_base_fee2.78k
)
  MC/DC Decision Region (90:9) to (90:100)
+
+  Number of Conditions: 2
+     Condition C1 --> (90:9)
+     Condition C2 --> (90:30)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
91
171
        return parent_excess_blob_gas +
92
171
               parent_blob_gas_used * (schedule.max - schedule.target) / schedule.max;
93
94
7.45k
    return parent_excess_blob_gas + parent_blob_gas_used - target_blob_gas_per_block;
95
7.62k
}
96
97
[[nodiscard]] bytes rlp_encode(const Withdrawal& withdrawal)
98
4.02k
{
99
4.02k
    return rlp::encode_tuple(withdrawal.index, withdrawal.validator_index, withdrawal.recipient,
100
4.02k
        withdrawal.amount_in_gwei);
101
4.02k
}
102
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/block.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/block.hpp.html new file mode 100644 index 0000000000..9eb02fa804 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/block.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/block.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include "hash_utils.hpp"
8
#include <intx/intx.hpp>
9
#include <vector>
10
11
namespace evmone::state
12
{
13
struct Ommer
14
{
15
    address beneficiary;  ///< Ommer block beneficiary address.
16
    uint32_t delta = 0;   ///< Difference between current and ommer block number.
17
};
18
19
struct Withdrawal
20
{
21
    uint64_t index = 0;
22
    uint64_t validator_index = 0;
23
    address recipient;
24
    uint64_t amount_in_gwei = 0;  ///< The amount is denominated in gwei.
25
26
    /// Returns withdrawal amount in wei.
27
    [[nodiscard]] intx::uint256 get_amount() const noexcept
28
4.03k
    {
29
4.03k
        return intx::uint256{amount_in_gwei} * 1'000'000'000;
30
4.03k
    }
31
};
32
33
struct BlockInfo
34
{
35
    int64_t number = 0;
36
    int64_t timestamp = 0;
37
    hash256 hash;
38
    hash256 parent_hash;
39
    int64_t parent_timestamp = 0;
40
    int64_t gas_limit = 0;
41
    int64_t gas_used = 0;
42
    address coinbase;
43
    int64_t difficulty = 0;
44
    int64_t parent_difficulty = 0;
45
    hash256 parent_ommers_hash;
46
    bytes32 prev_randao;
47
    hash256 parent_beacon_block_root;
48
49
    /// The EIP-1559 base fee, since London.
50
    uint64_t base_fee = 0;
51
52
    /// The "blob gas used" parameter from EIP-4844
53
    std::optional<uint64_t> blob_gas_used;
54
55
    /// The "excess blob gas" parameter from EIP-4844
56
    /// for computing the blob gas price in the current block.
57
    std::optional<uint64_t> excess_blob_gas;
58
59
    /// Blob gas price from EIP-4844, computed from excess_blob_gas.
60
    std::optional<intx::uint256> blob_base_fee;
61
62
    std::vector<Ommer> ommers;
63
    std::vector<Withdrawal> withdrawals;
64
};
65
66
/// Base fee per gas for the block.
67
uint64_t calc_base_fee(
68
    int64_t parent_gas_limit, int64_t parent_gas_used, uint64_t parent_base_fee) noexcept;
69
70
/// Max amount of blob gas allowed in block.
71
uint64_t max_blob_gas_per_block(evmc_revision rev) noexcept;
72
73
/// Computes the current blob gas price based on the excess blob gas.
74
intx::uint256 compute_blob_gas_price(evmc_revision rev, uint64_t excess_blob_gas) noexcept;
75
76
/// Computes the current excess blob gas based on parameters of the parent block.
77
uint64_t calc_excess_blob_gas(evmc_revision rev, uint64_t parent_blob_gas_used,
78
    uint64_t parent_excess_blob_gas, uint64_t parent_base_fee,
79
    const intx::uint256& parent_blob_base_fee) noexcept;
80
81
/// Defines how to RLP-encode a Withdrawal.
82
[[nodiscard]] bytes rlp_encode(const Withdrawal& withdrawal);
83
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/bloom_filter.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/bloom_filter.cpp.html new file mode 100644 index 0000000000..7ff3529736 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/bloom_filter.cpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/bloom_filter.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "bloom_filter.hpp"
6
#include "transaction.hpp"
7
8
namespace evmone::state
9
{
10
11
namespace
12
{
13
/// Adds an entry to the bloom filter.
14
/// based on
15
/// https://ethereum.github.io/execution-specs/autoapi/ethereum/shanghai/bloom/index.html#add-to-bloom
16
inline void add_to(BloomFilter& bf, const bytes_view& entry)
17
65.0k
{
18
65.0k
    const auto hash = keccak256(entry);
19
20
    // take the least significant 11-bits of the first three 16-bit values
21
65.0k
    for (const auto i : {0, 2, 4})
22
195k
    {
23
195k
        const auto bit_to_set = ((hash.bytes[i] & 0x07) << 8) | hash.bytes[i + 1];
24
195k
        const auto bit_index = 0x07FF - bit_to_set;
25
195k
        const auto byte_index = bit_index / 8;
26
195k
        const auto bit_pos = static_cast<uint8_t>(1 << (7 - (bit_index % 8)));
27
195k
        bf.bytes[byte_index] |= bit_pos;
28
195k
    }
29
65.0k
}
30
31
}  // namespace
32
33
BloomFilter compute_bloom_filter(std::span<const Log> logs) noexcept
34
136k
{
35
136k
    BloomFilter res;
36
136k
    for (const auto& log : logs)
37
27.3k
    {
38
27.3k
        add_to(res, log.addr);
39
27.3k
        for (const auto& topic : log.topics)
40
37.7k
            add_to(res, topic);
41
27.3k
    }
42
43
136k
    return res;
44
136k
}
45
46
BloomFilter compute_bloom_filter(std::span<const TransactionReceipt> receipts) noexcept
47
79.9k
{
48
79.9k
    BloomFilter res;
49
50
79.9k
    for (const auto& r : receipts)
51
81.1k
        std::transform(
52
81.1k
            res.bytes, std::end(res.bytes), r.logs_bloom_filter.bytes, res.bytes, std::bit_or<>());
53
54
79.9k
    return res;
55
79.9k
}
56
57
BloomFilter bloom_filter_from_bytes(const bytes_view& data) noexcept
58
145k
{
59
    assert(data.size() == 256);
60
145k
    BloomFilter res;
61
145k
    std::ranges::copy(data, res.bytes);
62
145k
    return res;
63
145k
}
64
65
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/bloom_filter.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/bloom_filter.hpp.html new file mode 100644 index 0000000000..1508ef5205 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/bloom_filter.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/bloom_filter.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
#include "hash_utils.hpp"
7
#include <span>
8
9
namespace evmone::state
10
{
11
struct Log;
12
struct TransactionReceipt;
13
14
/// The 2048-bit hash suitable for keeping an Ethereum bloom filter of transactions logs.
15
struct BloomFilter
16
{
17
    //// The 256 bytes of the bloom filter value.
18
    uint8_t bytes[256] = {};
19
20
    /// Implicit operator converting to bytes_view.
21
360k
    constexpr operator bytes_view() const noexcept { return {bytes, sizeof(bytes)}; }
22
};
23
24
/// Computes combined bloom fitter for set of logs.
25
/// It's used to compute bloom filter for single transaction.
26
[[nodiscard]] BloomFilter compute_bloom_filter(std::span<const Log> logs) noexcept;
27
28
/// Computes combined bloom fitter for set of TransactionReceipts
29
/// It's used to compute bloom filter for a block.
30
[[nodiscard]] BloomFilter compute_bloom_filter(
31
    std::span<const TransactionReceipt> receipts) noexcept;
32
33
/// Loads BloomFilter from bytes_view
34
BloomFilter bloom_filter_from_bytes(const bytes_view& data) noexcept;
35
36
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/errors.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/errors.hpp.html new file mode 100644 index 0000000000..2dce87f015 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/errors.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/errors.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <cassert>
7
#include <system_error>
8
9
namespace evmone::state
10
{
11
12
enum ErrorCode : int
13
{
14
    SUCCESS = 0,
15
    INTRINSIC_GAS_TOO_LOW,
16
    TX_TYPE_NOT_SUPPORTED,
17
    INSUFFICIENT_FUNDS,
18
    NONCE_HAS_MAX_VALUE,
19
    NONCE_TOO_HIGH,
20
    NONCE_TOO_LOW,
21
    TIP_GT_FEE_CAP,
22
    FEE_CAP_LESS_THAN_BLOCKS,
23
    BLOB_FEE_CAP_LESS_THAN_BLOCKS,
24
    GAS_LIMIT_REACHED,
25
    SENDER_NOT_EOA,
26
    INIT_CODE_SIZE_LIMIT_EXCEEDED,
27
    CREATE_BLOB_TX,
28
    EMPTY_BLOB_HASHES_LIST,
29
    INVALID_BLOB_HASH_VERSION,
30
    BLOB_GAS_LIMIT_EXCEEDED,
31
    CREATE_SET_CODE_TX,
32
    EMPTY_AUTHORIZATION_LIST,
33
    INIT_CODE_EMPTY,
34
    INIT_CODE_COUNT_LIMIT_EXCEEDED,
35
    INIT_CODE_COUNT_ZERO,
36
    MAX_GAS_LIMIT_EXCEEDED,
37
    UNKNOWN_ERROR,
38
};
39
40
/// Obtains a reference to the static error category object for evmone errors.
41
inline const std::error_category& evmone_category() noexcept
42
6.60k
{
43
6.60k
    struct Category : std::error_category
44
6.60k
    {
45
6.60k
        [[nodiscard]] const char* name() const noexcept final 
{ return "evmone"; }0
46
47
6.60k
        [[nodiscard]] std::string message(int ev) const noexcept final
48
6.60k
        {
49
3.56k
            switch (ev)
50
3.56k
            {
51
0
            case SUCCESS:
52
0
                return "";
53
2.18k
            case INTRINSIC_GAS_TOO_LOW:
54
2.18k
                return "intrinsic gas too low";
55
4
            case TX_TYPE_NOT_SUPPORTED:
56
4
                return "transaction type not supported";
57
1.10k
            case INSUFFICIENT_FUNDS:
58
1.10k
                return "insufficient funds for gas * price + value";
59
6
            case NONCE_HAS_MAX_VALUE:
60
6
                return "nonce has max value:";
61
12
            case NONCE_TOO_HIGH:
62
12
                return "nonce too high";
63
2
            case NONCE_TOO_LOW:
64
2
                return "nonce too low";
65
5
            case TIP_GT_FEE_CAP:
66
5
                return "max priority fee per gas higher than max fee per gas";
67
14
            case FEE_CAP_LESS_THAN_BLOCKS:
68
14
                return "max fee per gas less than block base fee";
69
6
            case BLOB_FEE_CAP_LESS_THAN_BLOCKS:
70
6
                return "max blob fee per gas less than block base fee";
71
4
            case GAS_LIMIT_REACHED:
72
4
                return "gas limit reached";
73
37
            case SENDER_NOT_EOA:
74
37
                return "sender not an eoa:";
75
11
            case INIT_CODE_SIZE_LIMIT_EXCEEDED:
76
11
                return "max initcode size exceeded";
77
3
            case CREATE_BLOB_TX:
78
3
                return "blob transaction must not be a create transaction";
79
6
            case EMPTY_BLOB_HASHES_LIST:
80
6
                return "empty blob hashes list";
81
27
            case INVALID_BLOB_HASH_VERSION:
82
27
                return "invalid blob hash version";
83
123
            case BLOB_GAS_LIMIT_EXCEEDED:
84
123
                return "blob gas limit exceeded";
85
2
            case CREATE_SET_CODE_TX:
86
2
                return "set code transaction must not be a create transaction";
87
2
            case EMPTY_AUTHORIZATION_LIST:
88
2
                return "empty authorization list";
89
0
            case INIT_CODE_EMPTY:
90
0
                return "initcode empty";
91
0
            case INIT_CODE_COUNT_LIMIT_EXCEEDED:
92
0
                return "max initcode count exceeded";
93
0
            case INIT_CODE_COUNT_ZERO:
94
0
                return "initcode list empty";
95
11
            case MAX_GAS_LIMIT_EXCEEDED:
96
11
                return "max gas limit exceeded";
97
0
            case UNKNOWN_ERROR:
98
0
                return "Unknown error";
99
0
            default:
100
0
                assert(false);
101
0
                return "Wrong error code";
102
3.56k
            }
103
3.56k
        }
104
6.60k
    };
105
106
6.60k
    static const Category category_instance;
107
6.60k
    return category_instance;
108
6.60k
}
109
110
/// Creates error_code object out of an evmone error code value.
111
/// This is used by std::error_code to implement implicit conversion
112
/// evmone::ErrorCode -> std::error_code, therefore the definition is
113
/// in the global namespace to match the definition of ethash_errc.
114
inline std::error_code make_error_code(ErrorCode errc) noexcept
115
6.60k
{
116
6.60k
    return {errc, evmone_category()};
117
6.60k
}
118
119
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/ethash_difficulty.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/ethash_difficulty.cpp.html new file mode 100644 index 0000000000..eb098ddf6e --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/ethash_difficulty.cpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/ethash_difficulty.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "ethash_difficulty.hpp"
6
#include <algorithm>
7
#include <cassert>
8
9
namespace evmone::state
10
{
11
namespace
12
{
13
int64_t get_bomb_delay(evmc_revision rev) noexcept
14
0
{
15
0
    switch (rev)
16
0
    {
17
0
    default:
18
0
        return 0;
19
0
    case EVMC_BYZANTIUM:
20
0
        return 3'000'000;
21
0
    case EVMC_CONSTANTINOPLE:
22
0
    case EVMC_PETERSBURG:
23
0
    case EVMC_ISTANBUL:
24
0
        return 5'000'000;
25
0
    case EVMC_BERLIN:
26
0
        return 9'000'000;
27
0
    case EVMC_LONDON:
28
0
        return 9'700'000;
29
0
    }
30
0
}
31
32
int64_t calculate_difficulty_pre_byzantium(int64_t parent_difficulty, int64_t parent_timestamp,
33
    int64_t current_timestamp, int64_t block_number, evmc_revision rev)
34
0
{
35
    // According to https://eips.ethereum.org/EIPS/eip-2
36
0
    const auto period_count = block_number / 100'000;
37
0
    const auto offset = parent_difficulty / 2048;
38
39
0
    auto diff = parent_difficulty;
40
41
0
    if (rev < EVMC_HOMESTEAD)
42
0
        diff += offset * (current_timestamp - parent_timestamp < 13 ? 1 : -1);
43
0
    else
44
0
        diff += offset * std::max(1 - (current_timestamp - parent_timestamp) / 10, int64_t{-99});
45
46
0
    if (period_count > 2)
47
0
        diff += 2 << (block_number / 100'000 - 3);
48
0
    else if (period_count == 2)
49
0
        diff += 1;
50
51
0
    return diff;
52
0
}
53
54
int64_t calculate_difficulty_since_byzantium(int64_t parent_difficulty, bool parent_has_ommers,
55
    int64_t parent_timestamp, int64_t current_timestamp, int64_t block_number,
56
    evmc_revision rev) noexcept
57
0
{
58
0
    const auto delay = get_bomb_delay(rev);
59
0
    const auto fake_block_number = std::max(int64_t{0}, block_number - delay);
60
0
    const auto p = (fake_block_number / 100'000) - 2;
61
0
    assert(p < 63);
62
0
    const auto epsilon = p < 0 ? 0 : int64_t{1} << p;
63
0
    const auto y = parent_has_ommers ? 2 : 1;
64
65
0
    const auto timestamp_diff = current_timestamp - parent_timestamp;
66
0
    assert(timestamp_diff > 0);
67
0
    const auto sigma_2 = std::max(y - timestamp_diff / 9, int64_t{-99});
68
0
    const auto x = parent_difficulty / 2048;
69
0
    return parent_difficulty + x * sigma_2 + epsilon;
70
0
}
71
}  // namespace
72
73
int64_t calculate_difficulty(int64_t parent_difficulty, bool parent_has_ommers,
74
    int64_t parent_timestamp, int64_t current_timestamp, int64_t block_number,
75
    evmc_revision rev) noexcept
76
0
{
77
    // The calculation follows Ethereum Yellow Paper section 4.3.4. "Block Header Validity".
78
0
    static constexpr int64_t MIN_DIFFICULTY = 0x20000;
79
80
0
    if (rev >= EVMC_PARIS)
81
0
        return 0;  // No difficulty after the Merge.
82
83
0
    const auto difficulty =
84
0
        (rev < EVMC_BYZANTIUM) ?
85
0
            calculate_difficulty_pre_byzantium(
86
0
                parent_difficulty, parent_timestamp, current_timestamp, block_number, rev) :
87
0
            calculate_difficulty_since_byzantium(parent_difficulty, parent_has_ommers,
88
0
                parent_timestamp, current_timestamp, block_number, rev);
89
90
0
    return std::max(MIN_DIFFICULTY, difficulty);
91
0
}
92
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/hash_utils.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/hash_utils.hpp.html new file mode 100644 index 0000000000..be19be9fa3 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/hash_utils.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/hash_utils.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include <evmc/evmc.hpp>
8
#include <evmc/hex.hpp>
9
#include <evmone_precompiles/keccak.hpp>
10
#include <bit>
11
12
namespace evmone
13
{
14
using evmc::address;
15
using evmc::bytes;
16
using evmc::bytes32;
17
using evmc::bytes_view;
18
using namespace evmc::literals;
19
20
/// Default type for 256-bit hash.
21
///
22
/// Better than ethash::hash256 because has some additional handy constructors.
23
using hash256 = bytes32;
24
25
/// The hash of the empty RLP list, i.e. keccak256({0xc0}).
26
static constexpr auto EmptyListHash =
27
    0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347_bytes32;
28
29
/// Computes Keccak hash out of input bytes (wrapper of ethash::keccak256).
30
inline hash256 keccak256(bytes_view data) noexcept
31
42.0M
{
32
42.0M
    return std::bit_cast<hash256>(ethash::keccak256(data.data(), data.size()));
33
42.0M
}
34
}  // namespace evmone
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/host.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/host.cpp.html new file mode 100644 index 0000000000..a85e07f2be --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/host.cpp.html @@ -0,0 +1,283 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/host.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "host.hpp"
6
#include "precompiles.hpp"
7
#include <evmone/constants.hpp>
8
#include <evmone/eof.hpp>
9
10
namespace evmone::state
11
{
12
bool Host::account_exists(const address& addr) const noexcept
13
104k
{
14
104k
    const auto* const acc = m_state.find(addr);
15
104k
    return acc != nullptr && 
(103k
m_rev < EVMC_SPURIOUS_DRAGON103k
||
!acc->is_empty()93.3k
);
  MC/DC Decision Region (15:12) to (15:80)
+
+  Number of Conditions: 3
+     Condition C1 --> (15:12)
+     Condition C2 --> (15:31)
+     Condition C3 --> (15:63)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  F,  F  = F      }
+  3 { T,  F,  T  = T      }
+  4 { T,  T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,4)
+  C3-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
16
104k
}
17
18
bytes32 Host::get_storage(const address& addr, const bytes32& key) const noexcept
19
1.01M
{
20
1.01M
    return m_state.get_storage(addr, key).current;
21
1.01M
}
22
23
evmc_storage_status Host::set_storage(
24
    const address& addr, const bytes32& key, const bytes32& value) noexcept
25
4.43M
{
26
    // Follow EVMC documentation https://evmc.ethereum.org/storagestatus.html#autotoc_md3
27
    // and EIP-2200 specification https://eips.ethereum.org/EIPS/eip-2200.
28
29
4.43M
    auto& storage_slot = m_state.get_storage(addr, key);
30
4.43M
    const auto& [current, original, _] = storage_slot;
31
32
4.43M
    const auto dirty = original != current;
33
4.43M
    const auto restored = original == value;
34
4.43M
    const auto current_is_zero = is_zero(current);
35
4.43M
    const auto value_is_zero = is_zero(value);
36
37
4.43M
    auto status = EVMC_STORAGE_ASSIGNED;  // All other cases.
38
4.43M
    if (!dirty && 
!restored2.88M
)
  MC/DC Decision Region (38:9) to (38:28)
+
+  Number of Conditions: 2
+     Condition C1 --> (38:9)
+     Condition C2 --> (38:19)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
39
1.28M
    {
40
1.28M
        if (current_is_zero)
41
1.19M
            status = EVMC_STORAGE_ADDED;  // 0 → 0 → Z
42
89.5k
        else if (value_is_zero)
43
42.9k
            status = EVMC_STORAGE_DELETED;  // X → X → 0
44
46.6k
        else
45
46.6k
            status = EVMC_STORAGE_MODIFIED;  // X → X → Z
46
1.28M
    }
47
3.15M
    else if (dirty && 
!restored1.54M
)
  MC/DC Decision Region (47:14) to (47:32)
+
+  Number of Conditions: 2
+     Condition C1 --> (47:14)
+     Condition C2 --> (47:23)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
48
792k
    {
49
792k
        if (current_is_zero && 
!value_is_zero2.53k
)
  MC/DC Decision Region (49:13) to (49:46)
+
+  Number of Conditions: 2
+     Condition C1 --> (49:13)
+     Condition C2 --> (49:32)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
50
48
            status = EVMC_STORAGE_DELETED_ADDED;  // X → 0 → Z
51
792k
        else if (!current_is_zero && 
value_is_zero789k
)
  MC/DC Decision Region (51:18) to (51:51)
+
+  Number of Conditions: 2
+     Condition C1 --> (51:18)
+     Condition C2 --> (51:38)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
52
234
            status = EVMC_STORAGE_MODIFIED_DELETED;  // X → Y → 0
53
792k
    }
54
2.36M
    else if (dirty && 
restored754k
)
  MC/DC Decision Region (54:14) to (54:31)
+
+  Number of Conditions: 2
+     Condition C1 --> (54:14)
+     Condition C2 --> (54:23)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  T  = T      }
+
+  C1-Pair: covered: (1,2)
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 50.00%
+
55
754k
    {
56
754k
        if (current_is_zero)
57
72
            status = EVMC_STORAGE_DELETED_RESTORED;  // X → 0 → X
58
754k
        else if (value_is_zero)
59
754k
            status = EVMC_STORAGE_ADDED_DELETED;  // 0 → Y → 0
60
24
        else
61
24
            status = EVMC_STORAGE_MODIFIED_RESTORED;  // X → Y → X
62
754k
    }
63
64
    // In Berlin this is handled in access_storage().
65
4.43M
    if (m_rev < EVMC_BERLIN)
66
34.8k
        m_state.journal_storage_change(addr, key, storage_slot);
67
4.43M
    storage_slot.current = value;  // Update current value.
68
4.43M
    return status;
69
4.43M
}
70
71
uint256be Host::get_balance(const address& addr) const noexcept
72
122k
{
73
122k
    const auto* const acc = m_state.find(addr);
74
122k
    return (acc != nullptr) ? 
intx::be::store<uint256be>(acc->balance)122k
:
uint256be{}12
;
75
122k
}
76
77
namespace
78
{
79
/// For EXTCODE* instructions if the target is an EOF account, then only return EF00.
80
/// While we only do this if the caller is legacy, it is not a problem doing this
81
/// unconditionally, because EOF contracts dot no have EXTCODE* instructions.
82
bytes_view extcode(bytes_view code) noexcept
83
2.91M
{
84
2.91M
    return is_eof_container(code) ? 
code.substr(0, 2)0
: code;
85
2.91M
}
86
87
/// Check if an existing account is the "create collision"
88
/// as defined in the [EIP-7610](https://eips.ethereum.org/EIPS/eip-7610).
89
[[nodiscard]] bool is_create_collision(const Account& acc) noexcept
90
80.1k
{
91
    // TODO: This requires much more testing:
92
    // - what if an account had storage but is destructed?
93
    // - what if an account had cold storage but it was emptied?
94
    // - what if an account without cold storage gain one?
95
80.1k
    if (acc.nonce != 0)
96
218
        return true;
97
79.9k
    if (acc.code_hash != Account::EMPTY_CODE_HASH)
98
162
        return true;
99
79.7k
    if (acc.has_initial_storage)
100
28
        return true;
101
102
    // The hot storage is ignored because it can contain elements from access list.
103
    // TODO: Is this correct for destructed accounts?
104
79.7k
    assert(!acc.destructed && "untested");
105
79.7k
    return false;
106
79.7k
}
107
}  // namespace
108
109
size_t Host::get_code_size(const address& addr) const noexcept
110
470k
{
111
470k
    const auto raw_code = m_state.get_code(addr);
112
470k
    return extcode(raw_code).size();
113
470k
}
114
115
bytes32 Host::get_code_hash(const address& addr) const noexcept
116
3.33k
{
117
3.33k
    const auto* const acc = m_state.find(addr);
118
3.33k
    if (acc == nullptr || 
acc->is_empty()3.32k
)
  MC/DC Decision Region (118:9) to (118:42)
+
+  Number of Conditions: 2
+     Condition C1 --> (118:9)
+     Condition C2 --> (118:27)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
119
650
        return {};
120
121
    // Load code and check if not EOF.
122
    // TODO: Optimize the second account lookup here.
123
2.68k
    if (is_eof_container(m_state.get_code(addr)))
124
0
        return EOF_CODE_HASH_SENTINEL;
125
126
2.68k
    return acc->code_hash;
127
2.68k
}
128
129
size_t Host::copy_code(const address& addr, size_t code_offset, uint8_t* buffer_data,
130
    size_t buffer_size) const noexcept
131
2.44M
{
132
2.44M
    const auto raw_code = m_state.get_code(addr);
133
2.44M
    const auto code = extcode(raw_code);
134
2.44M
    const auto code_slice = code.substr(std::min(code_offset, code.size()));
135
2.44M
    const auto num_bytes = std::min(buffer_size, code_slice.size());
136
2.44M
    std::copy_n(code_slice.begin(), num_bytes, buffer_data);
137
2.44M
    return num_bytes;
138
2.44M
}
139
140
bool Host::selfdestruct(const address& addr, const address& beneficiary) noexcept
141
7.27k
{
142
7.27k
    if (m_state.find(beneficiary) == nullptr)
143
19
        m_state.journal_create(beneficiary, false);
144
7.27k
    auto& acc = m_state.get(addr);
145
7.27k
    const auto balance = acc.balance;
146
7.27k
    auto& beneficiary_acc = m_state.touch(beneficiary);
147
148
7.27k
    m_state.journal_balance_change(beneficiary, beneficiary_acc.balance);
149
7.27k
    m_state.journal_balance_change(addr, balance);
150
151
7.27k
    if (m_rev >= EVMC_CANCUN && 
!acc.just_created6.38k
)
  MC/DC Decision Region (151:9) to (151:50)
+
+  Number of Conditions: 2
+     Condition C1 --> (151:9)
+     Condition C2 --> (151:33)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
152
2.26k
    {
153
        // EIP-6780:
154
        // "SELFDESTRUCT is executed in a transaction that is not the same
155
        // as the contract invoking SELFDESTRUCT was created"
156
2.26k
        acc.balance = 0;
157
2.26k
        beneficiary_acc.balance += balance;  // Keep balance if acc is the beneficiary.
158
159
        // Return "selfdestruct not registered".
160
        // In practice this affects only refunds before Cancun.
161
2.26k
        return false;
162
2.26k
    }
163
164
    // Transfer may happen multiple times per single account as account's balance
165
    // can be increased with a call following previous selfdestruct.
166
5.00k
    beneficiary_acc.balance += balance;
167
5.00k
    acc.balance = 0;  // Zero balance if acc is the beneficiary.
168
169
    // Mark the destruction if not done already.
170
5.00k
    if (!acc.destructed)
171
4.14k
    {
172
4.14k
        m_state.journal_destruct(addr);
173
4.14k
        acc.destructed = true;
174
4.14k
        return true;
175
4.14k
    }
176
863
    return false;
177
5.00k
}
178
179
address compute_create_address(const address& sender, uint64_t sender_nonce) noexcept
180
60.1k
{
181
60.1k
    static constexpr auto RLP_STR_BASE = 0x80;
182
60.1k
    static constexpr auto RLP_LIST_BASE = 0xc0;
183
60.1k
    static constexpr auto ADDRESS_SIZE = sizeof(sender);
184
60.1k
    static constexpr std::ptrdiff_t MAX_NONCE_SIZE = sizeof(sender_nonce);
185
186
60.1k
    uint8_t buffer[ADDRESS_SIZE + MAX_NONCE_SIZE + 3];  // 3 for RLP prefix bytes.
187
60.1k
    auto p = &buffer[1];                                // Skip RLP list prefix for now.
188
60.1k
    *p++ = RLP_STR_BASE + ADDRESS_SIZE;                 // Set RLP string prefix for address.
189
60.1k
    p = std::copy_n(sender.bytes, ADDRESS_SIZE, p);
190
191
60.1k
    if (sender_nonce < RLP_STR_BASE)  // Short integer encoding including 0 as empty string (0x80).
192
54.5k
    {
193
54.5k
        *p++ = sender_nonce != 0 ? 
static_cast<uint8_t>(sender_nonce)13.7k
:
RLP_STR_BASE40.7k
;
194
54.5k
    }
195
5.68k
    else  // Prefixed integer encoding.
196
5.68k
    {
197
        // TODO: bit_width returns int after [LWG 3656](https://cplusplus.github.io/LWG/issue3656).
198
        // NOLINTNEXTLINE(readability-redundant-casting)
199
5.68k
        const auto num_nonzero_bytes = static_cast<int>((std::bit_width(sender_nonce) + 7) / 8);
200
5.68k
        *p++ = static_cast<uint8_t>(RLP_STR_BASE + num_nonzero_bytes);
201
5.68k
        intx::be::unsafe::store(p, sender_nonce);
202
5.68k
        p = std::shift_left(p, p + MAX_NONCE_SIZE, MAX_NONCE_SIZE - num_nonzero_bytes);
203
5.68k
    }
204
205
60.1k
    const auto total_size = static_cast<size_t>(p - buffer);
206
60.1k
    buffer[0] = static_cast<uint8_t>(RLP_LIST_BASE + (total_size - 1));  // Set the RLP list prefix.
207
208
60.1k
    const auto base_hash = keccak256({buffer, total_size});
209
60.1k
    address addr;
210
60.1k
    std::copy_n(&base_hash.bytes[sizeof(base_hash) - ADDRESS_SIZE], ADDRESS_SIZE, addr.bytes);
211
60.1k
    return addr;
212
60.1k
}
213
214
address compute_create2_address(
215
    const address& sender, const bytes32& salt, bytes_view init_code) noexcept
216
24.7k
{
217
24.7k
    const auto init_code_hash = keccak256(init_code);
218
24.7k
    uint8_t buffer[1 + sizeof(sender) + sizeof(salt) + sizeof(init_code_hash)];
219
24.7k
    static_assert(std::size(buffer) == 85);
220
24.7k
    auto it = std::begin(buffer);
221
24.7k
    *it++ = 0xff;
222
24.7k
    it = std::copy_n(sender.bytes, sizeof(sender), it);
223
24.7k
    it = std::copy_n(salt.bytes, sizeof(salt), it);
224
24.7k
    std::copy_n(init_code_hash.bytes, sizeof(init_code_hash), it);
225
24.7k
    const auto base_hash = keccak256({buffer, std::size(buffer)});
226
24.7k
    address addr;
227
24.7k
    std::copy_n(&base_hash.bytes[sizeof(base_hash) - sizeof(addr)], sizeof(addr), addr.bytes);
228
24.7k
    return addr;
229
24.7k
}
230
231
address compute_eofcreate_address(const address& sender, const bytes32& salt) noexcept
232
0
{
233
0
    uint8_t buffer[1 + 32 + sizeof(salt)];
234
0
    static_assert(std::size(buffer) == 65);
235
0
    auto it = std::begin(buffer);
236
0
    *it++ = 0xff;
237
0
    it = std::fill_n(it, 32 - sizeof(sender), 0);  // zero-pad sender to 32 bytes.
238
0
    it = std::copy_n(sender.bytes, sizeof(sender), it);
239
0
    std::copy_n(salt.bytes, sizeof(salt), it);
240
0
    const auto base_hash = keccak256({buffer, std::size(buffer)});
241
0
    address addr;
242
0
    std::copy_n(&base_hash.bytes[sizeof(base_hash) - sizeof(addr)], sizeof(addr), addr.bytes);
243
0
    return addr;
244
0
}
245
246
std::optional<evmc_message> Host::prepare_message(evmc_message msg) noexcept
247
4.30M
{
248
4.30M
    if (msg.depth == 0 || 
msg.kind == EVMC_CREATE4.16M
||
msg.kind == EVMC_CREATE24.14M
||
249
4.30M
        
msg.kind == EVMC_EOFCREATE4.12M
)
  MC/DC Decision Region (248:9) to (249:35)
+
+  Number of Conditions: 4
+     Condition C1 --> (248:9)
+     Condition C2 --> (248:27)
+     Condition C3 --> (248:54)
+     Condition C4 --> (249:9)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3, C4    Result
+  1 { F,  F,  F,  F  = F      }
+  2 { F,  F,  T,  -  = T      }
+  3 { F,  T,  -,  -  = T      }
+  4 { T,  -,  -,  -  = T      }
+
+  C1-Pair: covered: (1,4)
+  C2-Pair: covered: (1,3)
+  C3-Pair: covered: (1,2)
+  C4-Pair: not covered
+  MC/DC Coverage for Expression: 75.00%
+
250
183k
    {
251
183k
        auto& sender_acc = m_state.get(msg.sender);
252
253
        // EIP-2681 (already checked for depth 0 during transaction validation).
254
183k
        if (sender_acc.nonce == Account::NonceMax)
255
96
            return {};  // Light early exception.
256
257
183k
        if (msg.depth != 0)
258
46.3k
        {
259
46.3k
            m_state.journal_bump_nonce(msg.sender);
260
46.3k
            ++sender_acc.nonce;  // Bump sender nonce.
261
46.3k
        }
262
263
183k
        if (msg.kind == EVMC_CREATE || 
msg.kind == EVMC_CREATE2123k
||
msg.kind == EVMC_EOFCREATE98.3k
)
  MC/DC Decision Region (263:13) to (263:94)
+
+  Number of Conditions: 3
+     Condition C1 --> (263:13)
+     Condition C2 --> (263:40)
+     Condition C3 --> (263:68)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  F,  F  = F      }
+  2 { F,  T,  -  = T      }
+  3 { T,  -,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  C3-Pair: not covered
+  MC/DC Coverage for Expression: 66.67%
+
264
84.9k
        {
265
            // Compute and set the address of the account being created.
266
84.9k
            assert(msg.recipient == address{});
267
84.9k
            assert(msg.code_address == address{});
268
            // Nonce was already incremented, but creation calculation needs non-incremented value
269
84.9k
            assert(sender_acc.nonce != 0);
270
84.9k
            const auto creation_sender_nonce = sender_acc.nonce - 1;
271
84.9k
            if (msg.kind == EVMC_CREATE)
272
60.1k
                msg.recipient = compute_create_address(msg.sender, creation_sender_nonce);
273
24.7k
            else if (msg.kind == EVMC_CREATE2)
274
24.7k
            {
275
24.7k
                msg.recipient = compute_create2_address(
276
24.7k
                    msg.sender, msg.create2_salt, {msg.input_data, msg.input_size});
277
24.7k
            }
278
0
            else
279
0
            {
280
                // EOFCREATE or TXCREATE
281
0
                assert(msg.kind == EVMC_EOFCREATE);
282
0
                msg.recipient = compute_eofcreate_address(msg.sender, msg.create2_salt);
283
0
            }
284
285
            // By EIP-2929, the access to new created address is never reverted.
286
84.9k
            access_account(msg.recipient);
287
84.9k
        }
288
183k
    }
289
290
4.30M
    return msg;
291
4.30M
}
292
293
evmc::Result Host::create(const evmc_message& msg) noexcept
294
84.9k
{
295
84.9k
    assert(msg.kind == EVMC_CREATE || msg.kind == EVMC_CREATE2 || msg.kind == EVMC_EOFCREATE);
296
297
84.9k
    auto* new_acc = m_state.find(msg.recipient);
298
84.9k
    const bool new_acc_exists = new_acc != nullptr;
299
84.9k
    if (!new_acc_exists)
300
4.83k
        new_acc = &m_state.insert(msg.recipient);
301
80.1k
    else if (is_create_collision(*new_acc))
302
408
        return evmc::Result{EVMC_FAILURE};  // TODO: Add EVMC errors for creation failures.
303
84.5k
    m_state.journal_create(msg.recipient, new_acc_exists);
304
305
84.5k
    assert(new_acc != nullptr);
306
84.5k
    assert(new_acc->nonce == 0);
307
308
84.5k
    if (m_rev >= EVMC_SPURIOUS_DRAGON)
309
83.2k
        new_acc->nonce = 1;  // No need to journal: create revert will 0 the nonce.
310
311
84.5k
    new_acc->just_created = true;
312
313
84.5k
    auto& sender_acc = m_state.get(msg.sender);  // TODO: Duplicated account lookup.
314
84.5k
    const auto value = intx::be::load<intx::uint256>(msg.value);
315
84.5k
    assert(sender_acc.balance >= value && "EVM must guarantee balance");
316
84.5k
    m_state.journal_balance_change(msg.sender, sender_acc.balance);
317
84.5k
    m_state.journal_balance_change(msg.recipient, new_acc->balance);
318
84.5k
    sender_acc.balance -= value;
319
84.5k
    new_acc->balance += value;  // The new account may be prefunded.
320
321
84.5k
    auto create_msg = msg;
322
84.5k
    const auto initcode = (msg.kind == EVMC_EOFCREATE ? 
bytes_view{msg.code, msg.code_size}0
:
323
84.5k
                                                        bytes_view{msg.input_data, msg.input_size});
324
325
84.5k
    if (m_rev >= EVMC_EXPERIMENTAL && 
msg.kind != EVMC_EOFCREATE0
&&
msg.depth == 00
)
  MC/DC Decision Region (325:9) to (325:83)
+
+  Number of Conditions: 3
+     Condition C1 --> (325:9)
+     Condition C2 --> (325:39)
+     Condition C3 --> (325:69)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  C3-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
326
0
    {
327
        // EOF initcode is not allowed for legacy creation tx
328
        // We cannot let the EVM handle that on the initial `EF` invalid instruction,
329
        // b/c it will default to running `initcode` as an EOF container. At the same time setting
330
        // the execution mode (legacy vs EOF) deeper down based on `msg.kind` seems awkward.
331
        // NOTE: EOF initcode is also not allowed in CREATE/CREATE2, but that is blocked
332
        // earlier on the opcode level.
333
0
        if (is_eof_container(initcode))
334
0
            return evmc::Result{EVMC_FAILURE};
335
0
    }
336
84.5k
    if (msg.kind != EVMC_EOFCREATE)
337
84.5k
    {
338
84.5k
        create_msg.input_data = nullptr;
339
84.5k
        create_msg.input_size = 0;
340
84.5k
    }
341
342
84.5k
    auto result = m_vm.execute(*this, m_rev, create_msg, initcode.data(), initcode.size());
343
84.5k
    if (result.status_code != EVMC_SUCCESS)
344
3.84k
    {
345
3.84k
        result.create_address = msg.recipient;
346
3.84k
        return result;
347
3.84k
    }
348
349
80.7k
    auto gas_left = result.gas_left;
350
80.7k
    assert(gas_left >= 0);
351
352
80.7k
    const bytes_view code{result.output_data, result.output_size};
353
354
    // for EOFCREATE successful result is guaranteed to be non-empty
355
    // because container section is not allowed to be empty
356
80.7k
    assert(msg.kind != EVMC_EOFCREATE || result.status_code != EVMC_SUCCESS || !code.empty());
357
358
80.7k
    if (m_rev >= EVMC_SPURIOUS_DRAGON && 
code.size() > MAX_CODE_SIZE79.4k
)
  MC/DC Decision Region (358:9) to (358:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (358:9)
+     Condition C2 --> (358:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
359
94
        return evmc::Result{EVMC_FAILURE};
360
361
    // Code deployment cost.
362
80.6k
    const auto cost = std::ssize(code) * 200;
363
80.6k
    gas_left -= cost;
364
80.6k
    if (gas_left < 0)
365
300
    {
366
300
        return (m_rev == EVMC_FRONTIER) ?
367
0
                   evmc::Result{EVMC_SUCCESS, result.gas_left, result.gas_refund, msg.recipient} :
368
300
                   evmc::Result{EVMC_FAILURE};
369
300
    }
370
371
80.3k
    if (!code.empty())
372
26.0k
    {
373
26.0k
        if (code[0] == 0xEF)
374
102
        {
375
102
            if (m_rev >= EVMC_EXPERIMENTAL)
376
0
            {
377
                // Only EOFCREATE/TXCREATE is allowed to deploy code starting with
378
                // EF. It must be valid EOF, which was validated before execution.
379
0
                if (msg.kind != EVMC_EOFCREATE)
380
0
                    return evmc::Result{EVMC_CONTRACT_VALIDATION_FAILURE};
381
0
                assert(validate_eof(m_rev, ContainerKind::runtime, code) ==
382
0
                       EOFValidationError::success);
383
0
            }
384
102
            else if (m_rev >= EVMC_LONDON)
385
84
            {
386
                // EIP-3541: Reject EF code.
387
84
                return evmc::Result{EVMC_CONTRACT_VALIDATION_FAILURE};
388
84
            }
389
102
        }
390
391
25.9k
        new_acc->code_hash = keccak256(code);
392
25.9k
        new_acc->code = code;
393
25.9k
        new_acc->code_changed = true;
394
25.9k
    }
395
396
80.2k
    return evmc::Result{result.status_code, gas_left, result.gas_refund, msg.recipient};
397
80.3k
}
398
399
evmc::Result Host::execute_message(const evmc_message& msg) noexcept
400
4.30M
{
401
4.30M
    if (msg.kind == EVMC_CREATE || 
msg.kind == EVMC_CREATE24.24M
||
msg.kind == EVMC_EOFCREATE4.21M
)
  MC/DC Decision Region (401:9) to (401:90)
+
+  Number of Conditions: 3
+     Condition C1 --> (401:9)
+     Condition C2 --> (401:36)
+     Condition C3 --> (401:64)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  F,  F  = F      }
+  2 { F,  T,  -  = T      }
+  3 { T,  -,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  C3-Pair: not covered
+  MC/DC Coverage for Expression: 66.67%
+
402
84.9k
        return create(msg);
403
404
4.21M
    if (msg.kind == EVMC_CALL)
405
4.03M
    {
406
4.03M
        const auto exists = m_state.find(msg.recipient) != nullptr;
407
4.03M
        if (!exists)
408
5.05k
            m_state.journal_create(msg.recipient, exists);
409
4.03M
    }
410
411
4.21M
    if (msg.kind == EVMC_CALL)
412
4.03M
    {
413
4.03M
        if (evmc::is_zero(msg.value))
414
3.91M
            m_state.touch(msg.recipient);
415
126k
        else
416
126k
        {
417
            // We skip touching if we send value, because account cannot end up empty.
418
            // It will either have value, or code that transfers this value out, or will be
419
            // selfdestructed anyway.
420
126k
            auto& dst_acc = m_state.get_or_insert(msg.recipient);
421
422
            // Transfer value: sender → recipient.
423
            // The sender's balance is already checked therefore the sender account must exist.
424
126k
            const auto value = intx::be::load<intx::uint256>(msg.value);
425
126k
            assert(m_state.get(msg.sender).balance >= value);
426
126k
            m_state.journal_balance_change(msg.sender, m_state.get(msg.sender).balance);
427
126k
            m_state.journal_balance_change(msg.recipient, dst_acc.balance);
428
126k
            m_state.get(msg.sender).balance -= value;
429
126k
            dst_acc.balance += value;
430
126k
        }
431
4.03M
    }
432
433
    // Calls to precompile address via EIP-7702 delegation execute empty code instead of precompile.
434
4.21M
    if ((msg.flags & EVMC_DELEGATED) == 0 && 
is_precompile(m_rev, msg.code_address)4.21M
)
  MC/DC Decision Region (434:9) to (434:84)
+
+  Number of Conditions: 2
+     Condition C1 --> (434:9)
+     Condition C2 --> (434:46)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
435
1.63M
        return call_precompile(m_rev, msg);
436
437
    // TODO: get_code() performs the account lookup. Add a way to get an account with code?
438
2.58M
    const auto code = m_state.get_code(msg.code_address);
439
2.58M
    if (code.empty())
440
114k
        return evmc::Result{EVMC_SUCCESS, msg.gas};  // Skip trivial execution.
441
442
2.46M
    return m_vm.execute(*this, m_rev, msg, code.data(), code.size());
443
2.58M
}
444
445
evmc::Result Host::call(const evmc_message& orig_msg) noexcept
446
4.30M
{
447
4.30M
    const auto msg = prepare_message(orig_msg);
448
4.30M
    if (!msg.has_value())
449
96
        return evmc::Result{EVMC_FAILURE, orig_msg.gas};  // Light exception.
450
451
4.30M
    const auto logs_checkpoint = m_logs.size();
452
4.30M
    const auto state_checkpoint = m_state.checkpoint();
453
454
4.30M
    auto result = execute_message(*msg);
455
456
4.30M
    if (result.status_code != EVMC_SUCCESS)
457
2.40M
    {
458
2.40M
        static constexpr auto addr_03 = 0x03_address;
459
2.40M
        auto* const acc_03 = m_state.find(addr_03);
460
2.40M
        const auto is_03_touched = acc_03 != nullptr && 
acc_03->erase_if_empty400k
;
  MC/DC Decision Region (460:36) to (460:79)
+
+  Number of Conditions: 2
+     Condition C1 --> (460:36)
+     Condition C2 --> (460:57)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
461
462
        // Revert.
463
2.40M
        m_state.rollback(state_checkpoint);
464
2.40M
        m_logs.resize(logs_checkpoint);
465
466
        // The 0x03 quirk: the touch on this address is never reverted.
467
2.40M
        if (is_03_touched && 
m_rev >= EVMC_SPURIOUS_DRAGON395k
)
  MC/DC Decision Region (467:13) to (467:59)
+
+  Number of Conditions: 2
+     Condition C1 --> (467:13)
+     Condition C2 --> (467:30)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  T  = T      }
+
+  C1-Pair: covered: (1,2)
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 50.00%
+
468
395k
            m_state.touch(addr_03);
469
2.40M
    }
470
4.30M
    return result;
471
4.30M
}
472
473
evmc_tx_context Host::get_tx_context() const noexcept
474
168k
{
475
    // TODO: The effective gas price is already computed in transaction validation.
476
    // TODO: The effective gas price calculation is broken for system calls (gas price 0).
477
168k
    assert(m_tx.max_gas_price >= m_block.base_fee || m_tx.max_gas_price == 0);
478
168k
    const auto priority_gas_price =
479
168k
        std::min(m_tx.max_priority_gas_price, m_tx.max_gas_price - m_block.base_fee);
480
168k
    const auto effective_gas_price = m_block.base_fee + priority_gas_price;
481
482
168k
    return evmc_tx_context{
483
168k
        intx::be::store<uint256be>(effective_gas_price),  // By EIP-1559.
484
168k
        m_tx.sender,
485
168k
        m_block.coinbase,
486
168k
        m_block.number,
487
168k
        m_block.timestamp,
488
168k
        m_block.gas_limit,
489
168k
        m_block.prev_randao,
490
168k
        0x01_bytes32,  // Chain ID is expected to be 1.
491
168k
        uint256be{m_block.base_fee},
492
168k
        intx::be::store<uint256be>(m_block.blob_base_fee.value_or(0)),
493
168k
        m_tx.blob_hashes.data(),
494
168k
        m_tx.blob_hashes.size(),
495
168k
        m_tx_initcodes.data(),
496
168k
        m_tx_initcodes.size(),
497
168k
    };
498
168k
}
499
500
bytes32 Host::get_block_hash(int64_t block_number) const noexcept
501
69.6k
{
502
69.6k
    return m_block_hashes.get_block_hash(block_number);
503
69.6k
}
504
505
void Host::emit_log(const address& addr, const uint8_t* data, size_t data_size,
506
    const bytes32 topics[], size_t topics_count) noexcept
507
28.8k
{
508
28.8k
    m_logs.push_back({addr, {data, data_size}, {topics, topics + topics_count}});
509
28.8k
}
510
511
evmc_access_status Host::access_account(const address& addr) noexcept
512
4.99M
{
513
4.99M
    if (m_rev < EVMC_BERLIN)
514
11.6k
        return EVMC_ACCESS_COLD;  // Ignore before Berlin.
515
516
4.98M
    auto& acc = m_state.get_or_insert(addr, {.erase_if_empty = true});
517
518
4.98M
    if (acc.access_status == EVMC_ACCESS_WARM || 
is_precompile(m_rev, addr)2.69M
)
  MC/DC Decision Region (518:9) to (518:76)
+
+  Number of Conditions: 2
+     Condition C1 --> (518:9)
+     Condition C2 --> (518:50)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
519
4.40M
        return EVMC_ACCESS_WARM;
520
521
583k
    m_state.journal_access_account(addr);
522
583k
    acc.access_status = EVMC_ACCESS_WARM;
523
583k
    return EVMC_ACCESS_COLD;
524
4.98M
}
525
526
evmc_access_status Host::access_storage(const address& addr, const bytes32& key) noexcept
527
5.41M
{
528
5.41M
    auto& storage_slot = m_state.get_storage(addr, key);
529
5.41M
    m_state.journal_storage_change(addr, key, storage_slot);
530
5.41M
    return std::exchange(storage_slot.access_status, EVMC_ACCESS_WARM);
531
5.41M
}
532
533
534
evmc::bytes32 Host::get_transient_storage(const address& addr, const bytes32& key) const noexcept
535
1.89M
{
536
1.89M
    const auto& acc = m_state.get(addr);
537
1.89M
    const auto it = acc.transient_storage.find(key);
538
1.89M
    return it != acc.transient_storage.end() ? 
it->second1.88M
:
bytes32{}1.61k
;
539
1.89M
}
540
541
void Host::set_transient_storage(
542
    const address& addr, const bytes32& key, const bytes32& value) noexcept
543
9.07M
{
544
9.07M
    auto& slot = m_state.get(addr).transient_storage[key];
545
9.07M
    m_state.journal_transient_storage_change(addr, key, slot);
546
9.07M
    slot = value;
547
9.07M
}
548
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/host.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/host.hpp.html new file mode 100644 index 0000000000..d65e5f95f7 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/host.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/host.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include "state.hpp"
8
#include "state_view.hpp"
9
#include <optional>
10
11
namespace evmone::state
12
{
13
using evmc::uint256be;
14
15
/// Computes the address of to-be-created contract with the CREATE scheme.
16
///
17
/// Computes the new account address for the contract creation context of the CREATE instruction
18
/// or a create transaction.
19
/// This is defined by 𝐀𝐃𝐃𝐑 in Yellow Paper, 7. Contract Creation, (88-90), the case for ζ = ∅.
20
///
21
/// @param sender        The address of the message sender. YP: 𝑠.
22
/// @param sender_nonce  The sender's nonce before the increase. YP: 𝑛.
23
/// @return              The address computed with the CREATE scheme.
24
[[nodiscard]] address compute_create_address(const address& sender, uint64_t sender_nonce) noexcept;
25
26
/// Computes the address of to-be-created contract with the CREATE2 scheme.
27
///
28
/// Computes the new account address for the contract creation context of the CREATE2 instruction.
29
///
30
/// @param sender        The address of the message sender.
31
/// @param salt          The salt.
32
/// @param init_code     The init_code to hash (initcode or initcontainer).
33
/// @return              The address computed with the scheme.
34
[[nodiscard]] address compute_create2_address(
35
    const address& sender, const bytes32& salt, bytes_view init_code) noexcept;
36
37
/// Computes the address of to-be-created contract with the EOFCREATE scheme.
38
///
39
/// Computes the new account address for the contract creation context of the EOFCREATE instruction.
40
///
41
/// @param sender        The address of the message sender.
42
/// @param salt          The salt.
43
/// @return              The address computed with the scheme.
44
[[nodiscard]] address compute_eofcreate_address(
45
    const address& sender, const bytes32& salt) noexcept;
46
47
class Host : public evmc::Host
48
{
49
    evmc_revision m_rev;
50
    evmc::VM& m_vm;
51
    State& m_state;
52
    const BlockInfo& m_block;
53
    const BlockHashes& m_block_hashes;
54
    const Transaction& m_tx;
55
    std::vector<Log> m_logs;
56
    std::vector<evmc_tx_initcode> m_tx_initcodes;
57
58
public:
59
    Host(evmc_revision rev, evmc::VM& vm, State& state, const BlockInfo& block,
60
        const BlockHashes& block_hashes, const Transaction& tx) noexcept
61
337k
      : m_rev{rev}, m_vm{vm}, m_state{state}, m_block{block}, m_block_hashes{block_hashes}, m_tx{tx}
62
337k
    {
63
337k
        if (tx.type == Transaction::Type::initcodes)
64
0
        {
65
0
            for (const auto& initcode : tx.initcodes)
66
0
            {
67
0
                const auto hash = keccak256({initcode.data(), initcode.size()});
68
0
                m_tx_initcodes.push_back({hash, initcode.data(), initcode.size()});
69
0
            }
70
0
        }
71
337k
    }
72
73
136k
    [[nodiscard]] std::vector<Log>&& take_logs() noexcept { return std::move(m_logs); }
74
75
    evmc::Result call(const evmc_message& msg) noexcept override;
76
77
private:
78
    [[nodiscard]] bool account_exists(const address& addr) const noexcept override;
79
80
    [[nodiscard]] bytes32 get_storage(
81
        const address& addr, const bytes32& key) const noexcept override;
82
83
    evmc_storage_status set_storage(
84
        const address& addr, const bytes32& key, const bytes32& value) noexcept override;
85
86
    [[nodiscard]] evmc::bytes32 get_transient_storage(
87
        const address& addr, const bytes32& key) const noexcept override;
88
89
    void set_transient_storage(
90
        const address& addr, const bytes32& key, const bytes32& value) noexcept override;
91
92
    [[nodiscard]] uint256be get_balance(const address& addr) const noexcept override;
93
94
    [[nodiscard]] size_t get_code_size(const address& addr) const noexcept override;
95
96
    [[nodiscard]] bytes32 get_code_hash(const address& addr) const noexcept override;
97
98
    size_t copy_code(const address& addr, size_t code_offset, uint8_t* buffer_data,
99
        size_t buffer_size) const noexcept override;
100
101
    bool selfdestruct(const address& addr, const address& beneficiary) noexcept override;
102
103
    evmc::Result create(const evmc_message& msg) noexcept;
104
105
    [[nodiscard]] evmc_tx_context get_tx_context() const noexcept override;
106
107
    [[nodiscard]] bytes32 get_block_hash(int64_t block_number) const noexcept override;
108
109
    void emit_log(const address& addr, const uint8_t* data, size_t data_size,
110
        const bytes32 topics[], size_t topics_count) noexcept override;
111
112
public:
113
    evmc_access_status access_account(const address& addr) noexcept override;
114
115
private:
116
    evmc_access_status access_storage(const address& addr, const bytes32& key) noexcept override;
117
118
    /// Prepares message for execution.
119
    ///
120
    /// This contains mostly checks and logic related to the sender
121
    /// which may finally be moved to EVM.
122
    /// Any state modification is not reverted.
123
    /// @return Modified message or std::nullopt in case of EVM exception.
124
    std::optional<evmc_message> prepare_message(evmc_message msg) noexcept;
125
126
    evmc::Result execute_message(const evmc_message& msg) noexcept;
127
};
128
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/mpt.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/mpt.cpp.html new file mode 100644 index 0000000000..929c897ff2 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/mpt.cpp.html @@ -0,0 +1,33 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/mpt.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "mpt.hpp"
6
#include "mpt_hash.hpp"
7
#include "rlp.hpp"
8
#include <algorithm>
9
#include <cassert>
10
11
namespace evmone::state
12
{
13
namespace
14
{
15
/// The MPT node kind.
16
enum class Kind : bool
17
{
18
    leaf,
19
    branch
20
};
21
22
/// The collection of nibbles (4-bit values) representing a path in a MPT.
23
///
24
/// TODO(c++26): This is an instance of std::inplace_vector.
25
class Path
26
{
27
    static constexpr size_t max_size = 64;
28
29
    size_t m_size = 0;  // TODO: Can be converted to uint8_t.
30
    uint8_t m_nibbles[max_size]{};
31
32
public:
33
    Path() = default;
34
35
    /// Constructs a path from a pair of iterators.
36
    Path(const uint8_t* first, const uint8_t* last) noexcept
37
34.3M
      : m_size(static_cast<size_t>(last - first))
38
34.3M
    {
39
34.3M
        assert(m_size <= std::size(m_nibbles));
40
34.3M
        std::copy(first, last, m_nibbles);
41
34.3M
    }
42
43
    /// Constructs a path from bytes - each byte will produce 2 nibbles in the path.
44
15.1M
    explicit Path(bytes_view key) noexcept : m_size{2 * key.size()}
45
15.1M
    {
46
15.1M
        assert(m_size <= std::size(m_nibbles) && "a keys must not be longer than 32 bytes");
47
15.1M
        size_t i = 0;
48
15.1M
        for (const auto b : key)
49
479M
        {
50
479M
            m_nibbles[i++] = b >> 4;
51
479M
            m_nibbles[i++] = b & 0x0f;
52
479M
        }
53
15.1M
    }
54
55
0
    [[nodiscard]] static constexpr size_t capacity() noexcept { return max_size; }
56
5.41M
    [[nodiscard]] bool empty() const noexcept { return m_size == 0; }
57
52.3M
    [[nodiscard]] const uint8_t* begin() const noexcept { return m_nibbles; }
58
93.9M
    [[nodiscard]] const uint8_t* end() const noexcept { return m_nibbles + m_size; }
59
60
    [[nodiscard]] bytes encode(Kind kind) const
61
20.5M
    {
62
20.5M
        if (kind == Kind::branch && 
m_size == 05.41M
)
  MC/DC Decision Region (62:13) to (62:48)
+
+  Number of Conditions: 2
+     Condition C1 --> (62:13)
+     Condition C2 --> (62:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
63
5.20M
            return {};
64
65
15.3M
        const auto kind_prefix = kind == Kind::leaf ? 
0x2015.1M
:
0x00208k
;
66
15.3M
        const auto has_odd_size = m_size % 2 != 0;
67
15.3M
        const auto nibble_prefix = has_odd_size ? 
(0x10 | m_nibbles[0])6.20M
:
0x009.15M
;
68
69
15.3M
        bytes encoded{static_cast<uint8_t>(kind_prefix | nibble_prefix)};
70
477M
        for (auto i = size_t{has_odd_size}; i < m_size; 
i += 2462M
)
71
462M
            encoded.push_back(static_cast<uint8_t>((m_nibbles[i] << 4) | m_nibbles[i + 1]));
72
15.3M
        return rlp::encode(encoded);
73
20.5M
    }
74
};
75
}  // namespace
76
77
/// The MPT Node.
78
class MPTNode
79
{
80
    Kind m_kind = Kind::leaf;
81
    Path m_path;
82
    bytes m_value;
83
    std::unique_ptr<MPTNode> m_children[16];
84
85
    /// Creates a branch node out of two children and an optional extended path.
86
    MPTNode(const Path& path, size_t idx1, MPTNode&& child1, size_t idx2, MPTNode&& child2) noexcept
87
5.41M
      : m_kind{Kind::branch}, m_path{path}
88
5.41M
    {
89
5.41M
        assert(idx1 != idx2);
90
5.41M
        assert(idx1 < std::size(m_children));
91
5.41M
        assert(idx2 < std::size(m_children));
92
93
5.41M
        m_children[idx1] = std::make_unique<MPTNode>(std::move(child1));
94
5.41M
        m_children[idx2] = std::make_unique<MPTNode>(std::move(child2));
95
5.41M
    }
96
97
public:
98
    /// Creates new leaf node.
99
15.1M
    MPTNode(const Path& path, bytes&& value) noexcept : m_path{path}, m_value{std::move(value)} {}
100
101
    void insert(const Path& path, bytes&& value);
102
103
    [[nodiscard]] bytes encode() const;
104
};
105
106
void MPTNode::insert(const Path& path, bytes&& value)  // NOLINT(misc-no-recursion)
107
23.4M
{
108
    // The insertion is all about branch nodes. In happy case we will find an empty slot
109
    // in an existing branch node. Otherwise, we need to create new branch node
110
    // (possibly with an extended path) and transform existing nodes around it.
111
112
    // Let's consider the following branch node with extended path "ab".
113
    //
114
    //     |
115
    //     |a ↙③
116
    //     |b
117
    //     |
118
    // [a|b|c|d]
119
    //  |     ②
120
    //  ①
121
    //
122
    // If the insert path prefix matches the "ab" we insert to one of the children:
123
    // - e.g. for "aba" insert into existing child ①,
124
    // - e.g. for "abd" create new leaf node ②.
125
    // If the insert path prefix doesn't match "ab" we split the extended path by
126
    // a new branch node of the "this" branch node and a new leaf node.
127
    // E.g. for "acd" insert new branch node "a" at ③ with:
128
    // - at "b" : the "this" branch node with empty extended path "",
129
    // - at "c" : the new leaf node with path "d".
130
131
23.4M
    const auto [this_idx_it, insert_idx_it] = std::ranges::mismatch(m_path, path);
132
133
    // insert_idx_it is always valid if requirements are fulfilled:
134
    // - if m_path is not shorter than path they must have mismatched nibbles,
135
    //   given the requirement of key uniqueness and not being a prefix if existing key,
136
    // - if m_path is shorter and matches the path prefix
137
    //   then insert_idx_it points at path[m_path.size()].
138
23.4M
    assert(insert_idx_it != path.end() && "a key must not be a prefix of another key");
139
23.4M
    const Path insert_tail{insert_idx_it + 1, path.end()};
140
141
23.4M
    if (m_kind == Kind::branch && 
this_idx_it == m_path.end()18.1M
) // Paths match: go into the child.
  MC/DC Decision Region (141:9) to (141:62)
+
+  Number of Conditions: 2
+     Condition C1 --> (141:9)
+     Condition C2 --> (141:35)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
142
18.0M
    {
143
18.0M
        if (auto& child = m_children[*insert_idx_it]; child)
144
10.5M
            child->insert(insert_tail, std::move(value));  // ①
145
7.48M
        else
146
7.48M
            child = std::make_unique<MPTNode>(insert_tail, std::move(value));  // ②
147
18.0M
    }
148
5.41M
    else  // ③: Shorten path of this node and insert it to the new branch node.
149
5.41M
    {
150
5.41M
        const auto this_idx = *this_idx_it;
151
5.41M
        const Path extended_path{m_path.begin(), this_idx_it};
152
5.41M
        const Path this_node_tail{this_idx_it + 1, m_path.end()};
153
5.41M
        auto this_node = std::move(*this);  // invalidates this_idx_it
154
5.41M
        this_node.m_path = this_node_tail;
155
5.41M
        *this = MPTNode(extended_path, this_idx, std::move(this_node), *insert_idx_it,
156
5.41M
            MPTNode{insert_tail, std::move(value)});
157
5.41M
    }
158
23.4M
}
159
160
161
bytes MPTNode::encode() const  // NOLINT(misc-no-recursion)
162
20.5M
{
163
20.5M
    static constexpr auto shorten = [](bytes&& b) {
164
18.5M
        return (b.size() < 32) ? 
std::move(b)3.21k
:
rlp::encode(keccak256(b))18.5M
;
165
18.5M
    };
166
167
20.5M
    bytes encoded;  // the encoded content of the node without its path
168
20.5M
    switch (m_kind)
169
20.5M
    {
170
15.1M
    case Kind::leaf:
171
15.1M
    {
172
15.1M
        encoded = rlp::encode(m_value);
173
15.1M
        break;
174
0
    }
175
5.41M
    case Kind::branch:
176
5.41M
    {
177
5.41M
        static constexpr uint8_t empty = 0x80;  // encoded empty child
178
179
5.41M
        for (const auto& child : m_children)
180
86.6M
            encoded += child ? 
shorten(child->encode())18.3M
:
bytes{empty}68.3M
;
181
5.41M
        encoded += empty;  // end indicator
182
183
5.41M
        if (!m_path.empty())  // extended node
184
208k
            encoded = shorten(rlp::internal::wrap_list(encoded));
185
5.41M
        break;
186
0
    }
187
20.5M
    }
188
20.5M
    return rlp::internal::wrap_list(m_path.encode(m_kind) + encoded);
189
20.5M
}
190
191
192
5.56M
MPT::MPT() noexcept = default;
193
5.56M
MPT::~MPT() noexcept = default;
194
195
void MPT::insert(bytes_view key, bytes&& value)
196
15.1M
{
197
15.1M
    assert(key.size() <= Path::capacity() / 2);  // must fit the path implementation length limit
198
15.1M
    const Path path{key};
199
200
15.1M
    if (m_root == nullptr)
201
2.25M
        m_root = std::make_unique<MPTNode>(path, std::move(value));
202
12.9M
    else
203
12.9M
        m_root->insert(path, std::move(value));
204
15.1M
}
205
206
[[nodiscard]] hash256 MPT::hash() const
207
5.56M
{
208
5.56M
    if (m_root == nullptr)
209
3.31M
        return EMPTY_MPT_HASH;
210
2.25M
    return keccak256(m_root->encode());
211
5.56M
}
212
213
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/mpt_hash.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/mpt_hash.cpp.html new file mode 100644 index 0000000000..600ac2629b --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/mpt_hash.cpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/mpt_hash.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "mpt_hash.hpp"
6
#include "block.hpp"
7
#include "mpt.hpp"
8
#include "rlp.hpp"
9
#include "test_state.hpp"
10
#include "transaction.hpp"
11
12
namespace evmone::state
13
{
14
namespace
15
{
16
hash256 mpt_hash(const std::map<bytes32, bytes32>& storage)
17
5.08M
{
18
5.08M
    MPT trie;
19
5.08M
    for (const auto& [key, value] : storage)
20
9.90M
    {
21
9.90M
        if (!is_zero(value))  // Skip "deleted" values.
22
9.90M
            trie.insert(keccak256(key), rlp::encode(rlp::trim(value)));
23
9.90M
    }
24
5.08M
    return trie.hash();
25
5.08M
}
26
}  // namespace
27
28
hash256 mpt_hash(const test::TestState& state)
29
264k
{
30
264k
    MPT trie;
31
264k
    for (const auto& [addr, acc] : state)
32
5.08M
    {
33
5.08M
        trie.insert(keccak256(addr),
34
5.08M
            rlp::encode_tuple(acc.nonce, acc.balance, mpt_hash(acc.storage), keccak256(acc.code)));
35
5.08M
    }
36
264k
    return trie.hash();
37
264k
}
38
39
template <typename T>
40
hash256 mpt_hash(std::span<const T> list)
41
216k
{
42
216k
    MPT trie;
43
381k
    for (size_t i = 0; i < list.size(); 
++i164k
)
44
164k
        trie.insert(rlp::encode(i), rlp::encode(list[i]));
45
46
216k
    return trie.hash();
47
216k
}
evmc::bytes32 evmone::state::mpt_hash<evmone::state::Transaction>(std::span<evmone::state::Transaction const, 18446744073709551615ul>)
Line
Count
Source
41
76.2k
{
42
76.2k
    MPT trie;
43
156k
    for (size_t i = 0; i < list.size(); 
++i80.0k
)
44
80.0k
        trie.insert(rlp::encode(i), rlp::encode(list[i]));
45
46
76.2k
    return trie.hash();
47
76.2k
}
evmc::bytes32 evmone::state::mpt_hash<evmone::state::TransactionReceipt>(std::span<evmone::state::TransactionReceipt const, 18446744073709551615ul>)
Line
Count
Source
41
76.2k
{
42
76.2k
    MPT trie;
43
156k
    for (size_t i = 0; i < list.size(); 
++i80.0k
)
44
80.0k
        trie.insert(rlp::encode(i), rlp::encode(list[i]));
45
46
76.2k
    return trie.hash();
47
76.2k
}
evmc::bytes32 evmone::state::mpt_hash<evmone::state::Withdrawal>(std::span<evmone::state::Withdrawal const, 18446744073709551615ul>)
Line
Count
Source
41
64.4k
{
42
64.4k
    MPT trie;
43
68.4k
    for (size_t i = 0; i < list.size(); 
++i4.02k
)
44
4.02k
        trie.insert(rlp::encode(i), rlp::encode(list[i]));
45
46
64.4k
    return trie.hash();
47
64.4k
}
48
49
template hash256 mpt_hash<Transaction>(std::span<const Transaction>);
50
template hash256 mpt_hash<TransactionReceipt>(std::span<const TransactionReceipt>);
51
template hash256 mpt_hash<Withdrawal>(std::span<const Withdrawal>);
52
53
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/mpt_hash.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/mpt_hash.hpp.html new file mode 100644 index 0000000000..095e179bc5 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/mpt_hash.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/mpt_hash.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include "hash_utils.hpp"
7
#include <span>
8
9
namespace evmone::test
10
{
11
class TestState;
12
}
13
14
namespace evmone::state
15
{
16
/// The hash of the empty Merkle Patricia Trie.
17
///
18
/// Specifically, this is the value of keccak256(RLP("")), i.e. keccak256({0x80}).
19
constexpr auto EMPTY_MPT_HASH =
20
    0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421_bytes32;
21
22
/// Computes Merkle Patricia Trie root hash for the given collection of state accounts.
23
hash256 mpt_hash(const test::TestState& state);
24
25
/// Computes Merkle Patricia Trie root hash for the given list of structures.
26
template <typename T>
27
hash256 mpt_hash(std::span<const T> list);
28
29
/// A helper to automatically convert collections (e.g. vector, array) to span.
30
template <typename T>
31
inline hash256 mpt_hash(const T& list)
32
    requires std::is_convertible_v<T, std::span<const typename T::value_type>>
33
216k
{
34
216k
    return mpt_hash(std::span<const typename T::value_type>{list});
35
216k
}
Unexecuted instantiation: evmc::bytes32 evmone::state::mpt_hash<std::array<evmone::state::Transaction, 1ul>>(std::array<evmone::state::Transaction, 1ul> const&) requires std::is_convertible_v<std::array<evmone::state::Transaction, 1ul>, std::span<std::array<evmone::state::Transaction, 1ul>::value_type const, 18446744073709551615ul>>
Unexecuted instantiation: evmc::bytes32 evmone::state::mpt_hash<std::array<evmone::state::TransactionReceipt, 2ul>>(std::array<evmone::state::TransactionReceipt, 2ul> const&) requires std::is_convertible_v<std::array<evmone::state::TransactionReceipt, 2ul>, std::span<std::array<evmone::state::TransactionReceipt, 2ul>::value_type const, 18446744073709551615ul>>
Unexecuted instantiation: evmc::bytes32 evmone::state::mpt_hash<std::array<evmone::state::TransactionReceipt, 3ul>>(std::array<evmone::state::TransactionReceipt, 3ul> const&) requires std::is_convertible_v<std::array<evmone::state::TransactionReceipt, 3ul>, std::span<std::array<evmone::state::TransactionReceipt, 3ul>::value_type const, 18446744073709551615ul>>
evmc::bytes32 evmone::state::mpt_hash<std::vector<evmone::state::Withdrawal, std::allocator<evmone::state::Withdrawal>>>(std::vector<evmone::state::Withdrawal, std::allocator<evmone::state::Withdrawal>> const&) requires std::is_convertible_v<std::vector<evmone::state::Withdrawal, std::allocator<evmone::state::Withdrawal>>, std::span<std::vector<evmone::state::Withdrawal, std::allocator<evmone::state::Withdrawal>>::value_type const, 18446744073709551615ul>>
Line
Count
Source
33
64.4k
{
34
64.4k
    return mpt_hash(std::span<const typename T::value_type>{list});
35
64.4k
}
evmc::bytes32 evmone::state::mpt_hash<std::vector<evmone::state::Transaction, std::allocator<evmone::state::Transaction>>>(std::vector<evmone::state::Transaction, std::allocator<evmone::state::Transaction>> const&) requires std::is_convertible_v<std::vector<evmone::state::Transaction, std::allocator<evmone::state::Transaction>>, std::span<std::vector<evmone::state::Transaction, std::allocator<evmone::state::Transaction>>::value_type const, 18446744073709551615ul>>
Line
Count
Source
33
76.2k
{
34
76.2k
    return mpt_hash(std::span<const typename T::value_type>{list});
35
76.2k
}
evmc::bytes32 evmone::state::mpt_hash<std::vector<evmone::state::TransactionReceipt, std::allocator<evmone::state::TransactionReceipt>>>(std::vector<evmone::state::TransactionReceipt, std::allocator<evmone::state::TransactionReceipt>> const&) requires std::is_convertible_v<std::vector<evmone::state::TransactionReceipt, std::allocator<evmone::state::TransactionReceipt>>, std::span<std::vector<evmone::state::TransactionReceipt, std::allocator<evmone::state::TransactionReceipt>>::value_type const, 18446744073709551615ul>>
Line
Count
Source
33
76.2k
{
34
76.2k
    return mpt_hash(std::span<const typename T::value_type>{list});
35
76.2k
}
36
37
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/precompiles.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/precompiles.cpp.html new file mode 100644 index 0000000000..10a3e2fff3 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/precompiles.cpp.html @@ -0,0 +1,131 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/precompiles.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "precompiles.hpp"
6
#include "../utils/stdx/utility.hpp"
7
#include "evmone_precompiles/secp256r1.hpp"
8
#include "precompiles_internal.hpp"
9
#include "precompiles_stubs.hpp"
10
#include <evmone_precompiles/blake2b.hpp>
11
#include <evmone_precompiles/bls.hpp>
12
#include <evmone_precompiles/bn254.hpp>
13
#include <evmone_precompiles/kzg.hpp>
14
#include <evmone_precompiles/modexp.hpp>
15
#include <evmone_precompiles/ripemd160.hpp>
16
#include <evmone_precompiles/secp256k1.hpp>
17
#include <evmone_precompiles/sha256.hpp>
18
#include <intx/intx.hpp>
19
#include <array>
20
#include <bit>
21
#include <cassert>
22
#include <limits>
23
#include <span>
24
25
#ifdef EVMONE_PRECOMPILES_GMP
26
#include "precompiles_gmp.hpp"
27
#endif
28
29
namespace evmone::state
30
{
31
using evmc::bytes;
32
using evmc::bytes_view;
33
using namespace evmc::literals;
34
35
namespace
36
{
37
constexpr auto GasCostMax = std::numeric_limits<int64_t>::max();
38
39
constexpr auto MODEXP_LEN_LIMIT_EIP7823 = 1024;
40
41
constexpr auto BLS12_SCALAR_SIZE = 32;
42
constexpr auto BLS12_FIELD_ELEMENT_SIZE = 64;
43
constexpr auto BLS12_G1_POINT_SIZE = 2 * BLS12_FIELD_ELEMENT_SIZE;
44
constexpr auto BLS12_G2_POINT_SIZE = 4 * BLS12_FIELD_ELEMENT_SIZE;
45
constexpr auto BLS12_G1_MUL_INPUT_SIZE = BLS12_G1_POINT_SIZE + BLS12_SCALAR_SIZE;
46
constexpr auto BLS12_G2_MUL_INPUT_SIZE = BLS12_G2_POINT_SIZE + BLS12_SCALAR_SIZE;
47
48
constexpr int64_t num_words(size_t size_in_bytes) noexcept
49
1.20M
{
50
1.20M
    return static_cast<int64_t>((size_in_bytes + 31) / 32);
51
1.20M
}
52
53
template <int BaseCost, int WordCost>
54
constexpr int64_t cost_per_input_word(size_t input_size) noexcept
55
1.20M
{
56
1.20M
    return BaseCost + WordCost * num_words(input_size);
57
1.20M
}
precompiles.cpp:long evmone::state::(anonymous namespace)::cost_per_input_word<60, 12>(unsigned long)
Line
Count
Source
55
20.4k
{
56
20.4k
    return BaseCost + WordCost * num_words(input_size);
57
20.4k
}
precompiles.cpp:long evmone::state::(anonymous namespace)::cost_per_input_word<600, 120>(unsigned long)
Line
Count
Source
55
394k
{
56
394k
    return BaseCost + WordCost * num_words(input_size);
57
394k
}
precompiles.cpp:long evmone::state::(anonymous namespace)::cost_per_input_word<15, 3>(unsigned long)
Line
Count
Source
55
792k
{
56
792k
    return BaseCost + WordCost * num_words(input_size);
57
792k
}
58
}  // namespace
59
60
PrecompileAnalysis ecrecover_analyze(bytes_view /*input*/, evmc_revision /*rev*/) noexcept
61
402k
{
62
402k
    return {3000, 32};
63
402k
}
64
65
PrecompileAnalysis sha256_analyze(bytes_view input, evmc_revision /*rev*/) noexcept
66
20.4k
{
67
20.4k
    return {cost_per_input_word<60, 12>(input.size()), 32};
68
20.4k
}
69
70
PrecompileAnalysis ripemd160_analyze(bytes_view input, evmc_revision /*rev*/) noexcept
71
394k
{
72
394k
    return {cost_per_input_word<600, 120>(input.size()), 32};
73
394k
}
74
75
PrecompileAnalysis identity_analyze(bytes_view input, evmc_revision /*rev*/) noexcept
76
792k
{
77
792k
    return {cost_per_input_word<15, 3>(input.size()), input.size()};
78
792k
}
79
80
PrecompileAnalysis ecadd_analyze(bytes_view /*input*/, evmc_revision rev) noexcept
81
2.93k
{
82
2.93k
    return {rev >= EVMC_ISTANBUL ? 150 : 
5000
, 64};
83
2.93k
}
84
85
PrecompileAnalysis ecmul_analyze(bytes_view /*input*/, evmc_revision rev) noexcept
86
6.45k
{
87
6.45k
    return {rev >= EVMC_ISTANBUL ? 6000 : 
400000
, 64};
88
6.45k
}
89
90
PrecompileAnalysis ecpairing_analyze(bytes_view input, evmc_revision rev) noexcept
91
2.09k
{
92
2.09k
    const auto base_cost = (rev >= EVMC_ISTANBUL) ? 45000 : 
1000000
;
93
2.09k
    const auto element_cost = (rev >= EVMC_ISTANBUL) ? 34000 : 
800000
;
94
2.09k
    const auto num_elements = static_cast<int64_t>(input.size() / 192);
95
2.09k
    return {base_cost + num_elements * element_cost, 32};
96
2.09k
}
97
98
PrecompileAnalysis blake2bf_analyze(bytes_view input, evmc_revision) noexcept
99
2.12k
{
100
    // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage)
101
2.12k
    return {input.size() == 213 ? 
intx::be::unsafe::load<uint32_t>(input.data())1.28k
:
GasCostMax848
, 64};
102
2.12k
}
103
104
PrecompileAnalysis expmod_analyze(bytes_view input, evmc_revision rev) noexcept
105
4.22k
{
106
4.22k
    using namespace intx;
107
108
4.22k
    const auto calc_adjusted_exp_len = [input, rev](size_t offset, uint32_t len) noexcept {
109
3.99k
        const auto head_len = std::min(size_t{len}, size_t{32});
110
3.99k
        const auto head_explicit_bytes =
111
3.99k
            offset < input.size() ?
112
3.43k
                input.substr(offset, std::min(head_len, input.size() - offset)) :
113
3.99k
                
bytes_view{}558
;
114
115
3.99k
        const auto top_byte_index = head_explicit_bytes.find_first_not_of(uint8_t{0});
116
3.99k
        const auto exp_bit_width =
117
3.99k
            (top_byte_index != bytes_view::npos) ?
118
2.52k
                8 * (head_len - top_byte_index - 1) +
119
2.52k
                    static_cast<unsigned>(std::bit_width(head_explicit_bytes[top_byte_index])) :
120
3.99k
                
01.46k
;
121
122
3.99k
        const auto tail_len = len - head_len;
123
3.99k
        const auto head_bits = std::max(exp_bit_width, size_t{1}) - 1;
124
3.99k
        const uint64_t factor = rev < EVMC_OSAKA ? 
83.46k
:
16528
;
125
3.99k
        return std::max(factor * uint64_t{tail_len} + uint64_t{head_bits}, uint64_t{1});
126
3.99k
    };
127
128
4.22k
    static constexpr auto calc_mult_complexity_eip7883 = [](uint32_t max_len) noexcept {
129
        // With EIP-7823 the computation never overflows.
130
528
        assert(max_len <= MODEXP_LEN_LIMIT_EIP7823);
131
528
        const auto num_words = (max_len + 7) / 8;
132
528
        const auto mult_complexity = max_len <= 32 ? 
16386
:
num_words * num_words * 2142
;
133
528
        return uint64_t{mult_complexity};
134
528
    };
135
4.22k
    static constexpr auto calc_mult_complexity_eip2565 = [](uint32_t max_len) noexcept {
136
3.37k
        const auto num_words = (uint64_t{max_len} + 7) / 8;
137
3.37k
        return num_words * num_words;  // max value: 0x04000000'00000000
138
3.37k
    };
139
4.22k
    static constexpr auto calc_mult_complexity_eip198 = [](uint32_t max_len) noexcept {
140
90
        const auto max_len_squared = uint64_t{max_len} * max_len;
141
90
        if (max_len <= 64)
142
90
            return max_len_squared;
143
0
        if (max_len <= 1024)
144
0
            return max_len_squared / 4 + 96 * max_len - 3072;
145
        // max value: 0x100001df'dffcf220
146
0
        return max_len_squared / 16 + 480 * uint64_t{max_len} - 199680;
147
0
    };
148
149
4.22k
    struct Params
150
4.22k
    {
151
4.22k
        int64_t min_gas;
152
4.22k
        unsigned final_divisor;
153
4.22k
        uint64_t (*calc_mult_complexity)(uint32_t max_len) noexcept;
154
4.22k
    };
155
4.22k
    const auto& [min_gas, final_divisor, calc_mult_complexity] = [rev]() noexcept -> Params {
156
4.22k
        if (rev >= EVMC_OSAKA)
157
594
            return {500, 1, calc_mult_complexity_eip7883};
158
3.63k
        else if (rev >= EVMC_BERLIN)
159
3.53k
            return {200, 3, calc_mult_complexity_eip2565};
160
96
        else  // Byzantium
161
96
            return {0, 20, calc_mult_complexity_eip198};
162
4.22k
    }();
163
164
4.22k
    static constexpr size_t INPUT_HEADER_REQUIRED_SIZE = 3 * sizeof(uint256);
165
4.22k
    uint8_t input_header[INPUT_HEADER_REQUIRED_SIZE]{};
166
    // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage)
167
4.22k
    std::copy_n(input.data(), std::min(input.size(), INPUT_HEADER_REQUIRED_SIZE), input_header);
168
169
4.22k
    const auto base_len256 = be::unsafe::load<uint256>(&input_header[0]);
170
4.22k
    const auto exp_len256 = be::unsafe::load<uint256>(&input_header[32]);
171
4.22k
    const auto mod_len256 = be::unsafe::load<uint256>(&input_header[64]);
172
173
    // Check the declared input lengths against the practical (2**32)
174
    // or specified (EIP-7823: 2**10) limits.
175
4.22k
    const auto len_limit =
176
4.22k
        rev < EVMC_OSAKA ? 
std::numeric_limits<uint32_t>::max()3.63k
:
MODEXP_LEN_LIMIT_EIP7823594
;
177
4.22k
    if (base_len256 > len_limit || 
mod_len256 > len_limit4.12k
)
  MC/DC Decision Region (177:9) to (177:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (177:9)
+     Condition C2 --> (177:36)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
178
158
        return {GasCostMax, 0};
179
180
4.07k
    if (exp_len256 > len_limit)
181
78
    {
182
        // Before EIP-7823, the big exponent may be canceled with zero multiplication complexity.
183
78
        if (rev < EVMC_OSAKA && 
base_len256 == 064
&&
mod_len256 == 032
)
  MC/DC Decision Region (183:13) to (183:68)
+
+  Number of Conditions: 3
+     Condition C1 --> (183:13)
+     Condition C2 --> (183:33)
+     Condition C3 --> (183:53)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  F,  -  = F      }
+  3 { T,  T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  C3-Pair: not covered
+  MC/DC Coverage for Expression: 66.67%
+
184
32
            return {min_gas, 0};
185
46
        return {GasCostMax, 0};
186
78
    }
187
188
3.99k
    const auto base_len = static_cast<uint32_t>(base_len256);
189
3.99k
    const auto exp_len = static_cast<uint32_t>(exp_len256);
190
3.99k
    const auto mod_len = static_cast<uint32_t>(mod_len256);
191
192
3.99k
    const auto adjusted_exp_len = calc_adjusted_exp_len(sizeof(input_header) + base_len, exp_len);
193
3.99k
    const auto max_len = std::max(mod_len, base_len);
194
3.99k
    const auto gas = umul(calc_mult_complexity(max_len), adjusted_exp_len) / final_divisor;
195
3.99k
    const auto gas_clamped = std::clamp<uint128>(gas, min_gas, GasCostMax);
196
3.99k
    return {static_cast<int64_t>(gas_clamped), mod_len};
197
4.07k
}
198
199
PrecompileAnalysis point_evaluation_analyze(bytes_view, evmc_revision) noexcept
200
1.31k
{
201
1.31k
    static constexpr auto POINT_EVALUATION_PRECOMPILE_GAS = 50000;
202
1.31k
    return {POINT_EVALUATION_PRECOMPILE_GAS, 64};
203
1.31k
}
204
205
PrecompileAnalysis bls12_g1add_analyze(bytes_view, evmc_revision) noexcept
206
532
{
207
532
    static constexpr auto BLS12_G1ADD_PRECOMPILE_GAS = 375;
208
532
    return {BLS12_G1ADD_PRECOMPILE_GAS, BLS12_G1_POINT_SIZE};
209
532
}
210
211
PrecompileAnalysis bls12_g1msm_analyze(bytes_view input, evmc_revision) noexcept
212
3.42k
{
213
3.42k
    static constexpr auto G1MUL_GAS_COST = 12000;
214
3.42k
    static constexpr uint16_t DISCOUNTS[] = {1000, 949, 848, 797, 764, 750, 738, 728, 719, 712, 705,
215
3.42k
        698, 692, 687, 682, 677, 673, 669, 665, 661, 658, 654, 651, 648, 645, 642, 640, 637, 635,
216
3.42k
        632, 630, 627, 625, 623, 621, 619, 617, 615, 613, 611, 609, 608, 606, 604, 603, 601, 599,
217
3.42k
        598, 596, 595, 593, 592, 591, 589, 588, 586, 585, 584, 582, 581, 580, 579, 577, 576, 575,
218
3.42k
        574, 573, 572, 570, 569, 568, 567, 566, 565, 564, 563, 562, 561, 560, 559, 558, 557, 556,
219
3.42k
        555, 554, 553, 552, 551, 550, 549, 548, 547, 547, 546, 545, 544, 543, 542, 541, 540, 540,
220
3.42k
        539, 538, 537, 536, 536, 535, 534, 533, 532, 532, 531, 530, 529, 528, 528, 527, 526, 525,
221
3.42k
        525, 524, 523, 522, 522, 521, 520, 520, 519};
222
223
3.42k
    if (input.empty() || 
input.size() % BLS12_G1_MUL_INPUT_SIZE != 03.30k
)
  MC/DC Decision Region (223:9) to (223:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (223:9)
+     Condition C2 --> (223:26)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
224
1.31k
        return {GasCostMax, 0};
225
226
2.10k
    const auto k = input.size() / BLS12_G1_MUL_INPUT_SIZE;
227
2.10k
    assert(k > 0);
228
2.10k
    const auto discount = DISCOUNTS[std::min(k, std::size(DISCOUNTS)) - 1];
229
2.10k
    const auto cost = (G1MUL_GAS_COST * discount * static_cast<int64_t>(k)) / 1000;
230
2.10k
    return {cost, BLS12_G1_POINT_SIZE};
231
3.42k
}
232
233
PrecompileAnalysis bls12_g2add_analyze(bytes_view, evmc_revision) noexcept
234
556
{
235
556
    static constexpr auto BLS12_G2ADD_PRECOMPILE_GAS = 600;
236
556
    return {BLS12_G2ADD_PRECOMPILE_GAS, BLS12_G2_POINT_SIZE};
237
556
}
238
239
PrecompileAnalysis bls12_g2msm_analyze(bytes_view input, evmc_revision) noexcept
240
3.44k
{
241
3.44k
    static constexpr auto G2MUL_GAS_COST = 22500;
242
3.44k
    static constexpr uint16_t DISCOUNTS[] = {1000, 1000, 923, 884, 855, 832, 812, 796, 782, 770,
243
3.44k
        759, 749, 740, 732, 724, 717, 711, 704, 699, 693, 688, 683, 679, 674, 670, 666, 663, 659,
244
3.44k
        655, 652, 649, 646, 643, 640, 637, 634, 632, 629, 627, 624, 622, 620, 618, 615, 613, 611,
245
3.44k
        609, 607, 606, 604, 602, 600, 598, 597, 595, 593, 592, 590, 589, 587, 586, 584, 583, 582,
246
3.44k
        580, 579, 578, 576, 575, 574, 573, 571, 570, 569, 568, 567, 566, 565, 563, 562, 561, 560,
247
3.44k
        559, 558, 557, 556, 555, 554, 553, 552, 552, 551, 550, 549, 548, 547, 546, 545, 545, 544,
248
3.44k
        543, 542, 541, 541, 540, 539, 538, 537, 537, 536, 535, 535, 534, 533, 532, 532, 531, 530,
249
3.44k
        530, 529, 528, 528, 527, 526, 526, 525, 524, 524};
250
251
3.44k
    if (input.empty() || 
input.size() % BLS12_G2_MUL_INPUT_SIZE != 03.32k
)
  MC/DC Decision Region (251:9) to (251:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (251:9)
+     Condition C2 --> (251:26)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
252
1.31k
        return {GasCostMax, 0};
253
254
2.13k
    const auto k = input.size() / BLS12_G2_MUL_INPUT_SIZE;
255
2.13k
    assert(k > 0);
256
2.13k
    const auto discount = DISCOUNTS[std::min(k, std::size(DISCOUNTS)) - 1];
257
2.13k
    const auto cost = (G2MUL_GAS_COST * discount * static_cast<int64_t>(k)) / 1000;
258
2.13k
    return {cost, BLS12_G2_POINT_SIZE};
259
3.44k
}
260
261
PrecompileAnalysis bls12_pairing_check_analyze(bytes_view input, evmc_revision) noexcept
262
844
{
263
844
    static constexpr auto PAIR_SIZE = BLS12_G1_POINT_SIZE + BLS12_G2_POINT_SIZE;
264
265
844
    if (input.empty() || 
input.size() % PAIR_SIZE != 0732
)
  MC/DC Decision Region (265:9) to (265:55)
+
+  Number of Conditions: 2
+     Condition C1 --> (265:9)
+     Condition C2 --> (265:26)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
266
344
        return {GasCostMax, 0};
267
268
500
    const auto npairs = static_cast<int64_t>(input.size()) / PAIR_SIZE;
269
270
500
    static constexpr auto BLS12_PAIRING_CHECK_BASE_FEE_PRECOMPILE_GAS = 37700;
271
500
    static constexpr auto BLS12_PAIRING_CHECK_FEE_PRECOMPILE_GAS = 32600;
272
500
    return {BLS12_PAIRING_CHECK_BASE_FEE_PRECOMPILE_GAS +
273
500
                BLS12_PAIRING_CHECK_FEE_PRECOMPILE_GAS * npairs,
274
500
        32};
275
844
}
276
277
PrecompileAnalysis bls12_map_fp_to_g1_analyze(bytes_view, evmc_revision) noexcept
278
328
{
279
328
    static constexpr auto BLS12_MAP_FP_TO_G1_PRECOMPILE_GAS = 5500;
280
328
    return {BLS12_MAP_FP_TO_G1_PRECOMPILE_GAS, BLS12_G1_POINT_SIZE};
281
328
}
282
283
PrecompileAnalysis bls12_map_fp2_to_g2_analyze(bytes_view, evmc_revision) noexcept
284
316
{
285
316
    static constexpr auto BLS12_MAP_FP2_TO_G2_PRECOMPILE_GAS = 23800;
286
316
    return {BLS12_MAP_FP2_TO_G2_PRECOMPILE_GAS, BLS12_G2_POINT_SIZE};
287
316
}
288
289
static PrecompileAnalysis p256verify_analyze(bytes_view, evmc_revision) noexcept
290
734
{
291
734
    return {6900, 32};
292
734
}
293
294
ExecutionResult ecrecover_execute(const uint8_t* input, size_t input_size, uint8_t* output,
295
    [[maybe_unused]] size_t output_size) noexcept
296
2.04k
{
297
2.04k
    assert(output_size >= 32);
298
299
2.04k
    uint8_t input_buffer[128]{};
300
2.04k
    if (input_size != 0)
301
1.71k
        std::memcpy(input_buffer, input, std::min(input_size, std::size(input_buffer)));
302
303
2.04k
    ethash::hash256 h{};
304
2.04k
    std::memcpy(h.bytes, input_buffer, sizeof(h));
305
306
2.04k
    const auto v = intx::be::unsafe::load<intx::uint256>(input_buffer + 32);
307
2.04k
    if (v != 27 && 
v != 281.42k
)
  MC/DC Decision Region (307:9) to (307:27)
+
+  Number of Conditions: 2
+     Condition C1 --> (307:9)
+     Condition C2 --> (307:20)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
308
1.09k
        return {EVMC_SUCCESS, 0};
309
952
    const bool parity = v == 28;
310
311
952
    const auto r = intx::be::unsafe::load<intx::uint256>(input_buffer + 64);
312
952
    const auto s = intx::be::unsafe::load<intx::uint256>(input_buffer + 96);
313
314
952
    const auto res = evmmax::secp256k1::ecrecover(h, r, s, parity);
315
952
    if (res)
316
676
    {
317
676
        std::memset(output, 0, 12);
318
676
        std::memcpy(output + 12, res->bytes, 20);
319
676
        return {EVMC_SUCCESS, 32};
320
676
    }
321
276
    else
322
276
        return {EVMC_SUCCESS, 0};
323
952
}
324
325
ExecutionResult sha256_execute(const uint8_t* input, size_t input_size, uint8_t* output,
326
    [[maybe_unused]] size_t output_size) noexcept
327
20.4k
{
328
20.4k
    assert(output_size >= 32);
329
20.4k
    crypto::sha256(reinterpret_cast<std::byte*>(output), reinterpret_cast<const std::byte*>(input),
330
20.4k
        input_size);
331
20.4k
    return {EVMC_SUCCESS, 32};
332
20.4k
}
333
334
ExecutionResult ripemd160_execute(const uint8_t* input, size_t input_size, uint8_t* output,
335
    [[maybe_unused]] size_t output_size) noexcept
336
568
{
337
568
    assert(output_size >= 32);
338
568
    output = std::fill_n(output, 12, std::uint8_t{0});
339
568
    crypto::ripemd160(reinterpret_cast<std::byte*>(output),
340
568
        reinterpret_cast<const std::byte*>(input), input_size);
341
568
    return {EVMC_SUCCESS, 32};
342
568
}
343
344
static std::tuple<std::span<const uint8_t>, std::span<const uint8_t>, std::span<const uint8_t>>
345
expmod_parse_input(
346
    const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept
347
3.98k
{
348
3.98k
    static constexpr auto LEN_SIZE = sizeof(intx::uint256);
349
3.98k
    static constexpr auto HEADER_SIZE = 3 * LEN_SIZE;
350
3.98k
    static constexpr auto LEN32_OFF = LEN_SIZE - sizeof(uint32_t);
351
352
    // The output size equal to the modulus size.
353
3.98k
    const auto mod_len = output_size;
354
355
    // Handle short incomplete input up front. The answer is 0 of the length of the modulus.
356
3.98k
    if (input_size <= HEADER_SIZE) [[unlikely]]
357
524
    {
358
524
        std::fill_n(output, output_size, 0);
359
524
        return {};
360
524
    }
361
362
3.46k
    const auto base_len = intx::be::unsafe::load<uint32_t>(&input[LEN32_OFF]);
363
3.46k
    const auto exp_len = intx::be::unsafe::load<uint32_t>(&input[LEN_SIZE + LEN32_OFF]);
364
3.46k
    assert(intx::be::unsafe::load<uint32_t>(&input[2 * LEN_SIZE + LEN32_OFF]) == mod_len);
365
366
3.46k
    const size_t mod_off = base_len + exp_len;  // Cannot overflow if gas cost computed before.
367
3.46k
    const size_t payload_max_size = mod_off + mod_len;  // Input may contain extra bytes.
368
3.46k
    const std::span payload{
369
3.46k
        input + HEADER_SIZE, std::min(input_size - HEADER_SIZE, payload_max_size)};
370
3.46k
    const auto mod_explicit = payload.subspan(std::min(mod_off, payload.size()));
371
372
    // Handle the mod being zero early.
373
    // This serves two purposes:
374
    // - bigint libraries don't like such a modulus because division by 0 is not well-defined,
375
    // - having non-zero modulus guarantees that base and exp aren't out-of-bounds.
376
34.1k
    if (
std::ranges::all_of(mod_explicit, [](uint8_t b) 3.46k
{ return b == 0; })) [[unlikely]]
377
552
    {
378
        // The modulus is zero, so the result is zero.
379
552
        std::fill_n(output, output_size, 0);
380
552
        return {};
381
552
    }
382
383
2.91k
    const auto mod_requires_padding = mod_explicit.size() != mod_len;
384
2.91k
    if (mod_requires_padding) [[unlikely]]
385
100
    {
386
        // The modulus is the last argument, and some of its bytes may be missing and be implicitly
387
        // zero. In this case, copy the explicit modulus bytes to the output buffer and pad the rest
388
        // with zeroes. The output buffer is guaranteed to have exactly the modulus size.
389
100
        const auto [_, output_p] = std::ranges::copy(mod_explicit, output);
390
100
        std::fill(output_p, output + output_size, 0);
391
100
    }
392
393
2.91k
    const auto base = payload.subspan(0, base_len);
394
2.91k
    const auto exp = payload.subspan(base_len, exp_len);
395
2.91k
    const auto mod = mod_requires_padding ? 
std::span{output, mod_len}100
:
mod_explicit2.81k
;
396
397
2.91k
    return {base, exp, mod};
398
3.46k
}
399
400
ExecutionResult expmod_execute(
401
    const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept
402
3.98k
{
403
3.98k
    const auto [base, exp, mod] = expmod_parse_input(input, input_size, output, output_size);
404
3.98k
    if (mod.empty())
405
1.07k
        return {EVMC_SUCCESS, output_size};
406
407
2.91k
    if (std::max(base.size(), mod.size()) <= MODEXP_LEN_LIMIT_EIP7823)
408
2.90k
    {
409
2.90k
        crypto::modexp(base, exp, mod, output);
410
2.90k
        return {EVMC_SUCCESS, output_size};
411
2.90k
    }
412
413
#ifdef EVMONE_PRECOMPILES_GMP
414
    expmod_gmp(base, exp, mod, output);
415
#else
416
1
    expmod_stub(base, exp, mod, output);
417
1
#endif
418
1
    return {EVMC_SUCCESS, mod.size()};
419
2.91k
}
420
421
#ifdef EVMONE_PRECOMPILES_GMP
422
ExecutionResult expmod_execute_gmp(
423
    const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept
424
{
425
    const auto [base, exp, mod] = expmod_parse_input(input, input_size, output, output_size);
426
    if (mod.empty())
427
        return {EVMC_SUCCESS, output_size};
428
429
    expmod_gmp(base, exp, mod, output);
430
    return {EVMC_SUCCESS, mod.size()};
431
}
432
#endif
433
434
ExecutionResult ecadd_execute(const uint8_t* input, size_t input_size, uint8_t* output,
435
    [[maybe_unused]] size_t output_size) noexcept
436
2.92k
{
437
2.92k
    assert(output_size >= 64);
438
439
2.92k
    uint8_t input_buffer[128]{};
440
2.92k
    if (input_size != 0)
441
2.63k
        std::memcpy(input_buffer, input, std::min(input_size, std::size(input_buffer)));
442
443
2.92k
    const auto input_span = std::span{input_buffer};
444
445
2.92k
    using namespace evmmax::bn254;
446
447
2.92k
    const auto p = AffinePoint::from_bytes(input_span.subspan<0, 64>());
448
2.92k
    const auto q = AffinePoint::from_bytes(input_span.subspan<64, 64>());
449
450
2.92k
    if (validate(p) && 
validate(q)2.66k
)
  MC/DC Decision Region (450:9) to (450:35)
+
+  Number of Conditions: 2
+     Condition C1 --> (450:9)
+     Condition C2 --> (450:24)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
451
2.59k
    {
452
2.59k
        const auto res = evmmax::ecc::add(p, q);
453
2.59k
        const std::span<uint8_t, 64> output_span{output, 64};
454
2.59k
        res.to_bytes(output_span);
455
2.59k
        return {EVMC_SUCCESS, output_span.size()};
456
2.59k
    }
457
332
    else
458
332
        return {EVMC_PRECOMPILE_FAILURE, 0};
459
2.92k
}
460
461
ExecutionResult ecmul_execute(const uint8_t* input, size_t input_size, uint8_t* output,
462
    [[maybe_unused]] size_t output_size) noexcept
463
6.44k
{
464
6.44k
    assert(output_size >= 64);
465
466
6.44k
    uint8_t input_buffer[96]{};
467
6.44k
    if (input_size != 0)
468
6.14k
        std::memcpy(input_buffer, input, std::min(input_size, std::size(input_buffer)));
469
470
6.44k
    const auto input_span = std::span{input_buffer};
471
472
6.44k
    using namespace evmmax::bn254;
473
474
6.44k
    const auto p = AffinePoint::from_bytes(input_span.subspan<0, 64>());
475
6.44k
    const auto c = intx::be::unsafe::load<intx::uint256>(input_buffer + 64);
476
477
6.44k
    if (validate(p))
478
4.60k
    {
479
4.60k
        const auto res = evmmax::bn254::mul(p, c);
480
4.60k
        const std::span<uint8_t, 64> output_span{output, 64};
481
4.60k
        res.to_bytes(output_span);
482
4.60k
        return {EVMC_SUCCESS, output_span.size()};
483
4.60k
    }
484
1.83k
    else
485
1.83k
        return {EVMC_PRECOMPILE_FAILURE, 0};
486
6.44k
}
487
488
ExecutionResult ecpairing_execute(const uint8_t* input, size_t input_size, uint8_t* output,
489
    [[maybe_unused]] size_t output_size) noexcept
490
1.74k
{
491
1.74k
    static constexpr auto OUTPUT_SIZE = 32;
492
1.74k
    static constexpr size_t PAIR_SIZE = 192;
493
1.74k
    assert(output_size >= OUTPUT_SIZE);
494
495
1.74k
    if (input_size % PAIR_SIZE != 0)
496
142
        return {EVMC_PRECOMPILE_FAILURE, 0};
497
498
1.59k
    std::vector<std::pair<evmmax::bn254::Point, evmmax::bn254::ExtPoint>> pairs;
499
1.59k
    pairs.reserve(input_size / PAIR_SIZE);
500
4.44k
    for (auto input_ptr = input; input_ptr != input + input_size; 
input_ptr += PAIR_SIZE2.84k
)
501
2.84k
    {
502
2.84k
        const evmmax::bn254::Point p{
503
2.84k
            intx::be::unsafe::load<intx::uint256>(input_ptr),
504
2.84k
            intx::be::unsafe::load<intx::uint256>(input_ptr + 32),
505
2.84k
        };
506
2.84k
        const evmmax::bn254::ExtPoint q{
507
2.84k
            {intx::be::unsafe::load<intx::uint256>(input_ptr + 96),
508
2.84k
                intx::be::unsafe::load<intx::uint256>(input_ptr + 64)},
509
2.84k
            {intx::be::unsafe::load<intx::uint256>(input_ptr + 160),
510
2.84k
                intx::be::unsafe::load<intx::uint256>(input_ptr + 128)},
511
2.84k
        };
512
2.84k
        pairs.emplace_back(p, q);
513
2.84k
    }
514
515
1.59k
    const auto res = evmmax::bn254::pairing_check(pairs);
516
1.59k
    if (!res.has_value())
517
798
        return {EVMC_PRECOMPILE_FAILURE, 0};
518
519
800
    std::fill_n(output, OUTPUT_SIZE, 0);
520
800
    output[OUTPUT_SIZE - 1] = *res ? 
1722
:
078
;
521
800
    return {EVMC_SUCCESS, OUTPUT_SIZE};
522
1.59k
}
523
524
ExecutionResult identity_execute(const uint8_t* input, size_t input_size, uint8_t* output,
525
    [[maybe_unused]] size_t output_size) noexcept
526
4.64k
{
527
4.64k
    assert(output_size >= input_size);
528
4.64k
    std::copy_n(input, input_size, output);
529
4.64k
    return {EVMC_SUCCESS, input_size};
530
4.64k
}
531
532
ExecutionResult blake2bf_execute(const uint8_t* input, [[maybe_unused]] size_t input_size,
533
    uint8_t* output, [[maybe_unused]] size_t output_size) noexcept
534
1.16k
{
535
1.16k
    static_assert(std::endian::native == std::endian::little,
536
1.16k
        "blake2bf only works correctly on little-endian architectures");
537
1.16k
    assert(input_size >= 213);
538
1.16k
    assert(output_size >= 64);
539
540
1.16k
    const auto rounds = intx::be::unsafe::load<uint32_t>(input);
541
1.16k
    input += sizeof(rounds);
542
543
1.16k
    uint64_t h[8];
544
1.16k
    std::memcpy(h, input, sizeof(h));
545
1.16k
    input += sizeof(h);
546
547
1.16k
    uint64_t m[16];
548
1.16k
    std::memcpy(m, input, sizeof(m));
549
1.16k
    input += sizeof(m);
550
551
1.16k
    uint64_t t[2];
552
1.16k
    std::memcpy(t, input, sizeof(t));
553
1.16k
    input += sizeof(t);
554
555
1.16k
    const auto f = *input;
556
1.16k
    if (f != 0 && 
f != 1896
) [[unlikely]]
  MC/DC Decision Region (556:9) to (556:25)
+
+  Number of Conditions: 2
+     Condition C1 --> (556:9)
+     Condition C2 --> (556:19)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
557
144
        return {EVMC_PRECOMPILE_FAILURE, 0};
558
559
1.02k
    crypto::blake2b_compress(rounds, h, m, t, f != 0);
560
1.02k
    std::memcpy(output, h, sizeof(h));
561
1.02k
    return {EVMC_SUCCESS, sizeof(h)};
562
1.16k
}
563
564
ExecutionResult point_evaluation_execute(const uint8_t* input, size_t input_size, uint8_t* output,
565
    [[maybe_unused]] size_t output_size) noexcept
566
1.22k
{
567
1.22k
    assert(output_size >= 64);
568
1.22k
    if (input_size != 192)
569
314
        return {EVMC_PRECOMPILE_FAILURE, 0};
570
571
906
    const auto r = crypto::kzg_verify_proof(reinterpret_cast<const std::byte*>(&input[0]),
572
906
        reinterpret_cast<const std::byte*>(&input[32]),
573
906
        reinterpret_cast<const std::byte*>(&input[64]),
574
906
        reinterpret_cast<const std::byte*>(&input[96]),
575
906
        reinterpret_cast<const std::byte*>(&input[96 + 48]));
576
577
906
    if (!r)
578
486
        return {EVMC_PRECOMPILE_FAILURE, 0};
579
580
    // Return FIELD_ELEMENTS_PER_BLOB and BLS_MODULUS as padded 32 byte big endian values
581
    // as required by the EIP-4844.
582
420
    intx::be::unsafe::store(output, crypto::FIELD_ELEMENTS_PER_BLOB);
583
420
    intx::be::unsafe::store(output + 32, crypto::BLS_MODULUS);
584
420
    return {EVMC_SUCCESS, 64};
585
906
}
586
587
ExecutionResult bls12_g1add_execute(const uint8_t* input, size_t input_size, uint8_t* output,
588
    [[maybe_unused]] size_t output_size) noexcept
589
520
{
590
520
    if (input_size != 2 * BLS12_G1_POINT_SIZE)
591
196
        return {EVMC_PRECOMPILE_FAILURE, 0};
592
593
520
    assert(output_size == BLS12_G1_POINT_SIZE);
594
595
324
    if (!crypto::bls::g1_add(output, &output[64], input, &input[64], &input[128], &input[192]))
596
144
        return {EVMC_PRECOMPILE_FAILURE, 0};
597
598
180
    return {EVMC_SUCCESS, BLS12_G1_POINT_SIZE};
599
324
}
600
601
ExecutionResult bls12_g1msm_execute(const uint8_t* input, size_t input_size, uint8_t* output,
602
    [[maybe_unused]] size_t output_size) noexcept
603
1.58k
{
604
1.58k
    if (input_size % BLS12_G1_MUL_INPUT_SIZE != 0)
605
0
        return {EVMC_PRECOMPILE_FAILURE, 0};
606
607
1.58k
    assert(output_size == BLS12_G1_POINT_SIZE);
608
609
1.58k
    if (!crypto::bls::g1_msm(output, &output[64], input, input_size))
610
220
        return {EVMC_PRECOMPILE_FAILURE, 0};
611
612
1.36k
    return {EVMC_SUCCESS, BLS12_G1_POINT_SIZE};
613
1.58k
}
614
615
ExecutionResult bls12_g2add_execute(const uint8_t* input, size_t input_size, uint8_t* output,
616
    [[maybe_unused]] size_t output_size) noexcept
617
544
{
618
544
    if (input_size != 2 * BLS12_G2_POINT_SIZE)
619
196
        return {EVMC_PRECOMPILE_FAILURE, 0};
620
621
544
    assert(output_size == BLS12_G2_POINT_SIZE);
622
623
348
    if (!crypto::bls::g2_add(output, &output[128], input, &input[128], &input[256], &input[384]))
624
176
        return {EVMC_PRECOMPILE_FAILURE, 0};
625
626
172
    return {EVMC_SUCCESS, BLS12_G2_POINT_SIZE};
627
348
}
628
629
ExecutionResult bls12_g2msm_execute(const uint8_t* input, size_t input_size, uint8_t* output,
630
    [[maybe_unused]] size_t output_size) noexcept
631
1.60k
{
632
1.60k
    if (input_size % BLS12_G2_MUL_INPUT_SIZE != 0)
633
0
        return {EVMC_PRECOMPILE_FAILURE, 0};
634
635
1.60k
    assert(output_size == BLS12_G2_POINT_SIZE);
636
637
1.60k
    if (!crypto::bls::g2_msm(output, &output[128], input, input_size))
638
240
        return {EVMC_PRECOMPILE_FAILURE, 0};
639
640
1.36k
    return {EVMC_SUCCESS, BLS12_G2_POINT_SIZE};
641
1.60k
}
642
643
ExecutionResult bls12_pairing_check_execute(const uint8_t* input, size_t input_size,
644
    uint8_t* output, [[maybe_unused]] size_t output_size) noexcept
645
412
{
646
412
    if (input_size % (BLS12_G1_POINT_SIZE + BLS12_G2_POINT_SIZE) != 0)
647
0
        return {EVMC_PRECOMPILE_FAILURE, 0};
648
649
412
    assert(output_size == 32);
650
651
412
    if (!crypto::bls::pairing_check(output, input, input_size))
652
204
        return {EVMC_PRECOMPILE_FAILURE, 0};
653
654
208
    return {EVMC_SUCCESS, 32};
655
412
}
656
657
ExecutionResult bls12_map_fp_to_g1_execute(const uint8_t* input, size_t input_size, uint8_t* output,
658
    [[maybe_unused]] size_t output_size) noexcept
659
316
{
660
316
    if (input_size != BLS12_FIELD_ELEMENT_SIZE)
661
200
        return {EVMC_PRECOMPILE_FAILURE, 0};
662
663
316
    assert(output_size == BLS12_G1_POINT_SIZE);
664
665
116
    if (!crypto::bls::map_fp_to_g1(output, &output[64], input))
666
36
        return {EVMC_PRECOMPILE_FAILURE, 0};
667
668
80
    return {EVMC_SUCCESS, BLS12_G1_POINT_SIZE};
669
116
}
670
671
ExecutionResult bls12_map_fp2_to_g2_execute(const uint8_t* input, size_t input_size,
672
    uint8_t* output, [[maybe_unused]] size_t output_size) noexcept
673
304
{
674
304
    if (input_size != 2 * BLS12_FIELD_ELEMENT_SIZE)
675
200
        return {EVMC_PRECOMPILE_FAILURE, 0};
676
677
304
    assert(output_size == BLS12_G2_POINT_SIZE);
678
679
104
    if (!crypto::bls::map_fp2_to_g2(output, &output[128], input))
680
56
        return {EVMC_PRECOMPILE_FAILURE, 0};
681
682
48
    return {EVMC_SUCCESS, BLS12_G2_POINT_SIZE};
683
104
}
684
685
static ExecutionResult p256verify_execute(const uint8_t* input, size_t input_size, uint8_t* output,
686
    [[maybe_unused]] size_t output_size) noexcept
687
724
{
688
724
    assert(output_size >= 32);
689
690
724
    if (input_size != 160)
691
14
        return {EVMC_SUCCESS, 0};
692
693
710
    ethash::hash256 h{};
694
710
    std::copy_n(input, sizeof(h), h.bytes);
695
710
    const auto r = intx::be::unsafe::load<intx::uint256>(input + 32);
696
710
    const auto s = intx::be::unsafe::load<intx::uint256>(input + 64);
697
710
    const auto qx = intx::be::unsafe::load<intx::uint256>(input + 96);
698
710
    const auto qy = intx::be::unsafe::load<intx::uint256>(input + 128);
699
700
710
    if (!evmmax::secp256r1::verify(h, r, s, qx, qy))
701
258
        return {EVMC_SUCCESS, 0};  // In case of invalid signature, return empty output.
702
703
    // Return 1_u256.
704
452
    std::fill_n(output, 31, 0);
705
452
    output[31] = 1;
706
452
    return {EVMC_SUCCESS, 32};
707
710
}
708
709
namespace
710
{
711
using PrecompileLookupIndex = uint16_t;
712
713
struct PrecompileTraits
714
{
715
    PrecompileLookupIndex address = 0;
716
    evmc_revision since = EVMC_FRONTIER;
717
    decltype(identity_analyze)* analyze = nullptr;
718
    decltype(identity_execute)* execute = nullptr;
719
};
720
721
inline constexpr std::array<PrecompileTraits, 18> traits{{
722
    {0x0001, EVMC_FRONTIER, ecrecover_analyze, ecrecover_execute},
723
    {0x0002, EVMC_FRONTIER, sha256_analyze, sha256_execute},
724
    {0x0003, EVMC_FRONTIER, ripemd160_analyze, ripemd160_execute},
725
    {0x0004, EVMC_FRONTIER, identity_analyze, identity_execute},
726
    {0x0005, EVMC_BYZANTIUM, expmod_analyze, expmod_execute},
727
    {0x0006, EVMC_BYZANTIUM, ecadd_analyze, ecadd_execute},
728
    {0x0007, EVMC_BYZANTIUM, ecmul_analyze, ecmul_execute},
729
    {0x0008, EVMC_BYZANTIUM, ecpairing_analyze, ecpairing_execute},
730
    {0x0009, EVMC_ISTANBUL, blake2bf_analyze, blake2bf_execute},
731
    {0x000a, EVMC_CANCUN, point_evaluation_analyze, point_evaluation_execute},
732
    {0x000b, EVMC_PRAGUE, bls12_g1add_analyze, bls12_g1add_execute},
733
    {0x000c, EVMC_PRAGUE, bls12_g1msm_analyze, bls12_g1msm_execute},
734
    {0x000d, EVMC_PRAGUE, bls12_g2add_analyze, bls12_g2add_execute},
735
    {0x000e, EVMC_PRAGUE, bls12_g2msm_analyze, bls12_g2msm_execute},
736
    {0x000f, EVMC_PRAGUE, bls12_pairing_check_analyze, bls12_pairing_check_execute},
737
    {0x0010, EVMC_PRAGUE, bls12_map_fp_to_g1_analyze, bls12_map_fp_to_g1_execute},
738
    {0x0011, EVMC_PRAGUE, bls12_map_fp2_to_g2_analyze, bls12_map_fp2_to_g2_execute},
739
    {0x0100, EVMC_OSAKA, p256verify_analyze, p256verify_execute},
740
}};
741
742
constexpr auto LOOKUP_TABLE_SIZE = [] {
743
    PrecompileLookupIndex max_idx = 0;
744
    for (const auto& trait : traits)
745
        max_idx = std::max(max_idx, trait.address);
746
    return max_idx + 1;
747
}();
748
749
PrecompileLookupIndex to_lookup_index(const evmc::address& addr) noexcept
750
5.50M
{
751
5.50M
    static constexpr auto ADDRESS_SIZE = sizeof(addr.bytes);
752
5.50M
    return static_cast<PrecompileLookupIndex>(
753
5.50M
        (addr.bytes[ADDRESS_SIZE - 2] << 8) | addr.bytes[ADDRESS_SIZE - 1]);
754
5.50M
}
755
}  // namespace
756
757
bool is_precompile(evmc_revision rev, const evmc::address& addr) noexcept
758
7.34M
{
759
7.34M
    static constexpr auto AVAILABILITY_LOOKUP_TABLE = [] {
760
7.34M
        using Entry = std::underlying_type_t<evmc_revision>;
761
7.34M
        std::array<Entry, LOOKUP_TABLE_SIZE> table{};
762
7.34M
        std::ranges::fill(table, std::numeric_limits<Entry>::max());
763
7.34M
        for (const auto& trait : traits)
764
7.34M
            table[trait.address] = stdx::to_underlying(trait.since);
765
7.34M
        return table;
766
7.34M
    }();
767
768
7.34M
    if (addr >= evmc::address{AVAILABILITY_LOOKUP_TABLE.size()})
769
3.48M
        return false;
770
3.86M
    return AVAILABILITY_LOOKUP_TABLE[to_lookup_index(addr)] <= stdx::to_underlying(rev);
771
7.34M
}
772
773
evmc::Result call_precompile(evmc_revision rev, const evmc_message& msg) noexcept
774
1.63M
{
775
1.63M
    static constexpr auto EXECUTION_LOOKUP_TABLE = [] {
776
1.63M
        struct Entry
777
1.63M
        {
778
1.63M
            decltype(PrecompileTraits::analyze) analyze = nullptr;
779
1.63M
            decltype(PrecompileTraits::execute) execute = nullptr;
780
1.63M
        };
781
1.63M
        std::array<Entry, LOOKUP_TABLE_SIZE> table{};
782
1.63M
        for (const auto& trait : traits)
783
1.63M
            table[trait.address] = {trait.analyze, trait.execute};
784
1.63M
        return table;
785
1.63M
    }();
786
787
1.63M
    assert(msg.gas >= 0);
788
789
1.63M
    const auto [analyze, execute] = EXECUTION_LOOKUP_TABLE[to_lookup_index(msg.code_address)];
790
791
1.63M
    const bytes_view input{msg.input_data, msg.input_size};
792
1.63M
    const auto [gas_cost, max_output_size] = analyze(input, rev);
793
1.63M
    const auto gas_left = msg.gas - gas_cost;
794
1.63M
    if (gas_left < 0)
795
1.58M
        return evmc::Result{EVMC_OUT_OF_GAS};
796
797
    // Allocate buffer for the precompile's output and pass its ownership to evmc::Result.
798
    // TODO: This can be done more elegantly by providing constructor evmc::Result(std::unique_ptr).
799
51.1k
    const auto output_data = new (std::nothrow) uint8_t[max_output_size];
800
51.1k
    const auto [status_code, output_size] =
801
51.1k
        execute(msg.input_data, msg.input_size, output_data, max_output_size);
802
51.1k
    const evmc_result result{status_code, status_code == EVMC_SUCCESS ? 
gas_left45.2k
:
05.92k
, 0,
803
51.1k
        output_data, output_size,
804
51.1k
        [](const evmc_result* res) noexcept { delete[] res->output_data; }};
805
51.1k
    return evmc::Result{result};
806
1.63M
}
807
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/precompiles_stubs.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/precompiles_stubs.cpp.html new file mode 100644 index 0000000000..482132f1a4 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/precompiles_stubs.cpp.html @@ -0,0 +1,30 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/precompiles_stubs.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "precompiles_stubs.hpp"
6
#include <evmc/evmc.hpp>
7
#include <algorithm>
8
#include <cassert>
9
#include <iostream>
10
11
namespace evmone::state
12
{
13
using evmc::bytes;
14
using evmc::bytes_view;
15
16
namespace
17
{
18
/// Returns the expmod result for the known inputs or empty bytes if not found.
19
///
20
/// Missing inputs collected with:
21
/// bin/evmone-statetest test_dirs >/dev/null 2> >(sort | uniq | tee stub.txt)
22
///
23
/// Results computed with:
24
/// ```python
25
/// def e(s):
26
///     b, x, m = s.split(",")
27
///     b = int(b, 16) if b != "0x" else 0
28
///     x = int(x, 16) if x != "0x" else 0
29
///     m = int(m, 16) if m != "0x" else 0
30
///     r = 0
31
///     if m != 0:
32
///         r = pow(b, x, m)
33
///     print(f'{{"{s}","{r:02x}"}},')
34
/// ```
35
bytes expmod_lookup_result(bytes_view base, bytes_view exp, bytes_view mod)
36
0
{
37
0
    static const std::unordered_map<std::string_view, std::string_view> stubs{
38
        // clang-format off
39
0
        {"0xc5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf,0x010001,0xe30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad","5a0eb2bdf0ac1cae8e586689fa16cd4b07dfdedaec8a110ea1fdb059dd5253231b6132987598dfc6e11f86780428982d50cf68f67ae452622c3b336b537ef3298ca645e8f89ee39a26758206a5a3f6409afc709582f95274b57b71fae5c6b74619ae6f089a5393c5b79235d9caf699d23d88fb873f78379690ad8405e34c19f5257d596580c7a6a7206a3712825afe630c76b31cdb4a23e7f0632e10f14f4e282c81a66451a26f8df2a352b5b9f607a7198449d1b926e27036810368e691a74b91c61afa73d9d3b99453e7c8b50fd4f09c039a2f2feb5c419206694c31b92df1d9586140cb3417b38d0c503c7b508cc2ed12e813a1c795e9829eb39ee78eeaf360a169b491a1d4e419574e712402de9d48d54c1ae5e03739b7156615e8267e1fb0a897f067afd11fb33f6e24182d7aaaaa18fe5bc1982f20d6b871e5a398f0f6f718181d31ec225cfa9a0a70124ed9a70031bdf0c1c7829f708b6e17d50419ef361cf77d99c85f44607186c8d683106b8bd38a49b5d0fb503b397a83388c5678dcfcc737499d84512690701ed621a6f0172aecf037184ddf0f2453e4053024018e5ab2e30d6d5363b56e8b41509317c99042f517247474ab3abc848e00a07f69c254f46f2a05cf6ed84e5cc906a518fdcfdf2c61ce731f24c5264f1a25fc04934dc28aec112134dd523f70115074ca34e3807aa4cb925147f3a0ce152d323bd8c675ace446d0fd1ae30c4b57f0eb2c23884bc18f0964c0114796c5b6d080c3d89175665fbf63a6381a6a9da39ad070b645c8bb1779506da14439a9f5b5d481954764ea114fac688930bc68534d403cff4210673b6a6ff7ae416b7cd41404c3d3f282fcd193b86d0f54d0006c2a503b40d5c3930da980565b8f9630e9493a79d1c03e74e5f93ac8e4dc1a901ec5e3b3e57049124c7b72ea345aa359e782285d9e6a5c144a378111dd02c40855ff9c2be9b48425cb0b2fd62dc8678fd151121cf26a65e917d65d8e0dacfae108eb5508b601fb8ffa370be1f9a8b749a2d12eeab81f41079de87e2d777994fa4d28188c579ad327f9957fb7bdecec5c680844dd43cb57cf87aeb763c003e65011f73f8c63442df39a92b946a6bd968a1c1e4d5fa7d88476a68bd8e20e5b70a99259c7d3f85fb1b65cd2e93972e6264e74ebf289b8b6979b9b68a85cd5b360c1987f87235c3c845d62489e33acf85d53fa3561fe3a3aee18924588d9c6eba4edb7a4d106b31173e42929f6f0c48c80ce6a72d54eca7c0fe870068b7a7c89c63cdda593f5b32d3cb4ea8a32c39f00ab449155757172d66763ed9527019d6de6c9f2416aa6203f4d11c9ebee1e1d3845099e55504446448027212616167eb36035726daa7698b075286f5379cd3e93cb3e0cf4f9cb8d017facbb5550ed32d5ec5400ae57e47e2bf78d1eaeff9480cc765ceff39db500"},
40
0
        {"0xc5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf,0x02,0xe30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad","d61fe4e3f32ac260915b5b03b78a86d11bfc41d973fce5b0cc59035cf8289a8a2e3878ea15fa46565b0d806e2f85b53873ea20ed653869b688adf83f3ef444535bf91598ff7e80f334fb782539b92f39f55310cc4b35349ab7b278346eda9bc37c0d8acd3557fae38197f412f8d9e57ce6a76b7205c23564cab06e5615be7c6f05c3d05ec690cba91da5e89d55b152ff8dd2157dc5458190025cf94b1ad98f7cbe64e9482faba95e6b33844afc640892872b44a9932096508f4a782a4805323808f23e54b6ff9b841dbfa87db3505ae4f687972c18ea0f0d0af89d36c1c2a5b14560c153c3fee406f5cf15cfd1c0bb45d767426d465f2f14c158495069d0c5955a00150707862ecaae30624ebacdd8ac33e4e6aab3ff90b6ba445a84689386b9e945d01823a65874444316e83767290fcff630d2477f49d5d8ffdd200e08ee1274270f86ed14c687895f6caf5ce528bd970c20d2408a9ba66216324c6a011ac4999098362dbd98a038129a2d40c8da6ab88318aa3046cb660327cc44236d9e5d2163bd0959062195c51ed93d0088b6f92051fc99050ece2538749165976233697ab4b610385366e5ce0b02ad6b61c168ecfbedcdf74278a38de340fd7a5fead8e588e294795f9b011e2e60377a89e25c90e145397cdeabc60fd32444a6b7642a611a83c464d8b8976666351b4865c37b02e6dc21dbcdf5f930341707b618cc0f03c3122646b3385c9df9f2ec730eec9d49e7dfc9153b6e6289da8c4f0ebea9ccc1b751948e3bb7171c9e4d57423b0eeeb79095c030cb52677b3f7e0b45c30f645391f3f9c957afa549c4e0b2465b03c67993cd200b1af01035962edbc4c9e89b31c82ac121987d6529dafdeef67a132dc04b6dc68e77f22862040b75e2ceb9ff16da0fca534e6db7bd12fa7b7f51b6c08c1e23dfcdb7acbd2da0b51c87ffbced065a612e9b1c8bba9b7e2d8d7a2f04fcc4aaf355b60d764879a76b5e16762d5f2f55d585d0c8e82df6940960cddfb72c91dfa71f6b4e1c6ca25dfc39a878e998a663c04fe29d5e83b9586d047b4d7ff70a9f0d44f127e7d741685ca75f11629128d916a0ffef4be586a30c4b70389cc746e84ebf177c01ee8a4511cfbb9d1ecf7f7b33c7dd8177896e10bbc82f838dcd6db7ac67de62bf46b6a640fb580c5d1d2708f3862e3d2b645d0d18e49ef088053e3a220adc0e033c2afcfe61c90e32151152eb3caaf746c5e377d541cafc6cbb0cc0fa48b5caf1728f2e1957f5addfc234f1a9d89e40d49356c9172d0561a695fce6dab1d412321bbf407f63766ffd7b6b3d79bcfa07991c5a9709849c1008689e3b47c50d613980bec239fb64185249d055b30375ccb4354d71fe4d05648fbf6c80634dfc3575f2f24abb714c1e4c95e8896763bf4316e954c7ad19e5780ab7a040ca6fb9271f90a8b22ae738daf6cb"},
41
0
        {"0xc5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf,0x03,0xe30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad","5f9c70ec884926a89461056ad20ac4c30155e817f807e4d3f5bb743d789c83386762435c3627773fa77da5144451f2a8aad8adba88e0b669f5377c5e9bad70e45c86fe952b613f015a9953b8a5de5eaee4566acf98d41e327d93a35bd5cef4607d025e58951167957df4ff9b1627649d3943805472e5e293d3efb687cfd1e503faafeb2840a3e3b3f85d016051a58e1c9498aab72e63b748d834b31eb05d85dcde65e27834e266b85c75cc4ec0135135e0601cb93eeeb6e0010c8ceb65c4c319623c5e573a2c8c9fbbf7df68a930beb412d3f4dfd146175484f45d7afaa0d2e60684af9b34730f7c8438465ad3e1d0c3237336722f2aa51095bd5759f4b8ab4dda111b684aa3dac62a761722e7ae43495b7709933512c81c4e3c9133a51f7ce9f2b51fcec064f65779666960b4e45df3900f54311f5613e8012dd1b8efd359eda31a778264c72aa8bb419d862734d769076bce2810011989a45374e5c5d8729fec21427f0bf397eacbb4220f603cf463a4b0c94efd858ffd9768cd60d6ce68d755e0fbad007ce5c2223d70c7018345a102e4ab3c60a13a9e7794303156d4c2063e919f2153c13961fb324c80b240742f47773a7a8e25b3e3fb19b00ce839346c6eb3c732fbc6b888df0b1fe0a3d07b053a2e9402c267b2d62f794d8a2840526e3ade15ce2264496ccd7519571dfde47f7a4bb16292241c20b2be59f3f8fb4f6383f232d838c5a22d8c95b6834d9d2ca493f5a505ebe8899503b0e8f9b19e6e2dd81c1628b80016d02097e0134de51054c4e7674824d4d758760fc52377d2cad145e259aa2ffaf54139e1a66b1e0c1c191e32ac59474c6b526f5b3ba07d3e5ec286eddf531fcd5292869be58c9f22ef91026159f7cf9d05ef66b4299f4da48cc1635bf2243051d342d378a22c83390553e873713c0454ce5f3234397111ac3fe3207b86f0ed9fc025c81903e1748103692074f83824fda6341be4f95ff00b0a9a208c267e12fa01825054cc0513629bf3dbb56dc5b90d4316f87654a8be18227978ea0a8a522760cad620d0d14fd38920fb7321314062914275a5f99f677145a6979b156bd82ecd36f23f8e1273cc2759ecc0b2c69d94dad5211d1bed939dd87ed9e07b91d49713a6e16ade0a98aea789f04994e318e4ff2c8a188cd8d43aeb52c6daa3bc29b4af50ea82a247c5cd67b573b34cbadcc0a376d3bbd530d50367b42705d870f2e27a8197ef46070528bfe408360faa2ebb8bf76e9f388572842bcb119f4d84ee34ae31f5cc594f23705a49197b181fb78ed1ec99499c690f843a4d0cf2e226d118e9372271054fbabdcc5c92ae9fefaef0589cd0e722eaf30c1703ec4289c7fd81beaa8a455ccee5298e31e2080c10c366a6fcf56f7d13582ad0bcad037c612b710fc595b70fbefaaca23623b60c6c39b11beb8e5843b6b3dac60f"},
42
        // clang-format on
43
0
    };
44
45
    /// Combine the arguments into a key. It can be copy-pasted to python's pow().
46
0
    const auto key = "0x" + evmc::hex({base.data(), base.size()}) +  //
47
0
                     ",0x" + evmc::hex({exp.data(), exp.size()}) +   //
48
0
                     ",0x" + evmc::hex({mod.data(), mod.size()});    //
49
50
0
    const auto it = stubs.find(key);
51
0
    if (it == stubs.end())
52
0
    {
53
0
        std::cerr << "expmod: no result for " << key << "\n";
54
0
        return {};
55
0
    }
56
0
    return evmc::from_hex(it->second).value();
57
0
}
58
}  // namespace
59
60
61
void expmod_stub(std::span<const uint8_t> in_base, std::span<const uint8_t> in_exp,
62
    std::span<const uint8_t> in_mod, uint8_t* output) noexcept
63
1
{
64
1
    bytes_view base{in_base.data(), in_base.size()};
65
1
    bytes_view exp{in_exp.data(), in_exp.size()};
66
1
    bytes_view mod{in_mod.data(), in_mod.size()};
67
68
    // Keep the output size before the mod normalization.
69
1
    const auto output_size = mod.size();
70
71
    // Normalize arguments by removing leading zeros.
72
1
    base = base.substr(std::min(base.find_first_not_of(uint8_t{0}), base.size()));
73
1
    exp = exp.substr(std::min(exp.find_first_not_of(uint8_t{0}), exp.size()));
74
1
    mod = mod.substr(std::min(mod.find_first_not_of(uint8_t{0}), mod.size()));
75
1
    assert(!mod.empty());  // mod must not be 0.
76
77
    // Figure out the result by handling trivial cases
78
    // or finally looking it up in the predefined set of results.
79
1
    const auto result = [&]() -> bytes {
80
        // For mod == 1 the result is 0.
81
1
        if (mod.size() == 1 && mod[0] == 1)
  MC/DC Decision Region (81:13) to (81:43)
+
+  Number of Conditions: 2
+     Condition C1 --> (81:13)
+     Condition C2 --> (81:32)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { T,  F  = F      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
82
0
            return bytes{};
83
84
        // For exp == 0 and mod > 1 the result is 1.
85
1
        if (exp.empty())
86
1
            return bytes{1};
87
88
        // For base <= 1, exp != 0, mod > 1 the result is base.
89
0
        if (base.empty() || (base.size() == 1 && base[0] == 1))
  MC/DC Decision Region (89:13) to (89:63)
+
+  Number of Conditions: 3
+     Condition C1 --> (89:13)
+     Condition C2 --> (89:30)
+     Condition C3 --> (89:50)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  C3-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
90
0
            return bytes{base};
91
92
0
        return expmod_lookup_result(base, exp, mod);
93
0
    }();
94
95
    // Set the result in the output buffer.
96
1
    const auto output_p = std::fill_n(output, output_size - result.size(), 0);
97
1
    std::ranges::copy(result, output_p);
98
1
}
99
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/requests.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/requests.cpp.html new file mode 100644 index 0000000000..d0b6007634 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/requests.cpp.html @@ -0,0 +1,16 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/requests.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "requests.hpp"
6
#include <evmone_precompiles/sha256.hpp>
7
8
namespace evmone::state
9
{
10
hash256 calculate_requests_hash(std::span<const Requests> block_requests_list)
11
43.3k
{
12
43.3k
    bytes requests_hash_list;
13
43.3k
    requests_hash_list.reserve(sizeof(hash256) * block_requests_list.size());
14
15
43.3k
    for (const auto& requests : block_requests_list)
16
130k
    {
17
130k
        if (requests.data().empty())
18
129k
            continue;  // Skip empty requests.
19
20
784
        hash256 requests_hash;
21
784
        crypto::sha256(reinterpret_cast<std::byte*>(requests_hash.bytes),
22
784
            reinterpret_cast<const std::byte*>(requests.raw_data.data()), requests.raw_data.size());
23
784
        requests_hash_list += requests_hash;
24
784
    }
25
26
43.3k
    hash256 block_requests_hash;
27
43.3k
    crypto::sha256(reinterpret_cast<std::byte*>(block_requests_hash.bytes),
28
43.3k
        reinterpret_cast<const std::byte*>(requests_hash_list.data()), requests_hash_list.size());
29
43.3k
    return block_requests_hash;
30
43.3k
}
31
32
std::optional<Requests> collect_deposit_requests(std::span<const TransactionReceipt> receipts)
33
45.4k
{
34
    // Browse all logs from all transactions.
35
45.4k
    Requests requests(Requests::Type::deposit);
36
45.4k
    for (const auto& receipt : receipts)
37
47.7k
    {
38
47.7k
        for (const auto& log : receipt.logs)
39
9.12k
        {
40
            // Follow the EIP-6110 pseudocode for block validity.
41
            // https://eips.ethereum.org/EIPS/eip-6110#block-validity
42
43
            // Filter out logs by the contact address and the log first topic.
44
9.12k
            if (log.addr != DEPOSIT_CONTRACT_ADDRESS)
45
7.46k
                continue;
46
1.66k
            if (log.topics.empty() || log.topics[0] != DEPOSIT_EVENT_SIGNATURE_HASH)
  MC/DC Decision Region (46:17) to (46:84)
+
+  Number of Conditions: 2
+     Condition C1 --> (46:17)
+     Condition C2 --> (46:39)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+
+  C1-Pair: not covered
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 50.00%
+
47
4
                continue;
48
49
            // Validate the layout of the log. If it doesn't match the EIP spec,
50
            // the requests' collection is failed.
51
1.65k
            if (log.data.size() != 576)
52
4
                return std::nullopt;
53
54
            // Deposit log definition
55
            // https://github.com/ethereum/consensus-specs/blob/dev/solidity_deposit_contract/deposit_contract.sol
56
            // event DepositEvent(
57
            //     bytes pubkey,
58
            //     bytes withdrawal_credentials,
59
            //     bytes amount,
60
            //     bytes signature,
61
            //     bytes index
62
            // );
63
            //
64
            // In ABI a word with its size prepends every bytes array.
65
            // Skip over the first 5 words (offsets of the values) and the pubkey size.
66
            // TODO: EIP requires to read these offsets and validate them.
67
            //       This has not been implemented yet because there are no tests for it.
68
1.65k
            static constexpr auto PUBKEY_OFFSET = 32 * 5 + 32;
69
1.65k
            static constexpr auto PUBKEY_SIZE = 48;
70
            // Pubkey size is 48 bytes, but is padded to the word boundary, so takes 64 bytes.
71
            // Skip over the pubkey and withdrawal credentials size.
72
1.65k
            static constexpr auto WITHDRAWAL_CREDS_OFFSET = PUBKEY_OFFSET + 64 + 32;
73
1.65k
            static constexpr auto WITHDRAWAL_CREDS_SIZE = 32;
74
            // Skip over withdrawal credentials and amount size.
75
1.65k
            static constexpr auto AMOUNT_OFFSET = WITHDRAWAL_CREDS_OFFSET + 32 + 32;
76
1.65k
            static constexpr auto AMOUNT_SIZE = 8;
77
            // Pubkey size is 8 bytes, but is padded to the word boundary, so takes 32 bytes.
78
            // Skip over amount and signature size.
79
1.65k
            static constexpr auto SIGNATURE_OFFSET = AMOUNT_OFFSET + 32 + 32;
80
1.65k
            static constexpr auto SIGNATURE_SIZE = 96;
81
            // Skip over signature and index size.
82
1.65k
            static constexpr auto INDEX_OFFSET = SIGNATURE_OFFSET + 96 + 32;
83
1.65k
            static constexpr auto INDEX_SIZE = 8;
84
85
            // Index is padded to the word boundary, so takes 32 bytes.
86
1.65k
            assert(log.data.size() == INDEX_OFFSET + 32);
87
88
1.65k
            requests.append({&log.data[PUBKEY_OFFSET], PUBKEY_SIZE});
89
1.65k
            requests.append({&log.data[WITHDRAWAL_CREDS_OFFSET], WITHDRAWAL_CREDS_SIZE});
90
1.65k
            requests.append({&log.data[AMOUNT_OFFSET], AMOUNT_SIZE});
91
1.65k
            requests.append({&log.data[SIGNATURE_OFFSET], SIGNATURE_SIZE});
92
1.65k
            requests.append({&log.data[INDEX_OFFSET], INDEX_SIZE});
93
1.65k
        }
94
47.7k
    }
95
45.4k
    return requests;
96
45.4k
}
97
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/requests.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/requests.hpp.html new file mode 100644 index 0000000000..0d4be06b02 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/requests.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/requests.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include "hash_utils.hpp"
8
#include "transaction.hpp"
9
#include <evmc/evmc.hpp>
10
#include <span>
11
12
namespace evmone::state
13
{
14
/// The address of the deposit contract.
15
///
16
/// TODO: This address differs in different chains, so it should be configurable.
17
constexpr auto DEPOSIT_CONTRACT_ADDRESS = 0x00000000219ab540356cBB839Cbe05303d7705Fa_address;
18
19
/// The topic of deposit log of the deposit contract.
20
constexpr auto DEPOSIT_EVENT_SIGNATURE_HASH =
21
    0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5_bytes32;
22
23
/// `requests` object.
24
///
25
/// Defined by EIP-7685: General purpose execution layer requests.
26
/// https://eips.ethereum.org/EIPS/eip-7685.
27
struct Requests
28
{
29
    /// The type of the requests.
30
    enum class Type : uint8_t
31
    {
32
        /// Deposit requests.
33
        /// Introduced by EIP-6110 https://eips.ethereum.org/EIPS/eip-6110.
34
        deposit = 0,
35
36
        /// Withdrawal requests.
37
        /// Introduced by EIP-7002 https://eips.ethereum.org/EIPS/eip-7002.
38
        withdrawal = 1,
39
40
        /// Consolidation requests.
41
        /// Introduced by EIP-7251 https://eips.ethereum.org/EIPS/eip-7251.
42
        consolidation = 2,
43
    };
44
45
    /// Raw encoded data of requests object: first byte is type, the rest is request objects.
46
    bytes raw_data;
47
48
    explicit Requests(Type _type, bytes_view data = {})
49
136k
    {
50
136k
        raw_data.reserve(1 + data.size());
51
136k
        raw_data += static_cast<uint8_t>(_type);
52
136k
        raw_data += data;
53
136k
    }
54
55
    /// Requests type.
56
0
    Type type() const noexcept { return static_cast<Type>(raw_data[0]); }
57
58
    /// Requests data - an opaque byte array, contains zero or more encoded request objects.
59
130k
    bytes_view data() const noexcept { return {raw_data.data() + 1, raw_data.size() - 1}; }
60
61
    /// Append data to requests object byte array.
62
8.26k
    void append(bytes_view data) { raw_data.append(data); }
63
};
64
65
/// Calculate commitment value of block requests list
66
hash256 calculate_requests_hash(std::span<const Requests> requests_list);
67
68
/// Construct a requests object from logs of the deposit contract.
69
///
70
/// @return The collected deposit requests or std::nullopt if the collection has failed.
71
std::optional<Requests> collect_deposit_requests(std::span<const TransactionReceipt> receipts);
72
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/rlp.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/rlp.hpp.html new file mode 100644 index 0000000000..120970b443 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/rlp.hpp.html @@ -0,0 +1,17 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/rlp.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2021 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include <evmc/bytes.hpp>
8
#include <intx/intx.hpp>
9
#include <cassert>
10
#include <string>
11
#include <string_view>
12
#include <utility>
13
#include <vector>
14
15
namespace evmone::rlp
16
{
17
using evmc::bytes;
18
using evmc::bytes_view;
19
20
namespace internal
21
{
22
template <uint8_t ShortBase, uint8_t LongBase>
23
inline bytes encode_length(size_t l)
24
93.3M
{
25
93.3M
    static constexpr uint8_t short_cutoff = 55;
26
93.3M
    static_assert(ShortBase + short_cutoff <= 0xff);
27
93.3M
    assert(l <= 0xffffff);
28
29
93.3M
    if (l <= short_cutoff)
30
67.5M
        return {static_cast<uint8_t>(ShortBase + l)};
31
25.8M
    else if (const auto l0 = static_cast<uint8_t>(l); l <= 0xff)
32
24.8M
        return {LongBase + 1, l0};
33
930k
    else if (const auto l1 = static_cast<uint8_t>(l >> 8); l <= 0xffff)
34
929k
        return {LongBase + 2, l1, l0};
35
378
    else
36
378
        return {LongBase + 3, static_cast<uint8_t>(l >> 16), l1, l0};
37
93.3M
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::internal::encode_length<(unsigned char)192, (unsigned char)247>(unsigned long)
Line
Count
Source
24
26.6M
{
25
26.6M
    static constexpr uint8_t short_cutoff = 55;
26
26.6M
    static_assert(ShortBase + short_cutoff <= 0xff);
27
26.6M
    assert(l <= 0xffffff);
28
29
26.6M
    if (l <= short_cutoff)
30
6.30M
        return {static_cast<uint8_t>(ShortBase + l)};
31
20.3M
    else if (const auto l0 = static_cast<uint8_t>(l); l <= 0xff)
32
19.6M
        return {LongBase + 1, l0};
33
723k
    else if (const auto l1 = static_cast<uint8_t>(l >> 8); l <= 0xffff)
34
723k
        return {LongBase + 2, l1, l0};
35
263
    else
36
263
        return {LongBase + 3, static_cast<uint8_t>(l >> 16), l1, l0};
37
26.6M
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::internal::encode_length<(unsigned char)128, (unsigned char)183>(unsigned long)
Line
Count
Source
24
66.7M
{
25
66.7M
    static constexpr uint8_t short_cutoff = 55;
26
66.7M
    static_assert(ShortBase + short_cutoff <= 0xff);
27
66.7M
    assert(l <= 0xffffff);
28
29
66.7M
    if (l <= short_cutoff)
30
61.2M
        return {static_cast<uint8_t>(ShortBase + l)};
31
5.41M
    else if (const auto l0 = static_cast<uint8_t>(l); l <= 0xff)
32
5.21M
        return {LongBase + 1, l0};
33
206k
    else if (const auto l1 = static_cast<uint8_t>(l >> 8); l <= 0xffff)
34
206k
        return {LongBase + 2, l1, l0};
35
115
    else
36
115
        return {LongBase + 3, static_cast<uint8_t>(l >> 16), l1, l0};
37
66.7M
}
38
39
inline bytes wrap_list(const bytes& content)
40
26.6M
{
41
26.6M
    return internal::encode_length<192, 247>(content.size()) + content;
42
26.6M
}
43
44
template <typename InputIterator>
45
inline bytes encode_container(InputIterator begin, InputIterator end);
46
}  // namespace internal
47
48
inline bytes_view trim(bytes_view b) noexcept
49
21.8M
{
50
21.8M
    b.remove_prefix(std::min(b.find_first_not_of(uint8_t{0x00}), b.size()));
51
21.8M
    return b;
52
21.8M
}
53
54
template <typename T>
55
inline decltype(rlp_encode(std::declval<T>())) encode(const T& v)
56
319k
{
57
319k
    return rlp_encode(v);
58
319k
}
Unexecuted instantiation: decltype(rlp_encode(std::declval<CustomStruct>())) evmone::rlp::encode<CustomStruct>(CustomStruct const&)
decltype(rlp_encode(std::declval<evmone::state::Transaction>())) evmone::rlp::encode<evmone::state::Transaction>(evmone::state::Transaction const&)
Line
Count
Source
56
164k
{
57
164k
    return rlp_encode(v);
58
164k
}
decltype(rlp_encode(std::declval<evmone::state::TransactionReceipt>())) evmone::rlp::encode<evmone::state::TransactionReceipt>(evmone::state::TransactionReceipt const&)
Line
Count
Source
56
80.0k
{
57
80.0k
    return rlp_encode(v);
58
80.0k
}
decltype(rlp_encode(std::declval<evmone::state::Withdrawal>())) evmone::rlp::encode<evmone::state::Withdrawal>(evmone::state::Withdrawal const&)
Line
Count
Source
56
4.02k
{
57
4.02k
    return rlp_encode(v);
58
4.02k
}
decltype(rlp_encode(std::declval<evmone::state::Authorization>())) evmone::rlp::encode<evmone::state::Authorization>(evmone::state::Authorization const&)
Line
Count
Source
56
43.5k
{
57
43.5k
    return rlp_encode(v);
58
43.5k
}
decltype(rlp_encode(std::declval<evmone::state::Log>())) evmone::rlp::encode<evmone::state::Log>(evmone::state::Log const&)
Line
Count
Source
56
27.3k
{
57
27.3k
    return rlp_encode(v);
58
27.3k
}
59
60
inline bytes encode(bytes_view data)
61
81.9M
{
62
81.9M
    static constexpr uint8_t short_base = 128;
63
81.9M
    if (data.size() == 1 && 
data[0] < short_base15.4M
)
  MC/DC Decision Region (63:9) to (63:49)
+
+  Number of Conditions: 2
+     Condition C1 --> (63:9)
+     Condition C2 --> (63:29)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
64
15.2M
        return {data[0]};
65
66
66.7M
    return internal::encode_length<short_base, 183>(data.size()) += data;  // Op + not available.
67
81.9M
}
68
69
inline bytes encode(uint64_t x)
70
5.98M
{
71
5.98M
    uint8_t b[sizeof(x)];
72
5.98M
    intx::be::store(b, x);
73
5.98M
    return encode(trim({b, sizeof(b)}));
74
5.98M
}
75
76
inline bytes encode(const intx::uint256& x)
77
5.96M
{
78
5.96M
    uint8_t b[sizeof(x)];
79
5.96M
    intx::be::store(b, x);
80
5.96M
    return encode(trim({b, sizeof(b)}));
81
5.96M
}
82
83
template <typename T>
84
inline bytes encode(const std::vector<T>& v)
85
363k
{
86
363k
    return internal::encode_container(v.begin(), v.end());
87
363k
}
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode<unsigned long>(std::vector<unsigned long, std::allocator<unsigned long>> const&)
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode<intx::uint<256u>>(std::vector<intx::uint<256u>, std::allocator<intx::uint<256u>>> const&)
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode<CustomStruct>(std::vector<CustomStruct, std::allocator<CustomStruct>> const&)
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode<evmc::bytes32>(std::vector<evmc::bytes32, std::allocator<evmc::bytes32>> const&)
Line
Count
Source
85
190k
{
86
190k
    return internal::encode_container(v.begin(), v.end());
87
190k
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>(std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>> const&)
Line
Count
Source
85
30.9k
{
86
30.9k
    return internal::encode_container(v.begin(), v.end());
87
30.9k
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode<evmone::state::Authorization>(std::vector<evmone::state::Authorization, std::allocator<evmone::state::Authorization>> const&)
Line
Count
Source
85
2.58k
{
86
2.58k
    return internal::encode_container(v.begin(), v.end());
87
2.58k
}
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>>(std::vector<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, std::allocator<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>>> const&)
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode<evmone::state::Log>(std::vector<evmone::state::Log, std::allocator<evmone::state::Log>> const&)
Line
Count
Source
85
138k
{
86
138k
    return internal::encode_container(v.begin(), v.end());
87
138k
}
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode<evmone::state::Transaction>(std::vector<evmone::state::Transaction, std::allocator<evmone::state::Transaction>> const&)
88
89
template <typename T, size_t N>
90
inline bytes encode(const T (&v)[N])
91
0
{
92
0
    return internal::encode_container(std::begin(v), std::end(v));
93
0
}
94
95
/// Encodes the fixed-size collection of heterogeneous values as RLP list.
96
template <typename... Types>
97
inline bytes encode_tuple(const Types&... elements)
98
5.54M
{
99
5.54M
    return internal::wrap_list((encode(elements) + ...));
100
5.54M
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<unsigned long, intx::uint<256u>, evmc::bytes32, evmc::bytes32>(unsigned long const&, intx::uint<256u> const&, evmc::bytes32 const&, evmc::bytes32 const&)
Line
Count
Source
98
5.08M
{
99
5.08M
    return internal::wrap_list((encode(elements) + ...));
100
5.08M
}
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>>(std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const&, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const&)
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, evmc::bytes32>(std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const&, evmc::bytes32 const&)
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<evmc::address, unsigned long>(evmc::address const&, unsigned long const&)
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<unsigned long, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>>(unsigned long const&, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const&)
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<unsigned long, unsigned long, evmc::address, unsigned long>(unsigned long const&, unsigned long const&, evmc::address const&, unsigned long const&)
Line
Count
Source
98
4.02k
{
99
4.02k
    return internal::wrap_list((encode(elements) + ...));
100
4.02k
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>>(evmc::address const&, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>> const&, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const&)
Line
Count
Source
98
27.3k
{
99
27.3k
    return internal::wrap_list((encode(elements) + ...));
100
27.3k
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<unsigned long, intx::uint<256u>, unsigned long, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>>, intx::uint<256u>, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, unsigned char, intx::uint<256u>, intx::uint<256u>>(unsigned long const&, intx::uint<256u> const&, unsigned long const&, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>> const&, intx::uint<256u> const&, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const&, unsigned char const&, intx::uint<256u> const&, intx::uint<256u> const&)
Line
Count
Source
98
133k
{
99
133k
    return internal::wrap_list((encode(elements) + ...));
100
133k
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<unsigned long, unsigned long, intx::uint<256u>, unsigned long, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>>, intx::uint<256u>, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>>, unsigned char, intx::uint<256u>, intx::uint<256u>>(unsigned long const&, unsigned long const&, intx::uint<256u> const&, unsigned long const&, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>> const&, intx::uint<256u> const&, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const&, std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>> const&, unsigned char const&, intx::uint<256u> const&, intx::uint<256u> const&)
Line
Count
Source
98
5.07k
{
99
5.07k
    return internal::wrap_list((encode(elements) + ...));
100
5.07k
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>(evmc::address const&, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>> const&)
Line
Count
Source
98
144k
{
99
144k
    return internal::wrap_list((encode(elements) + ...));
100
144k
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<unsigned long, unsigned long, intx::uint<256u>, intx::uint<256u>, unsigned long, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>>, intx::uint<256u>, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>>, unsigned char, intx::uint<256u>, intx::uint<256u>>(unsigned long const&, unsigned long const&, intx::uint<256u> const&, intx::uint<256u> const&, unsigned long const&, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>> const&, intx::uint<256u> const&, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const&, std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>> const&, unsigned char const&, intx::uint<256u> const&, intx::uint<256u> const&)
Line
Count
Source
98
4.75k
{
99
4.75k
    return internal::wrap_list((encode(elements) + ...));
100
4.75k
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<unsigned long, unsigned long, intx::uint<256u>, intx::uint<256u>, unsigned long, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>>, intx::uint<256u>, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>>, intx::uint<256u>, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>, unsigned char, intx::uint<256u>, intx::uint<256u>>(unsigned long const&, unsigned long const&, intx::uint<256u> const&, intx::uint<256u> const&, unsigned long const&, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>> const&, intx::uint<256u> const&, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const&, std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>> const&, intx::uint<256u> const&, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>> const&, unsigned char const&, intx::uint<256u> const&, intx::uint<256u> const&)
Line
Count
Source
98
18.4k
{
99
18.4k
    return internal::wrap_list((encode(elements) + ...));
100
18.4k
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<unsigned long, unsigned long, intx::uint<256u>, intx::uint<256u>, unsigned long, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>>, intx::uint<256u>, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>>, std::vector<evmone::state::Authorization, std::allocator<evmone::state::Authorization>>, unsigned char, intx::uint<256u>, intx::uint<256u>>(unsigned long const&, unsigned long const&, intx::uint<256u> const&, intx::uint<256u> const&, unsigned long const&, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>> const&, intx::uint<256u> const&, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const&, std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>> const&, std::vector<evmone::state::Authorization, std::allocator<evmone::state::Authorization>> const&, unsigned char const&, intx::uint<256u> const&, intx::uint<256u> const&)
Line
Count
Source
98
2.58k
{
99
2.58k
    return internal::wrap_list((encode(elements) + ...));
100
2.58k
}
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<unsigned long, unsigned long, intx::uint<256u>, intx::uint<256u>, unsigned long, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>>, intx::uint<256u>, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>>, std::vector<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, std::allocator<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>>>, unsigned char, intx::uint<256u>, intx::uint<256u>>(unsigned long const&, unsigned long const&, intx::uint<256u> const&, intx::uint<256u> const&, unsigned long const&, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>> const&, intx::uint<256u> const&, std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const&, std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>> const&, std::vector<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, std::allocator<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>>> const&, unsigned char const&, intx::uint<256u> const&, intx::uint<256u> const&)
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<evmc::bytes32, unsigned long, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>>, std::vector<evmone::state::Log, std::allocator<evmone::state::Log>>>(evmc::bytes32 const&, unsigned long const&, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>> const&, std::vector<evmone::state::Log, std::allocator<evmone::state::Log>> const&)
Line
Count
Source
98
1.47k
{
99
1.47k
    return internal::wrap_list((encode(elements) + ...));
100
1.47k
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<bool, unsigned long, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>>, std::vector<evmone::state::Log, std::allocator<evmone::state::Log>>>(bool const&, unsigned long const&, std::basic_string_view<unsigned char, evmc::byte_traits<unsigned char>> const&, std::vector<evmone::state::Log, std::allocator<evmone::state::Log>> const&)
Line
Count
Source
98
78.5k
{
99
78.5k
    return internal::wrap_list((encode(elements) + ...));
100
78.5k
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::encode_tuple<intx::uint<256u>, evmc::address, unsigned long, intx::uint<256u>, intx::uint<256u>, intx::uint<256u>>(intx::uint<256u> const&, evmc::address const&, unsigned long const&, intx::uint<256u> const&, intx::uint<256u> const&, intx::uint<256u> const&)
Line
Count
Source
98
43.5k
{
99
43.5k
    return internal::wrap_list((encode(elements) + ...));
100
43.5k
}
101
102
/// Encodes a pair of values as RPL list.
103
template <typename T1, typename T2>
104
inline bytes encode(const std::pair<T1, T2>& p)
105
144k
{
106
144k
    return encode_tuple(p.first, p.second);
107
144k
}
108
109
/// Encodes the container as RLP list.
110
///
111
/// @tparam InputIterator  Type of the input iterator.
112
/// @param  begin          Begin iterator.
113
/// @param  end            End iterator.
114
/// @return                Bytes of the RLP list.
115
template <typename InputIterator>
116
inline bytes internal::encode_container(InputIterator begin, InputIterator end)
117
363k
{
118
363k
    bytes content;
119
787k
    for (auto it = begin; it != end; 
++it424k
)
120
424k
        content += encode(*it);
121
363k
    return wrap_list(content);
122
363k
}
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::internal::encode_container<__gnu_cxx::__normal_iterator<unsigned long const*, std::vector<unsigned long, std::allocator<unsigned long>>>>(__gnu_cxx::__normal_iterator<unsigned long const*, std::vector<unsigned long, std::allocator<unsigned long>>>, __gnu_cxx::__normal_iterator<unsigned long const*, std::vector<unsigned long, std::allocator<unsigned long>>>)
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::internal::encode_container<unsigned long const*>(unsigned long const*, unsigned long const*)
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::internal::encode_container<__gnu_cxx::__normal_iterator<intx::uint<256u> const*, std::vector<intx::uint<256u>, std::allocator<intx::uint<256u>>>>>(__gnu_cxx::__normal_iterator<intx::uint<256u> const*, std::vector<intx::uint<256u>, std::allocator<intx::uint<256u>>>>, __gnu_cxx::__normal_iterator<intx::uint<256u> const*, std::vector<intx::uint<256u>, std::allocator<intx::uint<256u>>>>)
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::internal::encode_container<__gnu_cxx::__normal_iterator<CustomStruct const*, std::vector<CustomStruct, std::allocator<CustomStruct>>>>(__gnu_cxx::__normal_iterator<CustomStruct const*, std::vector<CustomStruct, std::allocator<CustomStruct>>>, __gnu_cxx::__normal_iterator<CustomStruct const*, std::vector<CustomStruct, std::allocator<CustomStruct>>>)
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::internal::encode_container<__gnu_cxx::__normal_iterator<evmc::bytes32 const*, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>(__gnu_cxx::__normal_iterator<evmc::bytes32 const*, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, __gnu_cxx::__normal_iterator<evmc::bytes32 const*, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>)
Line
Count
Source
117
190k
{
118
190k
    bytes content;
119
399k
    for (auto it = begin; it != end; 
++it208k
)
120
208k
        content += encode(*it);
121
190k
    return wrap_list(content);
122
190k
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::internal::encode_container<__gnu_cxx::__normal_iterator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>> const*, std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>>>>(__gnu_cxx::__normal_iterator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>> const*, std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>>>, __gnu_cxx::__normal_iterator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>> const*, std::vector<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>, std::allocator<std::pair<evmc::address, std::vector<evmc::bytes32, std::allocator<evmc::bytes32>>>>>>)
Line
Count
Source
117
30.9k
{
118
30.9k
    bytes content;
119
175k
    for (auto it = begin; it != end; 
++it144k
)
120
144k
        content += encode(*it);
121
30.9k
    return wrap_list(content);
122
30.9k
}
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::internal::encode_container<__gnu_cxx::__normal_iterator<evmone::state::Authorization const*, std::vector<evmone::state::Authorization, std::allocator<evmone::state::Authorization>>>>(__gnu_cxx::__normal_iterator<evmone::state::Authorization const*, std::vector<evmone::state::Authorization, std::allocator<evmone::state::Authorization>>>, __gnu_cxx::__normal_iterator<evmone::state::Authorization const*, std::vector<evmone::state::Authorization, std::allocator<evmone::state::Authorization>>>)
Line
Count
Source
117
2.58k
{
118
2.58k
    bytes content;
119
46.1k
    for (auto it = begin; it != end; 
++it43.5k
)
120
43.5k
        content += encode(*it);
121
2.58k
    return wrap_list(content);
122
2.58k
}
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::internal::encode_container<__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const*, std::vector<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, std::allocator<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>>>>>(__gnu_cxx::__normal_iterator<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const*, std::vector<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, std::allocator<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>>>>, __gnu_cxx::__normal_iterator<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> const*, std::vector<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>, std::allocator<std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>>>>>)
std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::internal::encode_container<__gnu_cxx::__normal_iterator<evmone::state::Log const*, std::vector<evmone::state::Log, std::allocator<evmone::state::Log>>>>(__gnu_cxx::__normal_iterator<evmone::state::Log const*, std::vector<evmone::state::Log, std::allocator<evmone::state::Log>>>, __gnu_cxx::__normal_iterator<evmone::state::Log const*, std::vector<evmone::state::Log, std::allocator<evmone::state::Log>>>)
Line
Count
Source
117
138k
{
118
138k
    bytes content;
119
166k
    for (auto it = begin; it != end; 
++it27.3k
)
120
27.3k
        content += encode(*it);
121
138k
    return wrap_list(content);
122
138k
}
Unexecuted instantiation: std::__cxx11::basic_string<unsigned char, evmc::byte_traits<unsigned char>, std::allocator<unsigned char>> evmone::rlp::internal::encode_container<__gnu_cxx::__normal_iterator<evmone::state::Transaction const*, std::vector<evmone::state::Transaction, std::allocator<evmone::state::Transaction>>>>(__gnu_cxx::__normal_iterator<evmone::state::Transaction const*, std::vector<evmone::state::Transaction, std::allocator<evmone::state::Transaction>>>, __gnu_cxx::__normal_iterator<evmone::state::Transaction const*, std::vector<evmone::state::Transaction, std::allocator<evmone::state::Transaction>>>)
123
}  // namespace evmone::rlp
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/state.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/state.cpp.html new file mode 100644 index 0000000000..7d72b65382 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/state.cpp.html @@ -0,0 +1,166 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/state.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "state.hpp"
6
#include "../utils/stdx/utility.hpp"
7
#include "host.hpp"
8
#include "state_view.hpp"
9
#include <evmone/constants.hpp>
10
#include <evmone/delegation.hpp>
11
#include <evmone/eof.hpp>
12
#include <evmone_precompiles/secp256k1.hpp>
13
#include <algorithm>
14
15
using namespace intx;
16
17
namespace evmone::state
18
{
19
namespace
20
{
21
/// Secp256k1's N/2 is the upper bound of the signature's s value.
22
constexpr auto SECP256K1N_OVER_2 = evmmax::secp256k1::Curve::ORDER / 2;
23
/// EIP-7702: The cost of authorization that sets delegation to an account that didn't exist before.
24
constexpr auto AUTHORIZATION_EMPTY_ACCOUNT_COST = 25000;
25
/// EIP-7702: The cost of authorization that sets delegation to an account that already exists.
26
constexpr auto AUTHORIZATION_BASE_COST = 12500;
27
///
28
constexpr auto MAX_INITCODE_COUNT = 256;
29
30
constexpr int64_t num_words(size_t size_in_bytes) noexcept
31
38.8k
{
32
38.8k
    return static_cast<int64_t>((size_in_bytes + 31) / 32);
33
38.8k
}
34
35
size_t compute_tx_data_tokens(evmc_revision rev, bytes_view data) noexcept
36
141k
{
37
141k
    const auto num_zero_bytes = static_cast<size_t>(std::ranges::count(data, 0));
38
141k
    const auto num_nonzero_bytes = data.size() - num_zero_bytes;
39
40
141k
    const size_t nonzero_byte_multiplier = rev >= EVMC_ISTANBUL ? 
4136k
:
174.85k
;
41
141k
    return (nonzero_byte_multiplier * num_nonzero_bytes) + num_zero_bytes;
42
141k
}
43
44
size_t compute_tx_initcode_tokens(evmc_revision rev, std::span<const bytes> initcodes) noexcept
45
141k
{
46
141k
    size_t sum = 0;
47
141k
    for (const auto& initcode : initcodes)
48
0
        sum += compute_tx_data_tokens(rev, initcode);
49
141k
    return sum;
50
141k
}
51
52
int64_t compute_access_list_cost(const AccessList& access_list) noexcept
53
141k
{
54
141k
    static constexpr auto ADDRESS_COST = 2400;
55
141k
    static constexpr auto STORAGE_KEY_COST = 1900;
56
57
141k
    int64_t cost = 0;
58
141k
    for (const auto& [_, keys] : access_list)
59
164k
        cost += ADDRESS_COST + static_cast<int64_t>(keys.size()) * STORAGE_KEY_COST;
60
141k
    return cost;
61
141k
}
62
63
struct TransactionCost
64
{
65
    int64_t intrinsic = 0;
66
    int64_t min = 0;
67
};
68
69
/// Compute the transaction intrinsic gas 𝑔₀ (Yellow Paper, 6.2) and minimal gas (EIP-7623).
70
TransactionCost compute_tx_intrinsic_cost(evmc_revision rev, const Transaction& tx) noexcept
71
141k
{
72
141k
    static constexpr auto TX_BASE_COST = 21000;
73
141k
    static constexpr auto TX_CREATE_COST = 32000;
74
141k
    static constexpr auto DATA_TOKEN_COST = 4;
75
141k
    static constexpr auto INITCODE_WORD_COST = 2;
76
141k
    static constexpr auto TOTAL_COST_FLOOR_PER_TOKEN = 10;
77
78
141k
    const auto is_create = !tx.to.has_value();
79
80
141k
    const auto create_cost = (is_create && 
rev >= EVMC_HOMESTEAD38.8k
) ?
TX_CREATE_COST38.8k
:
0102k
;
  MC/DC Decision Region (80:31) to (80:65)
+
+  Number of Conditions: 2
+     Condition C1 --> (80:31)
+     Condition C2 --> (80:44)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
81
82
141k
    const auto num_data_tokens = static_cast<int64_t>(compute_tx_data_tokens(rev, tx.data));
83
141k
    const auto num_initcode_tokens =
84
141k
        static_cast<int64_t>(compute_tx_initcode_tokens(rev, tx.initcodes));
85
141k
    const auto num_tokens = num_data_tokens + num_initcode_tokens;
86
141k
    const auto data_cost = num_tokens * DATA_TOKEN_COST;
87
88
141k
    const auto access_list_cost = compute_access_list_cost(tx.access_list);
89
90
141k
    const auto auth_list_cost =
91
141k
        static_cast<int64_t>(tx.authorization_list.size()) * AUTHORIZATION_EMPTY_ACCOUNT_COST;
92
93
141k
    const auto initcode_cost =
94
141k
        (is_create && 
rev >= EVMC_SHANGHAI38.8k
) ?
INITCODE_WORD_COST * num_words(tx.data.size())38.8k
:
0102k
;
  MC/DC Decision Region (94:10) to (94:43)
+
+  Number of Conditions: 2
+     Condition C1 --> (94:10)
+     Condition C2 --> (94:23)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
95
96
141k
    const auto intrinsic_cost =
97
141k
        TX_BASE_COST + create_cost + data_cost + access_list_cost + auth_list_cost + initcode_cost;
98
99
    // EIP-7623: Compute the minimum cost for the transaction by. If disabled, just use 0.
100
141k
    const auto min_cost =
101
141k
        rev >= EVMC_PRAGUE ? 
TX_BASE_COST + num_tokens * TOTAL_COST_FLOOR_PER_TOKEN85.4k
:
055.8k
;
102
103
141k
    return {intrinsic_cost, min_cost};
104
141k
}
105
106
int64_t process_authorization_list(
107
    State& state, uint64_t chain_id, const AuthorizationList& authorization_list)
108
136k
{
109
136k
    int64_t delegation_refund = 0;
110
136k
    for (const auto& auth : authorization_list)
111
37.7k
    {
112
        // 1. Verify the chain id is either 0 or the chain’s current ID.
113
37.7k
        if (auth.chain_id != 0 && 
auth.chain_id != chain_id196
)
  MC/DC Decision Region (113:13) to (113:60)
+
+  Number of Conditions: 2
+     Condition C1 --> (113:13)
+     Condition C2 --> (113:35)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
114
56
            continue;
115
116
        // 2. Verify the nonce is less than 2**64 - 1.
117
37.6k
        if (auth.nonce == Account::NonceMax)
118
8
            continue;
119
120
        // 3. Verify if the signer has been successfully recovered from the signature.
121
        //    authority = ecrecover(...)
122
37.6k
        if (!auth.signer.has_value())
123
68
            continue;
124
125
        // s value must be less than or equal to secp256k1n/2, as specified in EIP-2.
126
37.5k
        if (auth.s > SECP256K1N_OVER_2)
127
12
            continue;
128
129
        // Get or create the authority account.
130
        // It is still empty at this point until nonce bump following successful authorization.
131
37.5k
        auto& authority = state.get_or_insert(*auth.signer, {.erase_if_empty = true});
132
133
        // 4. Add authority to accessed_addresses (as defined in EIP-2929.)
134
37.5k
        authority.access_status = EVMC_ACCESS_WARM;
135
136
        // 5. Verify the code of authority is either empty or already delegated.
137
37.5k
        if (authority.code_hash != Account::EMPTY_CODE_HASH &&
138
37.5k
            
!is_code_delegated(state.get_code(*auth.signer))10.8k
)
  MC/DC Decision Region (137:13) to (138:61)
+
+  Number of Conditions: 2
+     Condition C1 --> (137:13)
+     Condition C2 --> (138:13)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
139
64
            continue;
140
141
        // 6. Verify the nonce of authority is equal to nonce.
142
        // In case authority does not exist in the trie, verify that nonce is equal to 0.
143
37.5k
        if (auth.nonce != authority.nonce)
144
5.52k
            continue;
145
146
        // 7. Add PER_EMPTY_ACCOUNT_COST - PER_AUTH_BASE_COST gas to the global refund counter
147
        // if authority exists in the trie.
148
        // Successful authorisation validation makes an account non-empty.
149
        // We apply the refund only if the account has existed before.
150
        // We detect "exists in the trie" by inspecting _empty_ property (EIP-161) because _empty_
151
        // implies an account doesn't exist in the state (EIP-7523).
152
31.9k
        if (!authority.is_empty())
153
16.0k
        {
154
16.0k
            static constexpr auto EXISTING_AUTHORITY_REFUND =
155
16.0k
                AUTHORIZATION_EMPTY_ACCOUNT_COST - AUTHORIZATION_BASE_COST;
156
16.0k
            delegation_refund += EXISTING_AUTHORITY_REFUND;
157
16.0k
        }
158
159
        // As a special case, if address is 0 do not write the designation.
160
        // Clear the account’s code and reset the account’s code hash to the empty hash.
161
31.9k
        if (is_zero(auth.addr))
162
128
        {
163
128
            if (authority.code_hash != Account::EMPTY_CODE_HASH)
164
44
            {
165
44
                authority.code_changed = true;
166
44
                authority.code.clear();
167
44
                authority.code_hash = Account::EMPTY_CODE_HASH;
168
44
            }
169
128
        }
170
        // 8. Set the code of authority to be 0xef0100 || address. This is a delegation designation.
171
31.8k
        else
172
31.8k
        {
173
31.8k
            auto new_code = bytes(DELEGATION_MAGIC) + bytes(auth.addr);
174
31.8k
            if (authority.code != new_code)
175
26.5k
            {
176
                // We are doing this only if the code is different to make the state diff precise.
177
26.5k
                authority.code_changed = true;
178
26.5k
                authority.code = std::move(new_code);
179
26.5k
                authority.code_hash = keccak256(authority.code);
180
26.5k
            }
181
31.8k
        }
182
183
        // 9. Increase the nonce of authority by one.
184
31.9k
        ++authority.nonce;
185
31.9k
    }
186
136k
    return delegation_refund;
187
136k
}
188
189
evmc_message build_message(const Transaction& tx, int64_t execution_gas_limit) noexcept
190
136k
{
191
136k
    const auto recipient = tx.to.has_value() ? 
*tx.to98.3k
:
evmc::address{}38.5k
;
192
193
136k
    return {
194
136k
        .kind = tx.to.has_value() ? 
EVMC_CALL98.3k
:
EVMC_CREATE38.5k
,
195
136k
        .flags = 0,
196
136k
        .depth = 0,
197
136k
        .gas = execution_gas_limit,
198
136k
        .recipient = recipient,
199
136k
        .sender = tx.sender,
200
136k
        .input_data = tx.data.data(),
201
136k
        .input_size = tx.data.size(),
202
136k
        .value = intx::be::store<evmc::uint256be>(tx.value),
203
136k
        .create2_salt = {},
204
136k
        .code_address = recipient,
205
136k
        .code = nullptr,
206
136k
        .code_size = 0,
207
136k
    };
208
136k
}
209
}  // namespace
210
211
StateDiff State::build_diff(evmc_revision rev) const
212
435k
{
213
435k
    StateDiff diff;
214
435k
    for (const auto& [addr, m] : m_modified)
215
1.12M
    {
216
1.12M
        if (m.destructed)
217
4.07k
        {
218
            // TODO: This must be done even for just_created
219
            //   because destructed may pre-date just_created. Add test to evmone (EEST has it).
220
4.07k
            diff.deleted_accounts.emplace_back(addr);
221
4.07k
            continue;
222
4.07k
        }
223
1.11M
        if (m.erase_if_empty && 
rev >= EVMC_SPURIOUS_DRAGON400k
&&
m.is_empty()399k
)
  MC/DC Decision Region (223:13) to (223:76)
+
+  Number of Conditions: 3
+     Condition C1 --> (223:13)
+     Condition C2 --> (223:33)
+     Condition C3 --> (223:64)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  F,  -  = F      }
+  3 { T,  T,  F  = F      }
+  4 { T,  T,  T  = T      }
+
+  C1-Pair: covered: (1,4)
+  C2-Pair: covered: (2,4)
+  C3-Pair: covered: (3,4)
+  MC/DC Coverage for Expression: 100.00%
+
224
284k
        {
225
284k
            if (!m.just_created)  // Don't report just created accounts
226
277k
                diff.deleted_accounts.emplace_back(addr);
227
284k
            continue;
228
284k
        }
229
230
        // Unconditionally report nonce and balance as modified.
231
        // TODO: We don't have information if the balance/nonce has actually changed.
232
        //   One option is to just keep the original values. This may be handy for RPC.
233
        // TODO(clang): In AppleClang 15 emplace_back without StateDiff::Entry doesn't compile.
234
        //   NOLINTNEXTLINE(modernize-use-emplace)
235
832k
        auto& a = diff.modified_accounts.emplace_back(StateDiff::Entry{addr, m.nonce, m.balance});
236
237
        // Output only the new code.
238
        // TODO: Output also the code hash. It will be needed for DB update and MPT hash.
239
832k
        if (m.code_changed)
240
47.4k
            a.code = m.code;
241
242
832k
        for (const auto& [k, v] : m.storage)
243
1.78M
        {
244
1.78M
            if (v.current != v.original)
245
490k
                a.modified_storage.emplace_back(k, v.current);
246
1.78M
        }
247
832k
    }
248
435k
    return diff;
249
435k
}
250
251
Account& State::insert(const address& addr, Account account)
252
1.12M
{
253
1.12M
    const auto r = m_modified.insert({addr, std::move(account)});
254
1.12M
    assert(r.second);
255
1.12M
    return r.first->second;
256
1.12M
}
257
258
Account* State::find(const address& addr) noexcept
259
54.8M
{
260
    // TODO: Avoid double lookup (find+insert) and not cached initial state lookup for non-existent
261
    //   accounts. If we want to cache non-existent account we need a proper flag for it.
262
54.8M
    if (const auto it = m_modified.find(addr); it != m_modified.end())
263
51.7M
        return &it->second;
264
3.13M
    if (const auto cacc = m_initial.get_account(addr); cacc)
265
712k
        return &insert(addr, {.nonce = cacc->nonce,
266
712k
                                 .balance = cacc->balance,
267
712k
                                 .code_hash = cacc->code_hash,
268
712k
                                 .has_initial_storage = cacc->has_storage});
269
2.41M
    return nullptr;
270
3.13M
}
271
272
Account& State::get(const address& addr) noexcept
273
32.7M
{
274
32.7M
    auto acc = find(addr);
275
32.7M
    assert(acc != nullptr);
276
32.7M
    return *acc;
277
32.7M
}
278
279
Account& State::get_or_insert(const address& addr, Account account)
280
9.81M
{
281
9.81M
    if (const auto acc = find(addr); acc != nullptr)
282
9.40M
        return *acc;
283
403k
    return insert(addr, std::move(account));
284
9.81M
}
285
286
bytes_view State::get_code(const address& addr)
287
5.51M
{
288
5.51M
    auto* a = find(addr);
289
5.51M
    if (a == nullptr)
290
72
        return {};
291
5.51M
    if (a->code_hash == Account::EMPTY_CODE_HASH)
292
1.46M
        return {};
293
4.04M
    if (a->code.empty())
294
262k
        a->code = m_initial.get_account_code(addr);
295
4.04M
    return a->code;
296
5.51M
}
297
298
Account& State::touch(const address& addr)
299
4.52M
{
300
4.52M
    auto& acc = get_or_insert(addr, {.erase_if_empty = true});
301
4.52M
    if (!acc.erase_if_empty && 
acc.is_empty()1.90M
)
  MC/DC Decision Region (301:9) to (301:46)
+
+  Number of Conditions: 2
+     Condition C1 --> (301:9)
+     Condition C2 --> (301:32)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
302
0
    {
303
0
        acc.erase_if_empty = true;
304
0
        m_journal.emplace_back(JournalTouched{addr});
305
0
    }
306
4.52M
    return acc;
307
4.52M
}
308
309
StorageValue& State::get_storage(const address& addr, const bytes32& key)
310
10.9M
{
311
    // TODO: Avoid account lookup by giving the reference to the account's storage to Host.
312
10.9M
    auto& acc = get(addr);
313
10.9M
    const auto [it, missing] = acc.storage.try_emplace(key);
314
10.9M
    if (missing)
315
1.85M
    {
316
1.85M
        const auto initial_value = m_initial.get_storage(addr, key);
317
1.85M
        it->second = {initial_value, initial_value};
318
1.85M
    }
319
10.9M
    return it->second;
320
10.9M
}
321
322
void State::journal_balance_change(const address& addr, const intx::uint256& prev_balance)
323
435k
{
324
435k
    m_journal.emplace_back(JournalBalanceChange{{addr}, prev_balance});
325
435k
}
326
327
void State::journal_storage_change(
328
    const address& addr, const bytes32& key, const StorageValue& value)
329
5.45M
{
330
5.45M
    m_journal.emplace_back(JournalStorageChange{{addr}, key, value.current, value.access_status});
331
5.45M
}
332
333
void State::journal_transient_storage_change(
334
    const address& addr, const bytes32& key, const bytes32& value)
335
9.07M
{
336
9.07M
    m_journal.emplace_back(JournalTransientStorageChange{{addr}, key, value});
337
9.07M
}
338
339
void State::journal_bump_nonce(const address& addr)
340
46.3k
{
341
46.3k
    m_journal.emplace_back(JournalNonceBump{addr});
342
46.3k
}
343
344
void State::journal_create(const address& addr, bool existed)
345
89.6k
{
346
89.6k
    m_journal.emplace_back(JournalCreate{{addr}, existed});
347
89.6k
}
348
349
void State::journal_destruct(const address& addr)
350
4.14k
{
351
4.14k
    m_journal.emplace_back(JournalDestruct{addr});
352
4.14k
}
353
354
void State::journal_access_account(const address& addr)
355
583k
{
356
583k
    m_journal.emplace_back(JournalAccessAccount{addr});
357
583k
}
358
359
void State::rollback(size_t checkpoint)
360
2.40M
{
361
12.7M
    while (m_journal.size() != checkpoint)
362
10.3M
    {
363
10.3M
        std::visit(
364
10.3M
            [this](const auto& e) {
365
10.3M
                using T = std::decay_t<decltype(e)>;
366
                if constexpr (std::is_same_v<T, JournalNonceBump>)
367
6.08k
                {
368
6.08k
                    get(e.addr).nonce -= 1;
369
                }
370
                else if constexpr (std::is_same_v<T, JournalTouched>)
371
0
                {
372
0
                    get(e.addr).erase_if_empty = false;
373
                }
374
                else if constexpr (std::is_same_v<T, JournalDestruct>)
375
72
                {
376
72
                    get(e.addr).destructed = false;
377
                }
378
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
379
14.2k
                {
380
14.2k
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
381
                }
382
                else if constexpr (std::is_same_v<T, JournalCreate>)
383
10.0k
                {
384
10.0k
                    if (e.existed)
385
9.76k
                    {
386
                        // This account is not always "touched". TODO: Why?
387
9.76k
                        auto& a = get(e.addr);
388
9.76k
                        a.nonce = 0;
389
9.76k
                        a.code_hash = Account::EMPTY_CODE_HASH;
390
9.76k
                        a.code.clear();
391
9.76k
                    }
392
243
                    else
393
243
                    {
394
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
395
                        //       so we need to delete them here explicitly.
396
                        //       This should be changed by tuning "erasable" flag
397
                        //       and clear in all revisions.
398
243
                        m_modified.erase(e.addr);
399
243
                    }
400
                }
401
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
402
1.18M
                {
403
1.18M
                    auto& s = get(e.addr).storage.find(e.key)->second;
404
1.18M
                    s.current = e.prev_value;
405
1.18M
                    s.access_status = e.prev_access_status;
406
                }
407
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
408
9.06M
                {
409
9.06M
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
410
9.06M
                    s = e.prev_value;
411
                }
412
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
413
32.0k
                {
414
32.0k
                    get(e.addr).balance = e.prev_balance;
415
                }
416
                else
417
                {
418
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
419
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
420
                }
421
10.3M
            },
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalBalanceChangeEEEDaRKT_
Line
Count
Source
364
32.0k
            [this](const auto& e) {
365
32.0k
                using T = std::decay_t<decltype(e)>;
366
                if constexpr (std::is_same_v<T, JournalNonceBump>)
367
                {
368
                    get(e.addr).nonce -= 1;
369
                }
370
                else if constexpr (std::is_same_v<T, JournalTouched>)
371
                {
372
                    get(e.addr).erase_if_empty = false;
373
                }
374
                else if constexpr (std::is_same_v<T, JournalDestruct>)
375
                {
376
                    get(e.addr).destructed = false;
377
                }
378
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
379
                {
380
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
381
                }
382
                else if constexpr (std::is_same_v<T, JournalCreate>)
383
                {
384
                    if (e.existed)
385
                    {
386
                        // This account is not always "touched". TODO: Why?
387
                        auto& a = get(e.addr);
388
                        a.nonce = 0;
389
                        a.code_hash = Account::EMPTY_CODE_HASH;
390
                        a.code.clear();
391
                    }
392
                    else
393
                    {
394
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
395
                        //       so we need to delete them here explicitly.
396
                        //       This should be changed by tuning "erasable" flag
397
                        //       and clear in all revisions.
398
                        m_modified.erase(e.addr);
399
                    }
400
                }
401
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
402
                {
403
                    auto& s = get(e.addr).storage.find(e.key)->second;
404
                    s.current = e.prev_value;
405
                    s.access_status = e.prev_access_status;
406
                }
407
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
408
                {
409
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
410
                    s = e.prev_value;
411
                }
412
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
413
32.0k
                {
414
32.0k
                    get(e.addr).balance = e.prev_balance;
415
                }
416
                else
417
                {
418
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
419
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
420
                }
421
32.0k
            },
Unexecuted instantiation: state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_14JournalTouchedEEEDaRKT_
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalStorageChangeEEEDaRKT_
Line
Count
Source
364
1.18M
            [this](const auto& e) {
365
1.18M
                using T = std::decay_t<decltype(e)>;
366
                if constexpr (std::is_same_v<T, JournalNonceBump>)
367
                {
368
                    get(e.addr).nonce -= 1;
369
                }
370
                else if constexpr (std::is_same_v<T, JournalTouched>)
371
                {
372
                    get(e.addr).erase_if_empty = false;
373
                }
374
                else if constexpr (std::is_same_v<T, JournalDestruct>)
375
                {
376
                    get(e.addr).destructed = false;
377
                }
378
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
379
                {
380
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
381
                }
382
                else if constexpr (std::is_same_v<T, JournalCreate>)
383
                {
384
                    if (e.existed)
385
                    {
386
                        // This account is not always "touched". TODO: Why?
387
                        auto& a = get(e.addr);
388
                        a.nonce = 0;
389
                        a.code_hash = Account::EMPTY_CODE_HASH;
390
                        a.code.clear();
391
                    }
392
                    else
393
                    {
394
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
395
                        //       so we need to delete them here explicitly.
396
                        //       This should be changed by tuning "erasable" flag
397
                        //       and clear in all revisions.
398
                        m_modified.erase(e.addr);
399
                    }
400
                }
401
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
402
1.18M
                {
403
1.18M
                    auto& s = get(e.addr).storage.find(e.key)->second;
404
1.18M
                    s.current = e.prev_value;
405
1.18M
                    s.access_status = e.prev_access_status;
406
                }
407
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
408
                {
409
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
410
                    s = e.prev_value;
411
                }
412
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
413
                {
414
                    get(e.addr).balance = e.prev_balance;
415
                }
416
                else
417
                {
418
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
419
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
420
                }
421
1.18M
            },
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_16JournalNonceBumpEEEDaRKT_
Line
Count
Source
364
6.08k
            [this](const auto& e) {
365
6.08k
                using T = std::decay_t<decltype(e)>;
366
                if constexpr (std::is_same_v<T, JournalNonceBump>)
367
6.08k
                {
368
6.08k
                    get(e.addr).nonce -= 1;
369
                }
370
                else if constexpr (std::is_same_v<T, JournalTouched>)
371
                {
372
                    get(e.addr).erase_if_empty = false;
373
                }
374
                else if constexpr (std::is_same_v<T, JournalDestruct>)
375
                {
376
                    get(e.addr).destructed = false;
377
                }
378
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
379
                {
380
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
381
                }
382
                else if constexpr (std::is_same_v<T, JournalCreate>)
383
                {
384
                    if (e.existed)
385
                    {
386
                        // This account is not always "touched". TODO: Why?
387
                        auto& a = get(e.addr);
388
                        a.nonce = 0;
389
                        a.code_hash = Account::EMPTY_CODE_HASH;
390
                        a.code.clear();
391
                    }
392
                    else
393
                    {
394
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
395
                        //       so we need to delete them here explicitly.
396
                        //       This should be changed by tuning "erasable" flag
397
                        //       and clear in all revisions.
398
                        m_modified.erase(e.addr);
399
                    }
400
                }
401
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
402
                {
403
                    auto& s = get(e.addr).storage.find(e.key)->second;
404
                    s.current = e.prev_value;
405
                    s.access_status = e.prev_access_status;
406
                }
407
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
408
                {
409
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
410
                    s = e.prev_value;
411
                }
412
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
413
                {
414
                    get(e.addr).balance = e.prev_balance;
415
                }
416
                else
417
                {
418
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
419
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
420
                }
421
6.08k
            },
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_13JournalCreateEEEDaRKT_
Line
Count
Source
364
10.0k
            [this](const auto& e) {
365
10.0k
                using T = std::decay_t<decltype(e)>;
366
                if constexpr (std::is_same_v<T, JournalNonceBump>)
367
                {
368
                    get(e.addr).nonce -= 1;
369
                }
370
                else if constexpr (std::is_same_v<T, JournalTouched>)
371
                {
372
                    get(e.addr).erase_if_empty = false;
373
                }
374
                else if constexpr (std::is_same_v<T, JournalDestruct>)
375
                {
376
                    get(e.addr).destructed = false;
377
                }
378
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
379
                {
380
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
381
                }
382
                else if constexpr (std::is_same_v<T, JournalCreate>)
383
10.0k
                {
384
10.0k
                    if (e.existed)
385
9.76k
                    {
386
                        // This account is not always "touched". TODO: Why?
387
9.76k
                        auto& a = get(e.addr);
388
9.76k
                        a.nonce = 0;
389
9.76k
                        a.code_hash = Account::EMPTY_CODE_HASH;
390
9.76k
                        a.code.clear();
391
9.76k
                    }
392
243
                    else
393
243
                    {
394
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
395
                        //       so we need to delete them here explicitly.
396
                        //       This should be changed by tuning "erasable" flag
397
                        //       and clear in all revisions.
398
243
                        m_modified.erase(e.addr);
399
243
                    }
400
                }
401
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
402
                {
403
                    auto& s = get(e.addr).storage.find(e.key)->second;
404
                    s.current = e.prev_value;
405
                    s.access_status = e.prev_access_status;
406
                }
407
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
408
                {
409
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
410
                    s = e.prev_value;
411
                }
412
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
413
                {
414
                    get(e.addr).balance = e.prev_balance;
415
                }
416
                else
417
                {
418
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
419
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
420
                }
421
10.0k
            },
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_29JournalTransientStorageChangeEEEDaRKT_
Line
Count
Source
364
9.06M
            [this](const auto& e) {
365
9.06M
                using T = std::decay_t<decltype(e)>;
366
                if constexpr (std::is_same_v<T, JournalNonceBump>)
367
                {
368
                    get(e.addr).nonce -= 1;
369
                }
370
                else if constexpr (std::is_same_v<T, JournalTouched>)
371
                {
372
                    get(e.addr).erase_if_empty = false;
373
                }
374
                else if constexpr (std::is_same_v<T, JournalDestruct>)
375
                {
376
                    get(e.addr).destructed = false;
377
                }
378
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
379
                {
380
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
381
                }
382
                else if constexpr (std::is_same_v<T, JournalCreate>)
383
                {
384
                    if (e.existed)
385
                    {
386
                        // This account is not always "touched". TODO: Why?
387
                        auto& a = get(e.addr);
388
                        a.nonce = 0;
389
                        a.code_hash = Account::EMPTY_CODE_HASH;
390
                        a.code.clear();
391
                    }
392
                    else
393
                    {
394
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
395
                        //       so we need to delete them here explicitly.
396
                        //       This should be changed by tuning "erasable" flag
397
                        //       and clear in all revisions.
398
                        m_modified.erase(e.addr);
399
                    }
400
                }
401
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
402
                {
403
                    auto& s = get(e.addr).storage.find(e.key)->second;
404
                    s.current = e.prev_value;
405
                    s.access_status = e.prev_access_status;
406
                }
407
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
408
9.06M
                {
409
9.06M
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
410
9.06M
                    s = e.prev_value;
411
                }
412
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
413
                {
414
                    get(e.addr).balance = e.prev_balance;
415
                }
416
                else
417
                {
418
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
419
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
420
                }
421
9.06M
            },
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_15JournalDestructEEEDaRKT_
Line
Count
Source
364
72
            [this](const auto& e) {
365
72
                using T = std::decay_t<decltype(e)>;
366
                if constexpr (std::is_same_v<T, JournalNonceBump>)
367
                {
368
                    get(e.addr).nonce -= 1;
369
                }
370
                else if constexpr (std::is_same_v<T, JournalTouched>)
371
                {
372
                    get(e.addr).erase_if_empty = false;
373
                }
374
                else if constexpr (std::is_same_v<T, JournalDestruct>)
375
72
                {
376
72
                    get(e.addr).destructed = false;
377
                }
378
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
379
                {
380
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
381
                }
382
                else if constexpr (std::is_same_v<T, JournalCreate>)
383
                {
384
                    if (e.existed)
385
                    {
386
                        // This account is not always "touched". TODO: Why?
387
                        auto& a = get(e.addr);
388
                        a.nonce = 0;
389
                        a.code_hash = Account::EMPTY_CODE_HASH;
390
                        a.code.clear();
391
                    }
392
                    else
393
                    {
394
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
395
                        //       so we need to delete them here explicitly.
396
                        //       This should be changed by tuning "erasable" flag
397
                        //       and clear in all revisions.
398
                        m_modified.erase(e.addr);
399
                    }
400
                }
401
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
402
                {
403
                    auto& s = get(e.addr).storage.find(e.key)->second;
404
                    s.current = e.prev_value;
405
                    s.access_status = e.prev_access_status;
406
                }
407
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
408
                {
409
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
410
                    s = e.prev_value;
411
                }
412
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
413
                {
414
                    get(e.addr).balance = e.prev_balance;
415
                }
416
                else
417
                {
418
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
419
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
420
                }
421
72
            },
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalAccessAccountEEEDaRKT_
Line
Count
Source
364
14.2k
            [this](const auto& e) {
365
14.2k
                using T = std::decay_t<decltype(e)>;
366
                if constexpr (std::is_same_v<T, JournalNonceBump>)
367
                {
368
                    get(e.addr).nonce -= 1;
369
                }
370
                else if constexpr (std::is_same_v<T, JournalTouched>)
371
                {
372
                    get(e.addr).erase_if_empty = false;
373
                }
374
                else if constexpr (std::is_same_v<T, JournalDestruct>)
375
                {
376
                    get(e.addr).destructed = false;
377
                }
378
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
379
14.2k
                {
380
14.2k
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
381
                }
382
                else if constexpr (std::is_same_v<T, JournalCreate>)
383
                {
384
                    if (e.existed)
385
                    {
386
                        // This account is not always "touched". TODO: Why?
387
                        auto& a = get(e.addr);
388
                        a.nonce = 0;
389
                        a.code_hash = Account::EMPTY_CODE_HASH;
390
                        a.code.clear();
391
                    }
392
                    else
393
                    {
394
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
395
                        //       so we need to delete them here explicitly.
396
                        //       This should be changed by tuning "erasable" flag
397
                        //       and clear in all revisions.
398
                        m_modified.erase(e.addr);
399
                    }
400
                }
401
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
402
                {
403
                    auto& s = get(e.addr).storage.find(e.key)->second;
404
                    s.current = e.prev_value;
405
                    s.access_status = e.prev_access_status;
406
                }
407
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
408
                {
409
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
410
                    s = e.prev_value;
411
                }
412
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
413
                {
414
                    get(e.addr).balance = e.prev_balance;
415
                }
416
                else
417
                {
418
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
419
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
420
                }
421
14.2k
            },
422
10.3M
            m_journal.back());
423
10.3M
        m_journal.pop_back();
424
10.3M
    }
425
2.40M
}
426
427
/// Validates transaction and computes its execution gas limit (the amount of gas provided to EVM).
428
/// @return  Execution gas limit or transaction validation error.
429
std::variant<TransactionProperties, std::error_code> validate_transaction(
430
    const StateView& state_view, const BlockInfo& block, const Transaction& tx, evmc_revision rev,
431
    int64_t block_gas_left, int64_t blob_gas_left) noexcept
432
143k
{
433
143k
    switch (tx.type)  // Validate "special" transaction types.
434
143k
    {
435
13.1k
    case Transaction::Type::blob:
436
13.1k
        if (rev < EVMC_CANCUN)
437
4
            return make_error_code(TX_TYPE_NOT_SUPPORTED);
438
13.1k
        if (!tx.to.has_value())
439
6
            return make_error_code(CREATE_BLOB_TX);
440
13.1k
        if (tx.blob_hashes.empty())
441
12
            return make_error_code(EMPTY_BLOB_HASHES_LIST);
442
13.1k
        if (rev >= EVMC_OSAKA && 
tx.blob_hashes.size() > MAX_TX_BLOB_COUNT5.08k
)
  MC/DC Decision Region (442:13) to (442:75)
+
+  Number of Conditions: 2
+     Condition C1 --> (442:13)
+     Condition C2 --> (442:34)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
443
11
            return make_error_code(BLOB_GAS_LIMIT_EXCEEDED);
444
445
13.1k
        assert(block.blob_base_fee.has_value());
446
13.1k
        if (tx.max_blob_gas_price < *block.blob_base_fee)
447
12
            return make_error_code(BLOB_FEE_CAP_LESS_THAN_BLOCKS);
448
449
41.6k
        
if (13.1k
std::ranges::any_of(tx.blob_hashes, [](const auto& h) 13.1k
{ return h.bytes[0] != 0x01; }))
450
42
            return make_error_code(INVALID_BLOB_HASH_VERSION);
451
13.1k
        if (std::cmp_greater(tx.blob_gas_used(), blob_gas_left))
452
119
            return make_error_code(BLOB_GAS_LIMIT_EXCEEDED);
453
12.9k
        break;
454
455
12.9k
    case Transaction::Type::set_code:
456
2.59k
        if (rev < EVMC_PRAGUE)
457
4
            return make_error_code(TX_TYPE_NOT_SUPPORTED);
458
2.59k
        if (!tx.to.has_value())
459
4
            return make_error_code(CREATE_SET_CODE_TX);
460
2.59k
        if (tx.authorization_list.empty())
461
4
            return make_error_code(EMPTY_AUTHORIZATION_LIST);
462
2.58k
        break;
463
464
2.58k
    case Transaction::Type::initcodes:
465
0
        if (rev < EVMC_EXPERIMENTAL)
466
0
            return make_error_code(TX_TYPE_NOT_SUPPORTED);
467
0
        if (tx.initcodes.size() > MAX_INITCODE_COUNT)
468
0
            return make_error_code(INIT_CODE_COUNT_LIMIT_EXCEEDED);
469
0
        if (tx.initcodes.empty())
470
0
            return make_error_code(INIT_CODE_COUNT_ZERO);
471
0
        if (std::ranges::any_of(
472
0
                tx.initcodes, [](const bytes& v) { return v.size() > MAX_INITCODE_SIZE; }))
473
0
            return make_error_code(INIT_CODE_SIZE_LIMIT_EXCEEDED);
474
0
        if (std::ranges::any_of(tx.initcodes, [](const bytes& v) { return v.empty(); }))
475
0
            return make_error_code(INIT_CODE_EMPTY);
476
0
        break;
477
478
127k
    default:;
479
143k
    }
480
481
143k
    switch (tx.type)  // Validate the "regular" transaction type hierarchy.
482
143k
    {
483
0
    case Transaction::Type::initcodes:
484
2.58k
    case Transaction::Type::set_code:
485
15.5k
    case Transaction::Type::blob:
486
20.4k
    case Transaction::Type::eip1559:
487
20.4k
        if (rev < EVMC_LONDON)
488
0
            return make_error_code(TX_TYPE_NOT_SUPPORTED);
489
490
20.4k
        if (tx.max_priority_gas_price > tx.max_gas_price)
491
10
            return make_error_code(TIP_GT_FEE_CAP);  // Priority gas price is too high.
492
20.4k
        [[fallthrough]];
493
494
26.7k
    case Transaction::Type::access_list:
495
26.7k
        if (rev < EVMC_BERLIN)
496
0
            return make_error_code(TX_TYPE_NOT_SUPPORTED);
497
26.7k
        [[fallthrough]];
498
499
143k
    case Transaction::Type::legacy:;
500
143k
    }
501
502
143k
    assert(tx.max_priority_gas_price <= tx.max_gas_price);
503
504
143k
    if (rev >= EVMC_OSAKA && 
tx.gas_limit > MAX_TX_GAS_LIMIT43.7k
)
  MC/DC Decision Region (504:9) to (504:61)
+
+  Number of Conditions: 2
+     Condition C1 --> (504:9)
+     Condition C2 --> (504:30)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
505
21
        return make_error_code(MAX_GAS_LIMIT_EXCEEDED);
506
507
143k
    if (tx.gas_limit > block_gas_left)
508
7
        return make_error_code(GAS_LIMIT_REACHED);
509
510
143k
    if (tx.max_gas_price < block.base_fee)
511
28
        return make_error_code(FEE_CAP_LESS_THAN_BLOCKS);
512
513
    // We need some information about the sender so lookup the account in the state.
514
    // TODO: During transaction execution this account will be also needed, so we may pass it along.
515
143k
    const auto sender_acc = state_view.get_account(tx.sender).value_or(
516
143k
        StateView::Account{.code_hash = Account::EMPTY_CODE_HASH});
517
518
143k
    if (sender_acc.code_hash != Account::EMPTY_CODE_HASH &&
519
143k
        
!is_code_delegated(state_view.get_account_code(tx.sender))120
)
  MC/DC Decision Region (518:9) to (519:67)
+
+  Number of Conditions: 2
+     Condition C1 --> (518:9)
+     Condition C2 --> (519:9)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
520
74
        return make_error_code(SENDER_NOT_EOA);  // Origin must not be a contract (EIP-3607).
521
522
143k
    if (sender_acc.nonce == Account::NonceMax)  // Nonce value limit (EIP-2681).
523
12
        return make_error_code(NONCE_HAS_MAX_VALUE);
524
525
143k
    if (sender_acc.nonce < tx.nonce)
526
12
        return make_error_code(NONCE_TOO_HIGH);
527
528
143k
    if (sender_acc.nonce > tx.nonce)
529
2
        return make_error_code(NONCE_TOO_LOW);
530
531
    // initcode size is limited by EIP-3860.
532
143k
    if (rev >= EVMC_SHANGHAI && 
!tx.to.has_value()126k
&&
tx.data.size() > MAX_INITCODE_SIZE39.0k
)
  MC/DC Decision Region (532:9) to (532:89)
+
+  Number of Conditions: 3
+     Condition C1 --> (532:9)
+     Condition C2 --> (532:33)
+     Condition C3 --> (532:55)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  F,  -  = F      }
+  3 { T,  T,  F  = F      }
+  4 { T,  T,  T  = T      }
+
+  C1-Pair: covered: (1,4)
+  C2-Pair: covered: (2,4)
+  C3-Pair: covered: (3,4)
+  MC/DC Coverage for Expression: 100.00%
+
533
22
        return make_error_code(INIT_CODE_SIZE_LIMIT_EXCEEDED);
534
535
    // Compute and check if sender has enough balance for the theoretical maximum transaction cost.
536
    // Note this is different from tx_max_cost computed with effective gas price later.
537
    // The computation cannot overflow if done with 512-bit precision.
538
143k
    auto max_total_fee = umul(uint256{tx.gas_limit}, tx.max_gas_price);
539
143k
    max_total_fee += tx.value;
540
541
143k
    if (tx.type == Transaction::Type::blob)
542
12.9k
    {
543
12.9k
        const auto total_blob_gas = tx.blob_gas_used();
544
        // FIXME: Can overflow uint256.
545
12.9k
        max_total_fee += total_blob_gas * tx.max_blob_gas_price;
546
12.9k
    }
547
143k
    if (sender_acc.balance < max_total_fee)
548
1.83k
        return make_error_code(INSUFFICIENT_FUNDS);
549
550
141k
    const auto [intrinsic_cost, min_cost] = compute_tx_intrinsic_cost(rev, tx);
551
141k
    if (tx.gas_limit < std::max(intrinsic_cost, min_cost))
552
4.36k
        return make_error_code(INTRINSIC_GAS_TOO_LOW);
553
554
136k
    const auto execution_gas_limit = tx.gas_limit - intrinsic_cost;
555
136k
    return TransactionProperties{execution_gas_limit, min_cost};
556
141k
}
557
558
StateDiff finalize(const StateView& state_view, evmc_revision rev, const address& coinbase,
559
    std::optional<uint64_t> block_reward, std::span<const Ommer> ommers,
560
    std::span<const Withdrawal> withdrawals)
561
138k
{
562
138k
    State state{state_view};
563
    // TODO: The block reward can be represented as a withdrawal.
564
138k
    if (block_reward.has_value())
565
68.9k
    {
566
68.9k
        const auto reward = *block_reward;
567
68.9k
        assert(reward % 32 == 0);  // Assume block reward is divisible by 32.
568
68.9k
        const auto reward_by_32 = reward / 32;
569
68.9k
        const auto reward_by_8 = reward / 8;
570
571
68.9k
        state.touch(coinbase).balance += reward + reward_by_32 * ommers.size();
572
68.9k
        for (const auto& ommer : ommers)
573
0
        {
574
0
            assert(ommer.delta > 0 && ommer.delta < 8);
575
0
            state.touch(ommer.beneficiary).balance += reward_by_8 * (8 - ommer.delta);
576
0
        }
577
68.9k
    }
578
579
138k
    for (const auto& withdrawal : withdrawals)
580
4.03k
        state.touch(withdrawal.recipient).balance += withdrawal.get_amount();
581
582
138k
    return state.build_diff(rev);
583
138k
}
584
585
TransactionReceipt transition(const StateView& state_view, const BlockInfo& block,
586
    const BlockHashes& block_hashes, const Transaction& tx, evmc_revision rev, evmc::VM& vm,
587
    const TransactionProperties& tx_props)
588
136k
{
589
136k
    State state{state_view};
590
591
136k
    auto& sender_acc = state.get_or_insert(tx.sender);
592
136k
    assert(sender_acc.nonce < Account::NonceMax);  // Required for valid tx.
593
136k
    ++sender_acc.nonce;                            // Bump sender nonce.
594
595
136k
    const auto delegation_refund =
596
136k
        process_authorization_list(state, tx.chain_id, tx.authorization_list);
597
598
136k
    const auto base_fee = (rev >= EVMC_LONDON) ? 
block.base_fee127k
:
09.34k
;
599
136k
    assert(tx.max_gas_price >= base_fee);                   // Required for valid tx.
600
136k
    assert(tx.max_gas_price >= tx.max_priority_gas_price);  // Required for valid tx.
601
136k
    const auto priority_gas_price =
602
136k
        std::min(tx.max_priority_gas_price, tx.max_gas_price - base_fee);
603
136k
    const auto effective_gas_price = base_fee + priority_gas_price;
604
605
136k
    assert(effective_gas_price <= tx.max_gas_price);  // Required for valid tx.
606
136k
    const auto tx_max_cost = tx.gas_limit * effective_gas_price;
607
608
136k
    sender_acc.balance -= tx_max_cost;  // Modify sender balance after all checks.
609
610
136k
    if (tx.type == Transaction::Type::blob)
611
11.6k
    {
612
        // This uint64 * uint256 cannot overflow, because tx.blob_gas_used has limits enforced
613
        // before this stage.
614
11.6k
        assert(block.blob_base_fee.has_value());
615
11.6k
        const auto blob_fee = intx::umul(intx::uint256(tx.blob_gas_used()), *block.blob_base_fee);
616
11.6k
        assert(blob_fee <= std::numeric_limits<intx::uint256>::max());
617
11.6k
        assert(sender_acc.balance >= blob_fee);  // Required for valid tx.
618
11.6k
        sender_acc.balance -= intx::uint256(blob_fee);
619
11.6k
    }
620
621
136k
    Host host{rev, vm, state, block, block_hashes, tx};
622
623
136k
    sender_acc.access_status = EVMC_ACCESS_WARM;  // Tx sender is always warm.
624
136k
    if (tx.to.has_value())
625
98.3k
        host.access_account(*tx.to);
626
136k
    for (const auto& [a, storage_keys] : tx.access_list)
627
114k
    {
628
114k
        host.access_account(a);
629
114k
        for (const auto& key : storage_keys)
630
70.3k
            state.get_storage(a, key).access_status = EVMC_ACCESS_WARM;
631
114k
    }
632
    // EIP-3651: Warm COINBASE.
633
    // This may create an empty coinbase account. The account cannot be created unconditionally
634
    // because this breaks old revisions.
635
136k
    if (rev >= EVMC_SHANGHAI)
636
121k
        host.access_account(block.coinbase);
637
638
136k
    auto message = build_message(tx, tx_props.execution_gas_limit);
639
136k
    if (tx.to.has_value())
640
98.3k
    {
641
98.3k
        if (const auto delegate = get_delegate_address(host, *tx.to))
642
532
        {
643
532
            message.code_address = *delegate;
644
532
            message.flags |= EVMC_DELEGATED;
645
532
            host.access_account(message.code_address);
646
532
        }
647
98.3k
    }
648
649
136k
    const auto result = host.call(message);
650
651
136k
    auto gas_used = tx.gas_limit - result.gas_left;
652
653
136k
    const auto max_refund_quotient = rev >= EVMC_LONDON ? 
5127k
:
29.34k
;
654
136k
    const auto refund_limit = gas_used / max_refund_quotient;
655
136k
    const auto refund = std::min(delegation_refund + result.gas_refund, refund_limit);
656
136k
    gas_used -= refund;
657
136k
    assert(gas_used > 0);
658
659
    // EIP-7623: The gas used by the transaction must be at least the min_gas_cost.
660
136k
    gas_used = std::max(gas_used, tx_props.min_gas_cost);
661
662
136k
    sender_acc.balance += tx_max_cost - gas_used * effective_gas_price;
663
136k
    state.touch(block.coinbase).balance += gas_used * priority_gas_price;
664
665
    // Cumulative gas used is unknown in this scope.
666
136k
    TransactionReceipt receipt{
667
136k
        tx.type, result.status_code, gas_used, {}, host.take_logs(), {}, state.build_diff(rev)};
668
669
    // Cannot put it into constructor call because logs are std::moved from host instance.
670
136k
    receipt.logs_bloom_filter = compute_bloom_filter(receipt.logs);
671
672
136k
    return receipt;
673
136k
}
674
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/state.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/state.hpp.html new file mode 100644 index 0000000000..0a921a4ab1 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/state.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/state.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include "account.hpp"
8
#include "block.hpp"
9
#include "bloom_filter.hpp"
10
#include "errors.hpp"
11
#include "hash_utils.hpp"
12
#include "state_diff.hpp"
13
#include "state_view.hpp"
14
#include "transaction.hpp"
15
#include <variant>
16
17
namespace evmone::state
18
{
19
/// The Ethereum State: the collection of accounts mapped by their addresses.
20
class State
21
{
22
    struct JournalBase
23
    {
24
        address addr;
25
    };
26
27
    struct JournalBalanceChange : JournalBase
28
    {
29
        intx::uint256 prev_balance;
30
    };
31
32
    struct JournalTouched : JournalBase
33
    {};
34
35
    struct JournalStorageChange : JournalBase
36
    {
37
        bytes32 key;
38
        bytes32 prev_value;
39
        evmc_access_status prev_access_status;
40
    };
41
42
    struct JournalTransientStorageChange : JournalBase
43
    {
44
        bytes32 key;
45
        bytes32 prev_value;
46
    };
47
48
    struct JournalNonceBump : JournalBase
49
    {};
50
51
    struct JournalCreate : JournalBase
52
    {
53
        bool existed;
54
    };
55
56
    struct JournalDestruct : JournalBase
57
    {};
58
59
    struct JournalAccessAccount : JournalBase
60
    {};
61
62
    using JournalEntry =
63
        std::variant<JournalBalanceChange, JournalTouched, JournalStorageChange, JournalNonceBump,
64
            JournalCreate, JournalTransientStorageChange, JournalDestruct, JournalAccessAccount>;
65
66
    /// The read-only view of the initial (cold) state.
67
    const StateView& m_initial;
68
69
    /// The accounts loaded from the initial state and potentially modified.
70
    std::unordered_map<address, Account> m_modified;
71
72
    /// The state journal: the list of changes made to the state
73
    /// with information how to revert them.
74
    std::vector<JournalEntry> m_journal;
75
76
public:
77
435k
    explicit State(const StateView& state_view) noexcept : m_initial{state_view} {}
78
    State(const State&) = delete;
79
    State(State&&) = delete;
80
    State& operator=(State&&) = delete;
81
82
    /// Inserts the new account at the address.
83
    /// There must not exist any account under this address before.
84
    Account& insert(const address& addr, Account account = {});
85
86
    /// Returns the pointer to the account at the address if the account exists. Null otherwise.
87
    Account* find(const address& addr) noexcept;
88
89
    /// Gets the account at the address (the account must exist).
90
    Account& get(const address& addr) noexcept;
91
92
    /// Gets an existing account or inserts new account.
93
    Account& get_or_insert(const address& addr, Account account = {});
94
95
    bytes_view get_code(const address& addr);
96
97
    StorageValue& get_storage(const address& addr, const bytes32& key);
98
99
    StateDiff build_diff(evmc_revision rev) const;
100
101
    /// Returns the state journal checkpoint. It can be later used to in rollback()
102
    /// to revert changes newer than the checkpoint.
103
4.30M
    [[nodiscard]] size_t checkpoint() const noexcept { return m_journal.size(); }
104
105
    /// Reverts state changes made after the checkpoint.
106
    void rollback(size_t checkpoint);
107
108
    /// Methods performing changes to the state which can be reverted by rollback().
109
    /// @{
110
111
    /// Touches (as in EIP-161) an existing account or inserts new erasable account.
112
    Account& touch(const address& addr);
113
114
    void journal_balance_change(const address& addr, const intx::uint256& prev_balance);
115
116
    void journal_storage_change(const address& addr, const bytes32& key, const StorageValue& value);
117
118
    void journal_transient_storage_change(
119
        const address& addr, const bytes32& key, const bytes32& value);
120
121
    void journal_bump_nonce(const address& addr);
122
123
    void journal_create(const address& addr, bool existed);
124
125
    void journal_destruct(const address& addr);
126
127
    void journal_access_account(const address& addr);
128
129
    /// @}
130
};
131
132
/// Finalize state after applying a "block" of transactions.
133
///
134
/// Applies block reward to coinbase, withdrawals (post Shanghai) and deletes empty touched accounts
135
/// (post Spurious Dragon).
136
[[nodiscard]] StateDiff finalize(const StateView& state_view, evmc_revision rev,
137
    const address& coinbase, std::optional<uint64_t> block_reward, std::span<const Ommer> ommers,
138
    std::span<const Withdrawal> withdrawals);
139
140
/// Executes a valid transaction.
141
///
142
/// @return Transaction receipt with state diff.
143
TransactionReceipt transition(const StateView& state, const BlockInfo& block,
144
    const BlockHashes& block_hashes, const Transaction& tx, evmc_revision rev, evmc::VM& vm,
145
    const TransactionProperties& tx_props);
146
147
/// Validate a transaction.
148
///
149
/// @return Computed execution gas limit or validation error.
150
[[nodiscard]] std::variant<TransactionProperties, std::error_code> validate_transaction(
151
    const StateView& state_view, const BlockInfo& block, const Transaction& tx, evmc_revision rev,
152
    int64_t block_gas_left, int64_t blob_gas_left) noexcept;
153
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/state_view.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/state_view.hpp.html new file mode 100644 index 0000000000..b01e63ad5c --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/state_view.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/state_view.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <evmc/evmc.hpp>
7
#include <intx/intx.hpp>
8
#include <optional>
9
10
namespace evmone::state
11
{
12
using evmc::address;
13
using evmc::bytes;
14
using evmc::bytes32;
15
using intx::uint256;
16
17
class StateView
18
{
19
public:
20
    struct Account
21
    {
22
        uint64_t nonce = 0;
23
        uint256 balance;
24
        bytes32 code_hash;
25
        bool has_storage = false;
26
    };
27
28
1.45M
    virtual ~StateView() = default;
29
    virtual std::optional<Account> get_account(const address& addr) const noexcept = 0;
30
    virtual bytes get_account_code(const address& addr) const noexcept = 0;
31
    virtual bytes32 get_storage(const address& addr, const bytes32& key) const noexcept = 0;
32
};
33
34
35
/// Interface to access hashes of known block headers.
36
class BlockHashes
37
{
38
public:
39
321k
    virtual ~BlockHashes() = default;
40
41
    /// Returns the hash of the block header of the given block number.
42
    virtual bytes32 get_block_hash(int64_t block_number) const noexcept = 0;
43
};
44
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/system_contracts.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/system_contracts.cpp.html new file mode 100644 index 0000000000..aa2460595f --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/system_contracts.cpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/system_contracts.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "system_contracts.hpp"
6
#include "host.hpp"
7
#include "state_view.hpp"
8
9
namespace evmone::state
10
{
11
namespace
12
{
13
/// Information about a registered "storage" system contract. They are executed at the block start
14
/// to store additional information in the State.
15
struct StorageSystemContract
16
{
17
    using GetInputFn = bytes32(const BlockInfo&, const BlockHashes&) noexcept;
18
19
    evmc_revision since = EVMC_MAX_REVISION;  ///< EVM revision in which added.
20
    address addr;                             ///< Address of the system contract.
21
    GetInputFn* get_input = nullptr;          ///< How to get the input for the system call.
22
};
23
24
/// Information about a registered "requests" system contract. They are executed at the block end
25
/// and produce requests: typed sequence of bytes.
26
struct RequestsSystemContract
27
{
28
    evmc_revision since = EVMC_MAX_REVISION;                ///< EVM revision in which added.
29
    address addr;                                           ///< Address of the system contract.
30
    Requests::Type request_type = Requests::Type::deposit;  ///< Type of requests produced.
31
};
32
33
/// Registered "storage" system contracts.
34
constexpr std::array STORAGE_SYSTEM_CONTRACTS{
35
    StorageSystemContract{EVMC_CANCUN, BEACON_ROOTS_ADDRESS,
36
64.6k
        [](const BlockInfo& block, const BlockHashes&) noexcept {
37
64.6k
            return block.parent_beacon_block_root;
38
64.6k
        }},
39
    StorageSystemContract{EVMC_PRAGUE, HISTORY_STORAGE_ADDRESS,
40
45.4k
        [](const BlockInfo& block, const BlockHashes& block_hashes) noexcept {
41
45.4k
            return block_hashes.get_block_hash(block.number - 1);
42
45.4k
        }},
43
};
44
45
/// Registered "requests" system contracts.
46
constexpr std::array REQUESTS_SYSTEM_CONTRACTS{
47
    RequestsSystemContract{
48
        EVMC_PRAGUE,
49
        WITHDRAWAL_REQUEST_ADDRESS,
50
        Requests::Type::withdrawal,
51
    },
52
    RequestsSystemContract{
53
        EVMC_PRAGUE,
54
        CONSOLIDATION_REQUEST_ADDRESS,
55
        Requests::Type::consolidation,
56
    },
57
};
58
59
0
constexpr auto by_rev = [](const auto& a, const auto& b) noexcept { return a.since < b.since; };
Unexecuted instantiation: system_contracts.cpp:auto evmone::state::(anonymous namespace)::$_0::operator()<evmone::state::(anonymous namespace)::StorageSystemContract, evmone::state::(anonymous namespace)::StorageSystemContract>(evmone::state::(anonymous namespace)::StorageSystemContract const&, evmone::state::(anonymous namespace)::StorageSystemContract const&) const
Unexecuted instantiation: system_contracts.cpp:auto evmone::state::(anonymous namespace)::$_0::operator()<evmone::state::(anonymous namespace)::RequestsSystemContract, evmone::state::(anonymous namespace)::RequestsSystemContract>(evmone::state::(anonymous namespace)::RequestsSystemContract const&, evmone::state::(anonymous namespace)::RequestsSystemContract const&) const
60
static_assert(std::ranges::is_sorted(STORAGE_SYSTEM_CONTRACTS, by_rev),
61
    "system contract entries must be ordered by revision");
62
static_assert(std::ranges::is_sorted(REQUESTS_SYSTEM_CONTRACTS, by_rev),
63
    "system contract entries must be ordered by revision");
64
65
66
evmc::Result execute_system_call(State& state, const BlockInfo& block,
67
    const BlockHashes& block_hashes, evmc_revision rev, evmc::VM& vm, const address& addr,
68
    bytes_view code, bytes_view input)
69
200k
{
70
200k
    const evmc_message msg{
71
200k
        .kind = EVMC_CALL,
72
200k
        .gas = 30'000'000,
73
200k
        .recipient = addr,
74
200k
        .sender = SYSTEM_ADDRESS,
75
200k
        .input_data = input.data(),
76
200k
        .input_size = input.size(),
77
200k
    };
78
79
200k
    const Transaction empty_tx{};
80
200k
    Host host{rev, vm, state, block, block_hashes, empty_tx};
81
200k
    return vm.execute(host, rev, msg, code.data(), code.size());
82
200k
}
83
}  // namespace
84
85
StateDiff system_call_block_start(const StateView& state_view, const BlockInfo& block,
86
    const BlockHashes& block_hashes, evmc_revision rev, evmc::VM& vm)
87
79.9k
{
88
79.9k
    State state{state_view};
89
79.9k
    for (const auto& [since, addr, get_input] : STORAGE_SYSTEM_CONTRACTS)
90
144k
    {
91
144k
        if (rev < since)
92
34.4k
            break;  // Because entries are ordered, there are no other contracts for this revision.
93
94
        // Skip the call if the target account doesn't exist. This is by EIP-4788 spec.
95
        // > if no code exists at [address], the call must fail silently.
96
110k
        const auto code = state_view.get_account_code(addr);
97
110k
        if (code.empty())
98
8
            continue;
99
100
110k
        const auto input32 = get_input(block, block_hashes);
101
110k
        const auto res =
102
110k
            execute_system_call(state, block, block_hashes, rev, vm, addr, code, input32);
103
110k
        assert(res.status_code == EVMC_SUCCESS);
104
110k
    }
105
    // TODO: Should we return empty diff if no system contracts?
106
79.9k
    return state.build_diff(rev);
107
79.9k
}
108
109
std::optional<RequestsResult> system_call_block_end(const StateView& state_view,
110
    const BlockInfo& block, const BlockHashes& block_hashes, evmc_revision rev, evmc::VM& vm)
111
79.9k
{
112
79.9k
    State state{state_view};
113
79.9k
    std::vector<Requests> requests;
114
79.9k
    for (const auto& [since, addr, request_type] : REQUESTS_SYSTEM_CONTRACTS)
115
125k
    {
116
125k
        if (rev < since)
117
34.4k
            break;  // Because entries are ordered, there are no other contracts for this revision.
118
119
90.9k
        const auto code = state_view.get_account_code(addr);
120
90.9k
        if (code.empty())
121
4
            return std::nullopt;
122
123
90.9k
        const auto res = execute_system_call(state, block, block_hashes, rev, vm, addr, code, {});
124
90.9k
        if (res.status_code != EVMC_SUCCESS)
125
12
            return std::nullopt;
126
90.8k
        requests.emplace_back(request_type, bytes_view{res.output_data, res.output_size});
127
90.8k
    }
128
79.9k
    return RequestsResult{state.build_diff(rev), requests};
129
79.9k
}
130
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/test_state.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/test_state.cpp.html new file mode 100644 index 0000000000..8c08c0817c --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/test_state.cpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/test_state.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#include "test_state.hpp"
5
#include "state.hpp"
6
#include "system_contracts.hpp"
7
8
namespace evmone::test
9
{
10
std::optional<state::StateView::Account> TestState::get_account(const address& addr) const noexcept
11
3.27M
{
12
3.27M
    const auto it = find(addr);
13
3.27M
    if (it == end())
14
2.42M
        return std::nullopt;
15
16
855k
    const auto& acc = it->second;
17
    // TODO: Cache code hash for MTP root hash calculation?
18
855k
    return Account{acc.nonce, acc.balance, keccak256(acc.code), !acc.storage.empty()};
19
3.27M
}
20
21
bytes TestState::get_account_code(const address& addr) const noexcept
22
463k
{
23
463k
    const auto it = find(addr);
24
463k
    if (it == end())
25
7
        return {};
26
27
463k
    return it->second.code;
28
463k
}
29
30
void TestState::apply(const state::StateDiff& diff)
31
435k
{
32
435k
    for (const auto& m : diff.modified_accounts)
33
832k
    {
34
832k
        auto& a = (*this)[m.addr];
35
832k
        a.nonce = m.nonce;
36
832k
        a.balance = m.balance;
37
832k
        if (m.code.has_value())
38
47.4k
            a.code = *m.code;  // TODO: Consider taking rvalue ref to avoid code copy.
39
832k
        for (const auto& [k, v] : m.modified_storage)
40
490k
        {
41
490k
            if (v)
42
448k
                a.storage.insert_or_assign(k, v);
43
42.5k
            else
44
42.5k
                a.storage.erase(k);
45
490k
        }
46
832k
    }
47
48
435k
    for (const auto& addr : diff.deleted_accounts)
49
282k
        erase(addr);
50
435k
}
51
52
bytes32 TestState::get_storage(const address& addr, const bytes32& key) const noexcept
53
1.85M
{
54
1.85M
    const auto ait = find(addr);
55
1.85M
    if (ait == end())  // TODO: When?
56
290k
        return bytes32{};
57
1.56M
    const auto& storage = ait->second.storage;
58
1.56M
    const auto it = storage.find(key);
59
1.56M
    return (it != storage.end()) ? 
it->second141k
:
bytes32{}1.42M
;
60
1.85M
}
61
62
bytes32 TestBlockHashes::get_block_hash(int64_t block_number) const noexcept
63
115k
{
64
115k
    if (const auto& it = find(block_number); it != end())
65
115k
        return it->second;
66
67
    // Convention for testing: if the block hash is unknown return the predefined "fake" value.
68
    // https://github.com/ethereum/go-ethereum/blob/v1.12.2/tests/state_test_util.go#L432
69
0
    const auto s = std::to_string(block_number);
70
0
    return keccak256({reinterpret_cast<const uint8_t*>(s.data()), s.size()});
71
115k
}
72
73
[[nodiscard]] std::variant<state::TransactionReceipt, std::error_code> transition(TestState& state,
74
    const state::BlockInfo& block, const state::BlockHashes& block_hashes,
75
    const state::Transaction& tx, evmc_revision rev, evmc::VM& vm, int64_t block_gas_left,
76
    int64_t blob_gas_left)
77
143k
{
78
143k
    const auto tx_props_or_error =
79
143k
        state::validate_transaction(state, block, tx, rev, block_gas_left, blob_gas_left);
80
143k
    if (const auto err = get_if<std::error_code>(&tx_props_or_error))
81
6.60k
        return *err;
82
83
136k
    auto receipt = state::transition(state, block, block_hashes, tx, rev, vm,
84
136k
        get<state::TransactionProperties>(tx_props_or_error));
85
136k
    state.apply(receipt.state_diff);
86
136k
    return receipt;
87
143k
}
88
89
void finalize(TestState& state, evmc_revision rev, const address& coinbase,
90
    std::optional<uint64_t> block_reward, std::span<const state::Ommer> ommers,
91
    std::span<const state::Withdrawal> withdrawals)
92
138k
{
93
138k
    const auto diff = state::finalize(state, rev, coinbase, block_reward, ommers, withdrawals);
94
138k
    state.apply(diff);
95
138k
}
96
97
void system_call_block_start(TestState& state, const state::BlockInfo& block,
98
    const state::BlockHashes& block_hashes, evmc_revision rev, evmc::VM& vm)
99
79.9k
{
100
79.9k
    const auto diff = state::system_call_block_start(state, block, block_hashes, rev, vm);
101
79.9k
    state.apply(diff);
102
79.9k
}
103
104
std::optional<std::vector<state::Requests>> system_call_block_end(TestState& state,
105
    const state::BlockInfo& block, const state::BlockHashes& block_hashes, evmc_revision rev,
106
    evmc::VM& vm)
107
79.9k
{
108
79.9k
    auto result = state::system_call_block_end(state, block, block_hashes, rev, vm);
109
79.9k
    if (!result.has_value())
110
16
        return std::nullopt;
111
79.9k
    state.apply(result->state_diff);
112
79.9k
    return std::move(result->requests);
113
79.9k
}
114
}  // namespace evmone::test
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/test_state.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/test_state.hpp.html new file mode 100644 index 0000000000..baa647ff87 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/test_state.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/test_state.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include "state_view.hpp"
7
#include <evmc/evmc.hpp>
8
#include <intx/intx.hpp>
9
#include <map>
10
#include <span>
11
#include <variant>
12
13
namespace evmone
14
{
15
namespace state
16
{
17
struct BlockInfo;
18
struct Ommer;
19
struct Requests;
20
struct StateDiff;
21
struct Transaction;
22
struct TransactionReceipt;
23
struct Withdrawal;
24
}  // namespace state
25
26
namespace test
27
{
28
using evmc::address;
29
using evmc::bytes;
30
using evmc::bytes32;
31
using intx::uint256;
32
33
/// Ethereum account representation for tests.
34
struct TestAccount
35
{
36
    uint64_t nonce = 0;
37
    uint256 balance;
38
    std::map<bytes32, bytes32> storage;
39
    bytes code;
40
41
0
    bool operator==(const TestAccount&) const noexcept = default;
42
};
43
44
/// Ethereum State representation for tests.
45
///
46
/// This is a simplified variant of state::State:
47
/// it hides some details related to transaction execution (e.g. original storage values)
48
/// and is also easier to work with in tests.
49
class TestState : public state::StateView, public std::map<address, TestAccount>
50
{
51
public:
52
    using map::map;
53
54
    std::optional<Account> get_account(const address& addr) const noexcept override;
55
    bytes get_account_code(const address& addr) const noexcept override;
56
    bytes32 get_storage(const address& addr, const bytes32& key) const noexcept override;
57
58
    /// Inserts new account to the state.
59
    ///
60
    /// This method is for compatibility with state::State::insert().
61
    /// Don't use it in new tests, use std::map interface instead.
62
    /// TODO: deprecate this method.
63
0
    void insert(const address& addr, TestAccount&& acc) { (*this)[addr] = std::move(acc); }
64
65
    /// Gets the reference to an existing account.
66
    ///
67
    /// This method is for compatibility with state::State::get().
68
    /// Don't use it in new tests, use std::map interface instead.
69
    /// TODO: deprecate this method.
70
0
    TestAccount& get(const address& addr) { return (*this)[addr]; }
71
72
    /// Apply the state changes.
73
    void apply(const state::StateDiff& diff);
74
};
75
76
class TestBlockHashes : public state::BlockHashes, public std::unordered_map<int64_t, bytes32>
77
{
78
public:
79
    using std::unordered_map<int64_t, bytes32>::unordered_map;
80
81
    bytes32 get_block_hash(int64_t block_number) const noexcept override;
82
};
83
84
/// Wrapping of state::transition() which operates on TestState.
85
[[nodiscard]] std::variant<state::TransactionReceipt, std::error_code> transition(TestState& state,
86
    const state::BlockInfo& block, const state::BlockHashes& block_hashes,
87
    const state::Transaction& tx, evmc_revision rev, evmc::VM& vm, int64_t block_gas_left,
88
    int64_t blob_gas_left);
89
90
/// Wrapping of state::finalize() which operates on TestState.
91
void finalize(TestState& state, evmc_revision rev, const address& coinbase,
92
    std::optional<uint64_t> block_reward, std::span<const state::Ommer> ommers,
93
    std::span<const state::Withdrawal> withdrawals);
94
95
/// Wrapping of state::system_call_block_start() which operates on TestState.
96
void system_call_block_start(TestState& state, const state::BlockInfo& block,
97
    const state::BlockHashes& block_hashes, evmc_revision rev, evmc::VM& vm);
98
99
/// Wrapping of state::system_call_block_end() which operates on TestState.
100
std::optional<std::vector<state::Requests>> system_call_block_end(TestState& state,
101
    const state::BlockInfo& block, const state::BlockHashes& block_hashes, evmc_revision rev,
102
    evmc::VM& vm);
103
}  // namespace test
104
}  // namespace evmone
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/transaction.cpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/transaction.cpp.html new file mode 100644 index 0000000000..6de116ca89 --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/transaction.cpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/transaction.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "transaction.hpp"
6
#include "../utils/stdx/utility.hpp"
7
#include "rlp.hpp"
8
9
10
namespace evmone::state
11
{
12
[[nodiscard]] bytes rlp_encode(const Log& log)
13
27.3k
{
14
27.3k
    return rlp::encode_tuple(log.addr, log.topics, log.data);
15
27.3k
}
16
17
[[nodiscard]] bytes rlp_encode(const Transaction& tx)
18
164k
{
19
    // There is no Transaction::Type 5 - reserved for Authorization List encoding in EIP-7702.
20
164k
    assert(tx.type <= Transaction::Type::initcodes && stdx::to_underlying(tx.type) != 5);
21
22
    // TODO: Refactor this function. For all type of transactions most of the code is similar.
23
164k
    if (tx.type == Transaction::Type::legacy)
24
133k
    {
25
        // rlp [nonce, gas_price, gas_limit, to, value, data, v, r, s];
26
133k
        return rlp::encode_tuple(tx.nonce, tx.max_gas_price, static_cast<uint64_t>(tx.gas_limit),
27
133k
            tx.to.has_value() ? 
tx.to.value()95.5k
:
bytes_view()38.3k
, tx.value, tx.data, tx.v, tx.r, tx.s);
28
133k
    }
29
30.9k
    else if (tx.type == Transaction::Type::access_list)
30
5.07k
    {
31
        // tx_type +
32
        // rlp [chain_id, nonce, gas_price, gas_limit, to, value, data, access_list, v, r, s];
33
5.07k
        return bytes{0x01} +  // Transaction type (eip2930 type == 1)
34
5.07k
               rlp::encode_tuple(tx.chain_id, tx.nonce, tx.max_gas_price,
35
5.07k
                   static_cast<uint64_t>(tx.gas_limit),
36
5.07k
                   tx.to.has_value() ? 
tx.to.value()4.65k
:
bytes_view()420
, tx.value, tx.data,
37
5.07k
                   tx.access_list, tx.v, tx.r, tx.s);
38
5.07k
    }
39
25.8k
    else if (tx.type == Transaction::Type::eip1559)
40
4.75k
    {
41
        // tx_type +
42
        // rlp [chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, to, value,
43
        // data, access_list, sig_parity, r, s];
44
4.75k
        return bytes{0x02} +  // Transaction type (eip1559 type == 2)
45
4.75k
               rlp::encode_tuple(tx.chain_id, tx.nonce, tx.max_priority_gas_price, tx.max_gas_price,
46
4.75k
                   static_cast<uint64_t>(tx.gas_limit),
47
4.75k
                   tx.to.has_value() ? 
tx.to.value()4.55k
:
bytes_view()194
, tx.value, tx.data,
48
4.75k
                   tx.access_list, tx.v, tx.r, tx.s);
49
4.75k
    }
50
21.0k
    else if (tx.type == Transaction::Type::blob)
51
18.4k
    {
52
        // tx_type +
53
        // rlp [chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, to, value,
54
        // data, access_list, max_fee_per_blob_gas, blob_versioned_hashes, sig_parity, r, s];
55
18.4k
        return bytes{stdx::to_underlying(Transaction::Type::blob)} +
56
18.4k
               rlp::encode_tuple(tx.chain_id, tx.nonce, tx.max_priority_gas_price, tx.max_gas_price,
57
18.4k
                   static_cast<uint64_t>(tx.gas_limit),
58
18.4k
                   tx.to.has_value() ? 
tx.to.value()18.4k
:
bytes_view()3
, tx.value, tx.data,
59
18.4k
                   tx.access_list, tx.max_blob_gas_price, tx.blob_hashes, tx.v, tx.r, tx.s);
60
18.4k
    }
61
2.58k
    else if (tx.type == Transaction::Type::set_code)
62
2.58k
    {
63
        // tx_type +
64
        // rlp [chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, to, value,
65
        // data, access_list, authorization_list, sig_parity, r, s];
66
2.58k
        return bytes{0x04} +  // Transaction type (set_code type == 4)
67
2.58k
               rlp::encode_tuple(tx.chain_id, tx.nonce, tx.max_priority_gas_price, tx.max_gas_price,
68
2.58k
                   static_cast<uint64_t>(tx.gas_limit),
69
2.58k
                   tx.to.has_value() ? 
tx.to.value()2.58k
:
bytes_view()2
, tx.value, tx.data,
70
2.58k
                   tx.access_list, tx.authorization_list, tx.v, tx.r, tx.s);
71
2.58k
    }
72
0
    else  // Transaction::Type::initcodes
73
0
    {
74
        // tx_type +
75
        // rlp [chain_id, nonce, max_priority_fee_per_gas, max_fee_per_gas, gas_limit, to, value,
76
        // data, access_list, initcodes, sig_parity, r, s];
77
0
        return bytes{0x06} +  // Transaction type (initcodes type == 6)
78
0
               rlp::encode_tuple(tx.chain_id, tx.nonce, tx.max_priority_gas_price, tx.max_gas_price,
79
0
                   static_cast<uint64_t>(tx.gas_limit),
80
0
                   tx.to.has_value() ? tx.to.value() : bytes_view(), tx.value, tx.data,
81
0
                   tx.access_list, tx.initcodes, tx.v, tx.r, tx.s);
82
0
    }
83
164k
}
84
85
[[nodiscard]] bytes rlp_encode(const TransactionReceipt& receipt)
86
80.0k
{
87
80.0k
    if (receipt.post_state.has_value())
88
1.47k
    {
89
1.47k
        assert(receipt.type == Transaction::Type::legacy);
90
91
1.47k
        return rlp::encode_tuple(receipt.post_state.value(),
92
1.47k
            static_cast<uint64_t>(receipt.cumulative_gas_used),
93
1.47k
            bytes_view(receipt.logs_bloom_filter), receipt.logs);
94
1.47k
    }
95
78.5k
    else
96
78.5k
    {
97
78.5k
        const auto prefix = receipt.type == Transaction::Type::legacy ?
98
65.3k
                                bytes{} :
99
78.5k
                                
bytes{stdx::to_underlying(receipt.type)}13.2k
;
100
101
78.5k
        return prefix + rlp::encode_tuple(receipt.status == EVMC_SUCCESS,
102
78.5k
                            static_cast<uint64_t>(receipt.cumulative_gas_used),
103
78.5k
                            bytes_view(receipt.logs_bloom_filter), receipt.logs);
104
78.5k
    }
105
80.0k
}
106
107
[[nodiscard]] bytes rlp_encode(const Authorization& authorization)
108
43.5k
{
109
43.5k
    return rlp::encode_tuple(authorization.chain_id, authorization.addr, authorization.nonce,
110
43.5k
        authorization.v, authorization.r, authorization.s);
111
43.5k
}
112
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/transaction.hpp.html b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/transaction.hpp.html new file mode 100644 index 0000000000..24127b413f --- /dev/null +++ b/reports/coverage_eest_osaka/html/coverage/home/builder/project/test/state/transaction.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-09-29 12:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/builder/project/test/state/transaction.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include "blob_schedule.hpp"
8
#include "bloom_filter.hpp"
9
#include "state_diff.hpp"
10
#include <intx/intx.hpp>
11
#include <optional>
12
#include <vector>
13
14
namespace evmone::state
15
{
16
/// The maximum allowed gas limit for a transaction (EIP-7825).
17
constexpr auto MAX_TX_GAS_LIMIT = 0x1000000;  // 2**24
18
19
using AccessList = std::vector<std::pair<address, std::vector<bytes32>>>;
20
21
struct Authorization
22
{
23
    intx::uint256 chain_id;
24
    address addr;
25
    uint64_t nonce = 0;
26
    /// Signer is empty if it cannot be ecrecovered from r, s, v.
27
    std::optional<address> signer;
28
    intx::uint256 r;
29
    intx::uint256 s;
30
    intx::uint256 v;
31
};
32
33
using AuthorizationList = std::vector<Authorization>;
34
35
struct Transaction
36
{
37
    /// The type of the transaction.
38
    ///
39
    /// The format is defined by EIP-2718: Typed Transaction Envelope.
40
    /// https://eips.ethereum.org/EIPS/eip-2718.
41
    enum class Type : uint8_t
42
    {
43
        /// The legacy RLP-encoded transaction without leading "type" byte.
44
        legacy = 0,
45
46
        /// The typed transaction with optional account/storage access list.
47
        /// Introduced by EIP-2930 https://eips.ethereum.org/EIPS/eip-2930.
48
        access_list = 1,
49
50
        /// The typed transaction with priority gas price.
51
        /// Introduced by EIP-1559 https://eips.ethereum.org/EIPS/eip-1559.
52
        eip1559 = 2,
53
54
        /// The typed blob transaction (with array of blob hashes).
55
        /// Introduced by EIP-4844 https://eips.ethereum.org/EIPS/eip-4844.
56
        blob = 3,
57
58
        /// The typed set code transaction (with authorization list).
59
        /// Introduced by EIP-7702 https://eips.ethereum.org/EIPS/eip-7702.
60
        set_code = 4,
61
62
        /// The typed transaction with initcode list.
63
        /// Introduced by EIP-7873 https://eips.ethereum.org/EIPS/eip-7873.
64
        initcodes = 6,
65
    };
66
67
    /// Returns amount of blob gas used by this transaction
68
118k
    [[nodiscard]] uint64_t blob_gas_used() const { return GAS_PER_BLOB * blob_hashes.size(); }
69
70
    Type type = Type::legacy;
71
    bytes data;
72
    int64_t gas_limit;
73
    intx::uint256 max_gas_price;
74
    intx::uint256 max_priority_gas_price;
75
    intx::uint256 max_blob_gas_price;
76
    address sender;
77
    std::optional<address> to;
78
    intx::uint256 value;
79
    AccessList access_list;
80
    std::vector<bytes32> blob_hashes;
81
    uint64_t chain_id = 0;
82
    uint64_t nonce = 0;
83
    intx::uint256 r;
84
    intx::uint256 s;
85
    uint8_t v = 0;
86
    AuthorizationList authorization_list;
87
    std::vector<bytes> initcodes;
88
};
89
90
/// Transaction properties computed during the validation needed for the execution.
91
struct TransactionProperties
92
{
93
    /// The amount of gas provided to the EVM for the transaction execution.
94
    int64_t execution_gas_limit = 0;
95
96
    /// The minimal amount of gas the transaction must use.
97
    int64_t min_gas_cost = 0;
98
};
99
100
struct Log
101
{
102
    address addr;
103
    bytes data;
104
    std::vector<bytes32> topics;
105
};
106
107
/// Transaction Receipt
108
///
109
/// This struct is used in two contexts:
110
/// 1. As the formally specified, RLP-encode transaction receipt included in the Ethereum blocks.
111
/// 2. As the internal representation of the transaction execution result.
112
/// These both roles share most, but not all the information. There are some fields that cannot be
113
/// assigned in the single transaction execution context. There are also fields that are not a part
114
/// of the RLP-encoded transaction receipts.
115
/// TODO: Consider splitting the struct into two based on the duality explained above.
116
struct TransactionReceipt
117
{
118
    Transaction::Type type = Transaction::Type::legacy;
119
    evmc_status_code status = EVMC_INTERNAL_ERROR;
120
121
    /// Amount of gas used by this transaction.
122
    int64_t gas_used = 0;
123
124
    /// Amount of gas used by this and previous transactions in the block.
125
    int64_t cumulative_gas_used = 0;
126
    std::vector<Log> logs;
127
    BloomFilter logs_bloom_filter;
128
    StateDiff state_diff;
129
130
    /// Root hash of the state after this transaction. Used only in old pre-Byzantium transactions.
131
    std::optional<bytes32> post_state;
132
};
133
134
/// Defines how to RLP-encode a Transaction.
135
[[nodiscard]] bytes rlp_encode(const Transaction& tx);
136
137
/// Defines how to RLP-encode a TransactionReceipt.
138
[[nodiscard]] bytes rlp_encode(const TransactionReceipt& receipt);
139
140
/// Defines how to RLP-encode a Log.
141
[[nodiscard]] bytes rlp_encode(const Log& log);
142
143
/// Defines how to RLP-encode an Authorization (EIP-7702).
144
[[nodiscard]] bytes rlp_encode(const Authorization& authorization);
145
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/index.html b/reports/coverage_eest_osaka/html/index.html new file mode 100644 index 0000000000..94c90c762f --- /dev/null +++ b/reports/coverage_eest_osaka/html/index.html @@ -0,0 +1,3 @@ +

Coverage Report

Created: 2025-09-29 12:57

Click here for information about interpreting this report.

FilenameFunction CoverageLine CoverageRegion CoverageBranch CoverageMC/DC
include/evmmax/evmmax.hpp
 100.00% (10/10)
 100.00% (94/94)
 100.00% (51/51)
 100.00% (26/26)
   0.00% (0/2)
lib/evmone/baseline.hpp
  81.82% (9/11)
  90.32% (28/31)
  77.27% (17/22)
 100.00% (2/2)
- (0/0)
lib/evmone/baseline_analysis.cpp
  75.00% (3/4)
  78.05% (32/41)
  82.35% (14/17)
  70.00% (7/10)
   0.00% (0/2)
lib/evmone/baseline_execution.cpp
  71.43% (10/14)
  63.00% (126/200)
  53.43% (2541/4756)
  31.74% (338/1065)
  33.33% (2/6)
lib/evmone/baseline_instruction_table.cpp
 100.00% (1/1)
 100.00% (4/4)
  75.00% (3/4)
  50.00% (1/2)
- (0/0)
lib/evmone/delegation.cpp
 100.00% (1/1)
 100.00% (10/10)
 100.00% (6/6)
 100.00% (2/2)
- (0/0)
lib/evmone/delegation.hpp
 100.00% (1/1)
 100.00% (3/3)
 100.00% (1/1)
- (0/0)
- (0/0)
lib/evmone/execution_state.hpp
  75.00% (12/16)
  70.59% (48/68)
  56.82% (25/44)
  50.00% (9/18)
- (0/0)
lib/evmone/instructions.hpp
  84.91% (90/106)
  78.73% (585/743)
  81.59% (328/402)
  80.63% (179/222)
  85.00% (17/20)
lib/evmone/instructions_calls.cpp
  60.00% (3/5)
  50.53% (143/283)
  51.74% (119/230)
  54.32% (88/162)
  56.52% (13/23)
lib/evmone/instructions_storage.cpp
 100.00% (2/2)
 100.00% (34/34)
 100.00% (25/25)
 100.00% (20/20)
 100.00% (6/6)
lib/evmone_precompiles/blake2b.cpp
 100.00% (3/3)
 100.00% (48/48)
 100.00% (9/9)
 100.00% (4/4)
- (0/0)
lib/evmone_precompiles/bls.cpp
  86.67% (13/15)
  86.42% (229/265)
  89.39% (118/132)
  89.19% (66/74)
 100.00% (6/6)
lib/evmone_precompiles/bn254.cpp
 100.00% (2/2)
 100.00% (10/10)
 100.00% (4/4)
 100.00% (4/4)
 100.00% (2/2)
lib/evmone_precompiles/ecc.hpp
 100.00% (33/33)
  99.52% (208/209)
  98.90% (90/91)
  94.29% (33/35)
  75.00% (3/4)
lib/evmone_precompiles/keccak.c
  77.78% (7/9)
  96.89% (249/257)
  93.55% (29/31)
  87.50% (14/16)
   0.00% (0/2)
lib/evmone_precompiles/keccak.hpp
  50.00% (1/2)
  50.00% (3/6)
  50.00% (1/2)
- (0/0)
- (0/0)
lib/evmone_precompiles/kzg.cpp
 100.00% (8/8)
 100.00% (68/68)
 100.00% (32/32)
 100.00% (16/16)
- (0/0)
lib/evmone_precompiles/modexp.cpp
 100.00% (9/9)
 100.00% (110/110)
 100.00% (61/61)
  96.88% (31/32)
- (0/0)
lib/evmone_precompiles/pairing/bn254/fields.hpp
 100.00% (7/7)
 100.00% (78/78)
 100.00% (7/7)
- (0/0)
- (0/0)
lib/evmone_precompiles/pairing/bn254/pairing.cpp
 100.00% (4/4)
 100.00% (106/106)
 100.00% (46/46)
 100.00% (36/36)
 100.00% (13/13)
lib/evmone_precompiles/pairing/bn254/utils.hpp
 100.00% (24/24)
 100.00% (312/312)
 100.00% (34/34)
 100.00% (12/12)
 100.00% (4/4)
lib/evmone_precompiles/pairing/field_template.hpp
 100.00% (24/24)
 100.00% (65/65)
 100.00% (39/39)
 100.00% (10/10)
- (0/0)
lib/evmone_precompiles/ripemd160.cpp
 100.00% (12/12)
  94.37% (67/71)
  95.83% (23/24)
  90.00% (9/10)
- (0/0)
lib/evmone_precompiles/secp256k1.cpp
  83.33% (5/6)
  95.69% (111/116)
  97.33% (73/75)
  97.92% (47/48)
 100.00% (4/4)
lib/evmone_precompiles/secp256r1.cpp
 100.00% (2/2)
 100.00% (30/30)
 100.00% (24/24)
 100.00% (20/20)
 100.00% (6/6)
lib/evmone_precompiles/sha256.cpp
  70.00% (7/10)
  48.86% (150/307)
  61.11% (66/108)
  80.00% (32/40)
   0.00% (0/4)
test/state/account.hpp
 100.00% (1/1)
 100.00% (3/3)
 100.00% (5/5)
 100.00% (6/6)
 100.00% (3/3)
test/state/blob_schedule.hpp
 100.00% (1/1)
 100.00% (5/5)
 100.00% (4/4)
 100.00% (2/2)
- (0/0)
test/state/block.cpp
 100.00% (6/6)
  90.12% (73/81)
  96.30% (26/27)
  93.75% (15/16)
 100.00% (2/2)
test/state/block.hpp
 100.00% (1/1)
 100.00% (3/3)
 100.00% (1/1)
- (0/0)
- (0/0)
test/state/bloom_filter.cpp
 100.00% (4/4)
 100.00% (33/33)
 100.00% (10/10)
 100.00% (8/8)
- (0/0)
test/state/bloom_filter.hpp
 100.00% (1/1)
 100.00% (1/1)
 100.00% (1/1)
- (0/0)
- (0/0)
test/state/errors.hpp
  75.00% (3/4)
  89.52% (111/124)
  70.97% (22/31)
  88.00% (44/50)
- (0/0)
test/state/ethash_difficulty.cpp
   0.00% (0/4)
   0.00% (0/55)
   0.00% (0/38)
   0.00% (0/30)
- (0/0)
test/state/hash_utils.hpp
 100.00% (1/1)
 100.00% (3/3)
 100.00% (1/1)
- (0/0)
- (0/0)
test/state/host.cpp
  95.83% (23/24)
  91.98% (344/374)
  92.52% (235/254)
  87.35% (145/166)
  80.00% (32/40)
test/state/host.hpp
 100.00% (2/2)
  41.67% (5/12)
  81.82% (9/11)
  25.00% (1/4)
- (0/0)
test/state/mpt.cpp
  93.75% (15/16)
  97.09% (100/103)
  98.70% (76/77)
  97.22% (35/36)
 100.00% (4/4)
test/state/mpt_hash.cpp
 100.00% (3/3)
 100.00% (24/24)
 100.00% (10/10)
  87.50% (7/8)
- (0/0)
test/state/mpt_hash.hpp
 100.00% (1/1)
 100.00% (3/3)
 100.00% (1/1)
- (0/0)
- (0/0)
test/state/precompiles.cpp
 100.00% (49/49)
  98.68% (522/529)
  96.15% (275/286)
  92.25% (131/142)
  94.12% (16/17)
test/state/precompiles_stubs.cpp
  66.67% (2/3)
  53.19% (25/47)
  43.48% (10/23)
  21.43% (3/14)
   0.00% (0/5)
test/state/requests.cpp
 100.00% (2/2)
 100.00% (49/49)
 100.00% (22/22)
  93.75% (15/16)
  50.00% (1/2)
test/state/requests.hpp
  75.00% (3/4)
  87.50% (7/8)
  75.00% (3/4)
- (0/0)
- (0/0)
test/state/rlp.hpp
  91.67% (11/12)
  94.74% (54/57)
  96.77% (30/31)
 100.00% (12/12)
 100.00% (2/2)
test/state/state.cpp
  93.33% (28/30)
  94.41% (439/465)
  91.19% (269/295)
  91.18% (186/204)
  90.91% (20/22)
test/state/state.hpp
 100.00% (2/2)
 100.00% (2/2)
 100.00% (3/3)
- (0/0)
- (0/0)
test/state/state_view.hpp
 100.00% (2/2)
 100.00% (2/2)
 100.00% (2/2)
- (0/0)
- (0/0)
test/state/system_contracts.cpp
  83.33% (5/6)
  98.11% (52/53)
  96.15% (25/26)
 100.00% (14/14)
- (0/0)
test/state/test_state.cpp
 100.00% (9/9)
  97.18% (69/71)
  97.37% (37/38)
  95.83% (23/24)
- (0/0)
test/state/test_state.hpp
   0.00% (0/3)
   0.00% (0/3)
   0.00% (0/3)
- (0/0)
- (0/0)
test/state/transaction.cpp
 100.00% (4/4)
  89.04% (65/73)
  91.49% (43/47)
  88.46% (23/26)
- (0/0)
test/state/transaction.hpp
 100.00% (1/1)
 100.00% (1/1)
 100.00% (1/1)
- (0/0)
- (0/0)
Totals
  89.94% (483/537)
  85.97% (4946/5753)
  65.17% (4907/7529)
  62.91% (1676/2664)
  77.61% (156/201)

Files which contain no functions. (These files contain code pulled into other files by the preprocessor.) +

+
lib/evmone/instructions_xmacro.hpp
Generated by llvm-cov -- llvm version 20.1.4
\ No newline at end of file diff --git a/reports/coverage_eest_osaka/html/style.css b/reports/coverage_eest_osaka/html/style.css new file mode 100644 index 0000000000..ae4f09f692 --- /dev/null +++ b/reports/coverage_eest_osaka/html/style.css @@ -0,0 +1,194 @@ +.red { + background-color: #f004; +} +.cyan { + background-color: cyan; +} +html { + scroll-behavior: smooth; +} +body { + font-family: -apple-system, sans-serif; +} +pre { + margin-top: 0px !important; + margin-bottom: 0px !important; +} +.source-name-title { + padding: 5px 10px; + border-bottom: 1px solid #8888; + background-color: #0002; + line-height: 35px; +} +.centered { + display: table; + margin-left: left; + margin-right: auto; + border: 1px solid #8888; + border-radius: 3px; +} +.expansion-view { + margin-left: 0px; + margin-top: 5px; + margin-right: 5px; + margin-bottom: 5px; + border: 1px solid #8888; + border-radius: 3px; +} +table { + border-collapse: collapse; +} +.light-row { + border: 1px solid #8888; + border-left: none; + border-right: none; +} +.light-row-bold { + border: 1px solid #8888; + border-left: none; + border-right: none; + font-weight: bold; +} +.column-entry { + text-align: left; +} +.column-entry-bold { + font-weight: bold; + text-align: left; +} +.column-entry-yellow { + text-align: left; + background-color: #ff06; +} +.column-entry-red { + text-align: left; + background-color: #f004; +} +.column-entry-gray { + text-align: left; + background-color: #fff4; +} +.column-entry-green { + text-align: left; + background-color: #0f04; +} +.line-number { + text-align: right; +} +.covered-line { + text-align: right; + color: #06d; +} +.uncovered-line { + text-align: right; + color: #d00; +} +.uncovered-line.selected { + color: #f00; + font-weight: bold; +} +.region.red.selected { + background-color: #f008; + font-weight: bold; +} +.branch.red.selected { + background-color: #f008; + font-weight: bold; +} +.tooltip { + position: relative; + display: inline; + background-color: #bef; + text-decoration: none; +} +.tooltip span.tooltip-content { + position: absolute; + width: 100px; + margin-left: -50px; + color: #FFFFFF; + background: #000000; + height: 30px; + line-height: 30px; + text-align: center; + visibility: hidden; + border-radius: 6px; +} +.tooltip span.tooltip-content:after { + content: ''; + position: absolute; + top: 100%; + left: 50%; + margin-left: -8px; + width: 0; height: 0; + border-top: 8px solid #000000; + border-right: 8px solid transparent; + border-left: 8px solid transparent; +} +:hover.tooltip span.tooltip-content { + visibility: visible; + opacity: 0.8; + bottom: 30px; + left: 50%; + z-index: 999; +} +th, td { + vertical-align: top; + padding: 2px 8px; + border-collapse: collapse; + border-right: 1px solid #8888; + border-left: 1px solid #8888; + text-align: left; +} +td pre { + display: inline-block; + text-decoration: inherit; +} +td:first-child { + border-left: none; +} +td:last-child { + border-right: none; +} +tr:hover { + background-color: #eee; +} +tr:last-child { + border-bottom: none; +} +tr:has(> td >a:target), tr:has(> td.uncovered-line.selected) { + background-color: #8884; +} +a { + color: inherit; +} +.control { + position: fixed; + top: 0em; + right: 0em; + padding: 1em; + background: #FFF8; +} +@media (prefers-color-scheme: dark) { + body { + background-color: #222; + color: whitesmoke; + } + tr:hover { + background-color: #111; + } + .covered-line { + color: #39f; + } + .uncovered-line { + color: #f55; + } + .tooltip { + background-color: #068; + } + .control { + background: #2228; + } + tr:has(> td >a:target), tr:has(> td.uncovered-line.selected) { + background-color: #8884; + } +} diff --git a/reports/coverage_eest_osaka/report.txt b/reports/coverage_eest_osaka/report.txt new file mode 100644 index 0000000000..0423944918 --- /dev/null +++ b/reports/coverage_eest_osaka/report.txt @@ -0,0 +1,61 @@ +Filename Regions Missed Regions Cover Functions Missed Functions Executed Lines Missed Lines Cover Branches Missed Branches Cover MC/DC Conditions Missed Conditions Cover +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +include/evmmax/evmmax.hpp 51 0 100.00% 10 0 100.00% 94 0 100.00% 26 0 100.00% 2 2 0.00% +lib/evmone/baseline.hpp 22 5 77.27% 11 2 81.82% 31 3 90.32% 2 0 100.00% 0 0 - +lib/evmone/baseline_analysis.cpp 17 3 82.35% 4 1 75.00% 41 9 78.05% 10 3 70.00% 2 2 0.00% +lib/evmone/baseline_execution.cpp 4756 2215 53.43% 14 4 71.43% 200 74 63.00% 1065 727 31.74% 6 4 33.33% +lib/evmone/baseline_instruction_table.cpp 4 1 75.00% 1 0 100.00% 4 0 100.00% 2 1 50.00% 0 0 - +lib/evmone/delegation.cpp 6 0 100.00% 1 0 100.00% 10 0 100.00% 2 0 100.00% 0 0 - +lib/evmone/delegation.hpp 1 0 100.00% 1 0 100.00% 3 0 100.00% 0 0 - 0 0 - +lib/evmone/execution_state.hpp 44 19 56.82% 16 4 75.00% 68 20 70.59% 18 9 50.00% 0 0 - +lib/evmone/instructions.hpp 402 74 81.59% 106 16 84.91% 743 158 78.73% 222 43 80.63% 20 3 85.00% +lib/evmone/instructions_calls.cpp 230 111 51.74% 5 2 60.00% 283 140 50.53% 162 74 54.32% 23 10 56.52% +lib/evmone/instructions_storage.cpp 25 0 100.00% 2 0 100.00% 34 0 100.00% 20 0 100.00% 6 0 100.00% +lib/evmone_precompiles/blake2b.cpp 9 0 100.00% 3 0 100.00% 48 0 100.00% 4 0 100.00% 0 0 - +lib/evmone_precompiles/bls.cpp 132 14 89.39% 15 2 86.67% 265 36 86.42% 74 8 89.19% 6 0 100.00% +lib/evmone_precompiles/bn254.cpp 4 0 100.00% 2 0 100.00% 10 0 100.00% 4 0 100.00% 2 0 100.00% +lib/evmone_precompiles/ecc.hpp 91 1 98.90% 33 0 100.00% 209 1 99.52% 35 2 94.29% 4 1 75.00% +lib/evmone_precompiles/keccak.c 31 2 93.55% 9 2 77.78% 257 8 96.89% 16 2 87.50% 2 2 0.00% +lib/evmone_precompiles/keccak.hpp 2 1 50.00% 2 1 50.00% 6 3 50.00% 0 0 - 0 0 - +lib/evmone_precompiles/kzg.cpp 32 0 100.00% 8 0 100.00% 68 0 100.00% 16 0 100.00% 0 0 - +lib/evmone_precompiles/modexp.cpp 61 0 100.00% 9 0 100.00% 110 0 100.00% 32 1 96.88% 0 0 - +lib/evmone_precompiles/pairing/bn254/fields.hpp 7 0 100.00% 7 0 100.00% 78 0 100.00% 0 0 - 0 0 - +lib/evmone_precompiles/pairing/bn254/pairing.cpp 46 0 100.00% 4 0 100.00% 106 0 100.00% 36 0 100.00% 13 0 100.00% +lib/evmone_precompiles/pairing/bn254/utils.hpp 34 0 100.00% 24 0 100.00% 312 0 100.00% 12 0 100.00% 4 0 100.00% +lib/evmone_precompiles/pairing/field_template.hpp 39 0 100.00% 24 0 100.00% 65 0 100.00% 10 0 100.00% 0 0 - +lib/evmone_precompiles/ripemd160.cpp 24 1 95.83% 12 0 100.00% 71 4 94.37% 10 1 90.00% 0 0 - +lib/evmone_precompiles/secp256k1.cpp 75 2 97.33% 6 1 83.33% 116 5 95.69% 48 1 97.92% 4 0 100.00% +lib/evmone_precompiles/secp256r1.cpp 24 0 100.00% 2 0 100.00% 30 0 100.00% 20 0 100.00% 6 0 100.00% +lib/evmone_precompiles/sha256.cpp 108 42 61.11% 10 3 70.00% 307 157 48.86% 40 8 80.00% 4 4 0.00% +test/state/account.hpp 5 0 100.00% 1 0 100.00% 3 0 100.00% 6 0 100.00% 3 0 100.00% +test/state/blob_schedule.hpp 4 0 100.00% 1 0 100.00% 5 0 100.00% 2 0 100.00% 0 0 - +test/state/block.cpp 27 1 96.30% 6 0 100.00% 81 8 90.12% 16 1 93.75% 2 0 100.00% +test/state/block.hpp 1 0 100.00% 1 0 100.00% 3 0 100.00% 0 0 - 0 0 - +test/state/bloom_filter.cpp 10 0 100.00% 4 0 100.00% 33 0 100.00% 8 0 100.00% 0 0 - +test/state/bloom_filter.hpp 1 0 100.00% 1 0 100.00% 1 0 100.00% 0 0 - 0 0 - +test/state/errors.hpp 31 9 70.97% 4 1 75.00% 124 13 89.52% 50 6 88.00% 0 0 - +test/state/ethash_difficulty.cpp 38 38 0.00% 4 4 0.00% 55 55 0.00% 30 30 0.00% 0 0 - +test/state/hash_utils.hpp 1 0 100.00% 1 0 100.00% 3 0 100.00% 0 0 - 0 0 - +test/state/host.cpp 254 19 92.52% 24 1 95.83% 374 30 91.98% 166 21 87.35% 40 8 80.00% +test/state/host.hpp 11 2 81.82% 2 0 100.00% 12 7 41.67% 4 3 25.00% 0 0 - +test/state/mpt.cpp 77 1 98.70% 16 1 93.75% 103 3 97.09% 36 1 97.22% 4 0 100.00% +test/state/mpt_hash.cpp 10 0 100.00% 3 0 100.00% 24 0 100.00% 8 1 87.50% 0 0 - +test/state/mpt_hash.hpp 1 0 100.00% 1 0 100.00% 3 0 100.00% 0 0 - 0 0 - +test/state/precompiles.cpp 286 11 96.15% 49 0 100.00% 529 7 98.68% 142 11 92.25% 17 1 94.12% +test/state/precompiles_stubs.cpp 23 13 43.48% 3 1 66.67% 47 22 53.19% 14 11 21.43% 5 5 0.00% +test/state/requests.cpp 22 0 100.00% 2 0 100.00% 49 0 100.00% 16 1 93.75% 2 1 50.00% +test/state/requests.hpp 4 1 75.00% 4 1 75.00% 8 1 87.50% 0 0 - 0 0 - +test/state/rlp.hpp 31 1 96.77% 12 1 91.67% 57 3 94.74% 12 0 100.00% 2 0 100.00% +test/state/state.cpp 295 26 91.19% 30 2 93.33% 465 26 94.41% 204 18 91.18% 22 2 90.91% +test/state/state.hpp 3 0 100.00% 2 0 100.00% 2 0 100.00% 0 0 - 0 0 - +test/state/state_view.hpp 2 0 100.00% 2 0 100.00% 2 0 100.00% 0 0 - 0 0 - +test/state/system_contracts.cpp 26 1 96.15% 6 1 83.33% 53 1 98.11% 14 0 100.00% 0 0 - +test/state/test_state.cpp 38 1 97.37% 9 0 100.00% 71 2 97.18% 24 1 95.83% 0 0 - +test/state/test_state.hpp 3 3 0.00% 3 3 0.00% 3 3 0.00% 0 0 - 0 0 - +test/state/transaction.cpp 47 4 91.49% 4 0 100.00% 73 8 89.04% 26 3 88.46% 0 0 - +test/state/transaction.hpp 1 0 100.00% 1 0 100.00% 1 0 100.00% 0 0 - 0 0 - + +Files which contain no functions: +lib/evmone/instructions_xmacro.hpp 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +TOTAL 7529 2622 65.17% 537 54 89.94% 5753 807 85.97% 2664 988 62.91% 201 45 77.61% From 3ebd43974ea246c245e97f70e08bb5a3fa66f8f7 Mon Sep 17 00:00:00 2001 From: pdobacz <5735525+pdobacz@users.noreply.github.com> Date: Thu, 6 Nov 2025 13:24:38 +0100 Subject: [PATCH 2/2] pages: Add annotated coverage report after filling coverage gaps --- .../coverage_eest_wip_annotated/coverage.lcov | 14485 ++++++++++++++++ .../html/control.js | 99 + .../build/cov/test/evmone/version.h.html | 1 + .../evmone/include/evmmax/evmmax.hpp.html | 71 + .../evmone/lib/evmone/baseline.hpp.html | 2 + .../lib/evmone/baseline_analysis.cpp.html | 4 + .../lib/evmone/baseline_execution.cpp.html | 1738 ++ .../baseline_instruction_table.cpp.html | 1 + .../evmone/lib/evmone/delegation.cpp.html | 2 + .../evmone/lib/evmone/delegation.hpp.html | 1 + .../lib/evmone/execution_state.hpp.html | 7 + .../evmone/lib/evmone/instructions.hpp.html | 346 + .../lib/evmone/instructions_calls.cpp.html | 783 + .../lib/evmone/instructions_storage.cpp.html | 59 + .../lib/evmone/instructions_xmacro.hpp.html | 1 + .../lib/evmone_precompiles/blake2b.cpp.html | 3 + .../lib/evmone_precompiles/bls.cpp.html | 86 + .../lib/evmone_precompiles/bn254.cpp.html | 19 + .../lib/evmone_precompiles/ecc.hpp.html | 154 + .../lib/evmone_precompiles/keccak.c.html | 23 + .../lib/evmone_precompiles/keccak.hpp.html | 1 + .../lib/evmone_precompiles/kzg.cpp.html | 9 + .../lib/evmone_precompiles/modexp.cpp.html | 91 + .../pairing/bn254/fields.hpp.html | 1 + .../pairing/bn254/pairing.cpp.html | 98 + .../pairing/bn254/utils.hpp.html | 53 + .../pairing/field_template.hpp.html | 18 + .../lib/evmone_precompiles/ripemd160.cpp.html | 165 + .../lib/evmone_precompiles/secp256k1.cpp.html | 47 + .../lib/evmone_precompiles/secp256r1.cpp.html | 49 + .../lib/evmone_precompiles/sha256.cpp.html | 48 + .../blockchaintest/blockchaintest.cpp.html | 26 + .../blockchaintest_runner.cpp.html | 242 + .../evmone/test/state/account.hpp.html | 23 + .../ethereum/evmone/test/state/block.cpp.html | 25 + .../ethereum/evmone/test/state/block.hpp.html | 1 + .../evmone/test/state/bloom_filter.cpp.html | 5 + .../evmone/test/state/bloom_filter.hpp.html | 1 + .../evmone/test/state/errors.hpp.html | 23 + .../test/state/ethash_difficulty.cpp.html | 16 + .../evmone/test/state/hash_utils.hpp.html | 1 + .../ethereum/evmone/test/state/host.cpp.html | 331 + .../ethereum/evmone/test/state/host.hpp.html | 1 + .../evmone/test/state/precompiles.cpp.html | 204 + .../test/state/precompiles_stubs.cpp.html | 37 + .../evmone/test/state/requests.cpp.html | 77 + .../evmone/test/state/requests.hpp.html | 1 + .../ethereum/evmone/test/state/state.cpp.html | 262 + .../ethereum/evmone/test/state/state.hpp.html | 1 + .../evmone/test/state/state_view.hpp.html | 1 + .../test/state/system_contracts.cpp.html | 8 + .../evmone/test/state/transaction.hpp.html | 1 + .../evmone/test/statetest/statetest.cpp.html | 74 + .../test/statetest/statetest_runner.cpp.html | 22 + .../html/index.html | 5 + .../html/style.css | 194 + .../coverage_eest_wip_annotated/report.txt | 58 + 57 files changed, 20105 insertions(+) create mode 100644 reports/coverage_eest_wip_annotated/coverage.lcov create mode 100644 reports/coverage_eest_wip_annotated/html/control.js create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/build/cov/test/evmone/version.h.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/include/evmmax/evmmax.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline_analysis.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline_execution.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline_instruction_table.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/delegation.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/delegation.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/execution_state.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions_calls.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions_storage.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions_xmacro.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/blake2b.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/bls.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/bn254.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/ecc.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/keccak.c.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/keccak.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/kzg.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/modexp.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/fields.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/pairing.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/utils.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/field_template.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/ripemd160.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/secp256k1.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/secp256r1.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/sha256.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/blockchaintest/blockchaintest.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/blockchaintest/blockchaintest_runner.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/account.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/block.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/block.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/bloom_filter.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/bloom_filter.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/errors.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/ethash_difficulty.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/hash_utils.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/host.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/host.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/precompiles.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/precompiles_stubs.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/requests.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/requests.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/state.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/state.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/state_view.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/system_contracts.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/transaction.hpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/statetest/statetest.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/statetest/statetest_runner.cpp.html create mode 100644 reports/coverage_eest_wip_annotated/html/index.html create mode 100644 reports/coverage_eest_wip_annotated/html/style.css create mode 100644 reports/coverage_eest_wip_annotated/report.txt diff --git a/reports/coverage_eest_wip_annotated/coverage.lcov b/reports/coverage_eest_wip_annotated/coverage.lcov new file mode 100644 index 0000000000..897b6c46ee --- /dev/null +++ b/reports/coverage_eest_wip_annotated/coverage.lcov @@ -0,0 +1,14485 @@ +SF:/home/user/sources/ethereum/evmone/build/cov/test/evmone/version.h +FNF:0 +FNH:0 +DA:10,2 +BRF:0 +BRH:0 +LF:0 +LH:0 +end_of_record +SF:/home/user/sources/ethereum/evmone/include/evmmax/evmmax.hpp +FN:67,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE7to_montERKS3_ +FN:81,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3mulERKS3_S6_ +FN:51,_ZN6evmmax8ModArithIN4intx4uintILj256EEEE6addmulEmmmm +FN:73,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE9from_montERKS3_ +FN:128,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3subERKS3_S6_ +FN:119,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3addERKS3_S6_ +FN:137,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3invERKS3_ +FN:15,_ZN6evmmax15compute_mod_invEm +FN:42,_ZN6evmmax8ModArithIN4intx4uintILj256EEEE17compute_r_squaredERKS3_ +FN:58,_ZN6evmmax8ModArithIN4intx4uintILj128EEEEC2ERKS3_ +FN:42,_ZN6evmmax8ModArithIN4intx4uintILj128EEEE17compute_r_squaredERKS3_ +FN:67,_ZNK6evmmax8ModArithIN4intx4uintILj128EEEE7to_montERKS3_ +FN:81,_ZNK6evmmax8ModArithIN4intx4uintILj128EEEE3mulERKS3_S6_ +FN:51,_ZN6evmmax8ModArithIN4intx4uintILj128EEEE6addmulEmmmm +FN:73,_ZNK6evmmax8ModArithIN4intx4uintILj128EEEE9from_montERKS3_ +FN:58,_ZN6evmmax8ModArithIN4intx4uintILj256EEEEC2ERKS3_ +FN:58,_ZN6evmmax8ModArithIN4intx4uintILj512EEEEC2ERKS3_ +FN:42,_ZN6evmmax8ModArithIN4intx4uintILj512EEEE17compute_r_squaredERKS3_ +FN:67,_ZNK6evmmax8ModArithIN4intx4uintILj512EEEE7to_montERKS3_ +FN:81,_ZNK6evmmax8ModArithIN4intx4uintILj512EEEE3mulERKS3_S6_ +FN:51,_ZN6evmmax8ModArithIN4intx4uintILj512EEEE6addmulEmmmm +FN:73,_ZNK6evmmax8ModArithIN4intx4uintILj512EEEE9from_montERKS3_ +FN:58,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEEC2ERKS3_ +FN:42,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEE17compute_r_squaredERKS3_ +FN:67,_ZNK6evmmax8ModArithIN4intx4uintILj1024EEEE7to_montERKS3_ +FN:81,_ZNK6evmmax8ModArithIN4intx4uintILj1024EEEE3mulERKS3_S6_ +FN:51,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEE6addmulEmmmm +FN:73,_ZNK6evmmax8ModArithIN4intx4uintILj1024EEEE9from_montERKS3_ +FN:58,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEEC2ERKS3_ +FN:42,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEE17compute_r_squaredERKS3_ +FN:67,_ZNK6evmmax8ModArithIN4intx4uintILj2048EEEE7to_montERKS3_ +FN:81,_ZNK6evmmax8ModArithIN4intx4uintILj2048EEEE3mulERKS3_S6_ +FN:51,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEE6addmulEmmmm +FN:73,_ZNK6evmmax8ModArithIN4intx4uintILj2048EEEE9from_montERKS3_ +FN:58,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEEC2ERKS3_ +FN:42,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEE17compute_r_squaredERKS3_ +FN:67,_ZNK6evmmax8ModArithIN4intx4uintILj8192EEEE7to_montERKS3_ +FN:81,_ZNK6evmmax8ModArithIN4intx4uintILj8192EEEE3mulERKS3_S6_ +FN:51,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEE6addmulEmmmm +FN:73,_ZNK6evmmax8ModArithIN4intx4uintILj8192EEEE9from_montERKS3_ +FNDA:56688,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE7to_montERKS3_ +FNDA:42201208,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3mulERKS3_S6_ +FNDA:1350438656,_ZN6evmmax8ModArithIN4intx4uintILj256EEEE6addmulEmmmm +FNDA:21460,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE9from_montERKS3_ +FNDA:24978018,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3subERKS3_S6_ +FNDA:40446752,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3addERKS3_S6_ +FNDA:8970,_ZNK6evmmax8ModArithIN4intx4uintILj256EEEE3invERKS3_ +FNDA:3987,_ZN6evmmax15compute_mod_invEm +FNDA:2368,_ZN6evmmax8ModArithIN4intx4uintILj256EEEE17compute_r_squaredERKS3_ +FNDA:620,_ZN6evmmax8ModArithIN4intx4uintILj128EEEEC2ERKS3_ +FNDA:620,_ZN6evmmax8ModArithIN4intx4uintILj128EEEE17compute_r_squaredERKS3_ +FNDA:1240,_ZNK6evmmax8ModArithIN4intx4uintILj128EEEE7to_montERKS3_ +FNDA:258248,_ZNK6evmmax8ModArithIN4intx4uintILj128EEEE3mulERKS3_S6_ +FNDA:2065984,_ZN6evmmax8ModArithIN4intx4uintILj128EEEE6addmulEmmmm +FNDA:620,_ZNK6evmmax8ModArithIN4intx4uintILj128EEEE9from_montERKS3_ +FNDA:2368,_ZN6evmmax8ModArithIN4intx4uintILj256EEEEC2ERKS3_ +FNDA:599,_ZN6evmmax8ModArithIN4intx4uintILj512EEEEC2ERKS3_ +FNDA:599,_ZN6evmmax8ModArithIN4intx4uintILj512EEEE17compute_r_squaredERKS3_ +FNDA:1198,_ZNK6evmmax8ModArithIN4intx4uintILj512EEEE7to_montERKS3_ +FNDA:72595,_ZNK6evmmax8ModArithIN4intx4uintILj512EEEE3mulERKS3_S6_ +FNDA:9292160,_ZN6evmmax8ModArithIN4intx4uintILj512EEEE6addmulEmmmm +FNDA:599,_ZNK6evmmax8ModArithIN4intx4uintILj512EEEE9from_montERKS3_ +FNDA:86,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEEC2ERKS3_ +FNDA:86,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEE17compute_r_squaredERKS3_ +FNDA:172,_ZNK6evmmax8ModArithIN4intx4uintILj1024EEEE7to_montERKS3_ +FNDA:1172,_ZNK6evmmax8ModArithIN4intx4uintILj1024EEEE3mulERKS3_S6_ +FNDA:600064,_ZN6evmmax8ModArithIN4intx4uintILj1024EEEE6addmulEmmmm +FNDA:86,_ZNK6evmmax8ModArithIN4intx4uintILj1024EEEE9from_montERKS3_ +FNDA:114,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEEC2ERKS3_ +FNDA:114,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEE17compute_r_squaredERKS3_ +FNDA:228,_ZNK6evmmax8ModArithIN4intx4uintILj2048EEEE7to_montERKS3_ +FNDA:44818,_ZNK6evmmax8ModArithIN4intx4uintILj2048EEEE3mulERKS3_S6_ +FNDA:91787264,_ZN6evmmax8ModArithIN4intx4uintILj2048EEEE6addmulEmmmm +FNDA:114,_ZNK6evmmax8ModArithIN4intx4uintILj2048EEEE9from_montERKS3_ +FNDA:200,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEEC2ERKS3_ +FNDA:200,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEE17compute_r_squaredERKS3_ +FNDA:400,_ZNK6evmmax8ModArithIN4intx4uintILj8192EEEE7to_montERKS3_ +FNDA:2062,_ZNK6evmmax8ModArithIN4intx4uintILj8192EEEE3mulERKS3_S6_ +FNDA:67567616,_ZN6evmmax8ModArithIN4intx4uintILj8192EEEE6addmulEmmmm +FNDA:200,_ZNK6evmmax8ModArithIN4intx4uintILj8192EEEE9from_montERKS3_ +FNF:10 +FNH:10 +DA:15,3987 +DA:17,3987 +DA:18,3987 +DA:19,259155 +DA:20,255168 +DA:21,255168 +DA:22,255168 +DA:23,255168 +DA:24,3987 +DA:25,3987 +DA:42,3987 +DA:45,3987 +DA:46,3987 +DA:47,3987 +DA:51,1521751744 +DA:52,1521751744 +DA:53,1521751744 +DA:54,1521751744 +DA:58,3987 +DA:59,3987 +DA:60,3987 +DA:61,3987 +DA:67,59926 +DA:73,23079 +DA:81,42580103 +DA:87,42580103 +DA:89,42580103 +DA:90,214199055 +DA:91,171618952 +DA:92,171618952 +DA:93,171618952 +DA:94,932494824 +DA:95,760875872 +DA:96,171618952 +DA:97,171618952 +DA:98,171618952 +DA:100,171618952 +DA:101,171618952 +DA:102,171618952 +DA:103,760875872 +DA:104,589256920 +DA:105,171618952 +DA:106,171618952 +DA:107,171618952 +DA:108,171618952 +DA:110,42580103 +DA:111,3864322 +DA:113,42580103 +DA:114,42580103 +DA:119,40446752 +DA:120,40446752 +DA:121,40446752 +DA:122,40446752 +DA:123,40446752 +DA:128,24978018 +DA:129,24978018 +DA:130,24978018 +DA:131,24978018 +DA:132,24978018 +DA:137,8970 +DA:138,8970 +DA:139,8970 +DA:145,8970 +DA:153,8970 +DA:154,8970 +DA:160,8970 +DA:161,8970 +DA:163,2216170 +DA:164,2207200 +DA:165,2207200 +DA:166,1199100 +DA:168,1199100 +DA:169,629928 +DA:171,629928 +DA:172,629928 +DA:174,629928 +DA:175,629928 +DA:176,629928 +DA:177,569172 +DA:178,569172 +DA:179,569172 +DA:180,569172 +DA:181,1199100 +DA:182,1199100 +DA:185,2207200 +DA:189,2207200 +DA:190,2207200 +DA:191,2207200 +DA:192,1097488 +DA:193,2207200 +DA:195,8970 +DA:196,2656 +DA:197,8970 +DA:198,8970 +BRDA:19,0,0,255168 +BRDA:19,0,1,3987 +BRDA:90,0,0,18752 +BRDA:90,0,1,1172 +BRDA:90,1,2,168804832 +BRDA:90,1,3,42201208 +BRDA:90,2,4,580760 +BRDA:90,2,5,72595 +BRDA:90,3,6,263936 +BRDA:90,3,7,2062 +BRDA:90,4,8,516496 +BRDA:90,4,9,258248 +BRDA:90,5,10,1434176 +BRDA:90,5,11,44818 +BRDA:94,0,0,675219328 +BRDA:94,0,1,168804832 +BRDA:94,1,2,300032 +BRDA:94,1,3,18752 +BRDA:94,2,4,4646080 +BRDA:94,2,5,580760 +BRDA:94,3,6,1032992 +BRDA:94,3,7,516496 +BRDA:94,4,8,45893632 +BRDA:94,4,9,1434176 +BRDA:94,5,10,33783808 +BRDA:94,5,11,263936 +BRDA:103,0,0,44459456 +BRDA:103,0,1,1434176 +BRDA:103,1,2,516496 +BRDA:103,1,3,516496 +BRDA:103,2,4,281280 +BRDA:103,2,5,18752 +BRDA:103,3,6,33519872 +BRDA:103,3,7,263936 +BRDA:103,4,8,4065320 +BRDA:103,4,9,580760 +BRDA:103,5,10,506414496 +BRDA:103,5,11,168804832 +BRDA:110,0,0,140 +BRDA:110,0,1,1032 +BRDA:110,1,2,322 +BRDA:110,1,3,44496 +BRDA:110,2,4,72 +BRDA:110,2,5,1990 +BRDA:110,3,6,292 +BRDA:110,3,7,72303 +BRDA:110,4,8,210 +BRDA:110,4,9,258038 +BRDA:110,5,10,3863286 +BRDA:110,5,11,38337922 +BRDA:122,0,0,34618326 +BRDA:122,0,1,5828426 +BRDA:122,1,2,21669372 +BRDA:122,1,3,12948954 +BRDA:131,0,0,11703312 +BRDA:131,0,1,13274706 +BRDA:163,0,0,2207200 +BRDA:163,0,1,8970 +BRDA:165,0,0,1199100 +BRDA:165,0,1,1008100 +BRDA:168,0,0,629928 +BRDA:168,0,1,569172 +BRDA:191,0,0,1097488 +BRDA:191,0,1,1109712 +BRDA:195,0,0,2656 +BRDA:195,0,1,6314 +BRF:26 +BRH:26 +LF:94 +LH:94 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone/baseline.hpp +FN:24,_ZN6evmone10BitsetSpanC2EPm +FN:27,_ZNK6evmone10BitsetSpan4testEm +FN:33,_ZNK6evmone10BitsetSpan3setEm +FN:46,_ZNK6evmone10BitsetSpan7get_refEm +FN:71,_ZN6evmone8baseline12CodeAnalysisC2ESt10unique_ptrIA_hSt14default_deleteIS3_EEmNS_10BitsetSpanE +FN:79,_ZNK6evmone8baseline12CodeAnalysis8raw_codeEv +FN:82,_ZNK6evmone8baseline12CodeAnalysis15executable_codeEv +FN:86,_ZNK6evmone8baseline12CodeAnalysis14check_jumpdestEm +FNDA:2650828,_ZN6evmone10BitsetSpanC2EPm +FNDA:7133709,_ZNK6evmone10BitsetSpan4testEm +FNDA:89576870,_ZNK6evmone10BitsetSpan3setEm +FNDA:96710579,_ZNK6evmone10BitsetSpan7get_refEm +FNDA:2650828,_ZN6evmone8baseline12CodeAnalysisC2ESt10unique_ptrIA_hSt14default_deleteIS3_EEmNS_10BitsetSpanE +FNDA:2650828,_ZNK6evmone8baseline12CodeAnalysis8raw_codeEv +FNDA:15466134,_ZNK6evmone8baseline12CodeAnalysis15executable_codeEv +FNDA:7133787,_ZNK6evmone8baseline12CodeAnalysis14check_jumpdestEm +FNF:8 +FNH:8 +DA:24,2650828 +DA:27,7133709 +DA:28,7133709 +DA:29,7133709 +DA:30,7133709 +DA:33,89576870 +DA:34,89576870 +DA:35,89576870 +DA:36,89576870 +DA:46,96710579 +DA:47,96710579 +DA:48,96710579 +DA:49,96710579 +DA:50,96710579 +DA:51,96710579 +DA:71,2650828 +DA:72,2650828 +DA:73,2650828 +DA:74,2650828 +DA:75,2650828 +DA:79,2650828 +DA:82,15466134 +DA:86,7133787 +DA:87,7133787 +DA:88,78 +DA:89,7133709 +DA:90,7133787 +BRDA:87,0,0,78 +BRDA:87,0,1,7133709 +BRF:2 +BRH:2 +LF:27 +LH:27 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone/baseline_analysis.cpp +FN:64,_ZN6evmone8baseline7analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:36,baseline_analysis.cpp:_ZN6evmone8baseline12_GLOBAL__N_114analyze_legacyESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:19,baseline_analysis.cpp:_ZN6evmone8baseline12_GLOBAL__N_117analyze_jumpdestsENS_10BitsetSpanESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:2650828,_ZN6evmone8baseline7analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:2650828,baseline_analysis.cpp:_ZN6evmone8baseline12_GLOBAL__N_114analyze_legacyESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:2650828,baseline_analysis.cpp:_ZN6evmone8baseline12_GLOBAL__N_117analyze_jumpdestsENS_10BitsetSpanESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNF:3 +FNH:3 +DA:19,2650828 +DA:23,2650828 +DA:25,383326750 +DA:26,380675922 +DA:27,380675922 +DA:28,380675922 +DA:29,68634733 +DA:30,312041189 +DA:31,89576870 +DA:32,380675922 +DA:33,2650828 +DA:36,2650828 +DA:40,2650828 +DA:42,2650828 +DA:44,2650828 +DA:45,2650828 +DA:46,2650828 +DA:47,2650828 +DA:48,2650828 +DA:50,2650828 +DA:51,2650828 +DA:52,2650828 +DA:54,2650828 +DA:55,2650828 +DA:56,2650828 +DA:57,2650828 +DA:59,2650828 +DA:60,2650828 +DA:64,2650828 +DA:65,2650828 +DA:66,2650828 +BRDA:25,0,0,380675922 +BRDA:25,0,1,2650828 +BRDA:28,0,0,68634733 +BRDA:28,0,1,312041189 +BRDA:30,0,0,89576870 +BRDA:30,0,1,222464319 +BRF:6 +BRH:6 +LF:31 +LH:31 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone/baseline_execution.cpp +FN:267,_ZN6evmone8baseline7executeERNS_2VMERK19evmc_host_interfaceP17evmc_host_context13evmc_revisionRK12evmc_messageRKNS0_12CodeAnalysisE +FN:310,_ZN6evmone8baseline7executeEP7evmc_vmPK19evmc_host_interfaceP17evmc_host_context13evmc_revisionPK12evmc_messagePKhm +FN:219,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_114dispatch_cgotoERKSt5arrayIsLm256EERNS_14ExecutionStateElPKh +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE0EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE0EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:140,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFNS_10TermResultENS_8StackTopElRNS_14ExecutionStateEENS1_8PositionERlS5_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE1EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE1EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:104,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFvNS_8StackTopEENS1_8PositionERlRNS_14ExecutionStateE +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE2EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE2EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE3EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE3EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE4EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE4EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE5EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE5EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE6EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE6EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE7EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE7EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE8EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE8EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE9EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE9EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE10EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE10EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:112,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFNS_6ResultENS_8StackTopElRNS_14ExecutionStateEENS1_8PositionERlS5_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE11EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE11EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE16EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE16EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE17EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE17EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE18EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE18EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE19EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE19EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE20EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE20EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE21EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE21EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE22EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE22EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE23EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE23EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE24EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE24EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE25EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE25EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE26EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE26EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE27EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE27EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE28EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE28EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE29EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE29EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE30EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE30EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE32EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE32EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE48EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE48EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:125,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFvNS_8StackTopERNS_14ExecutionStateEENS1_8PositionERlS4_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE49EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE49EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE50EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE50EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE51EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE51EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE52EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE52EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE53EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE53EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE54EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE54EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE55EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE55EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE56EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE56EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE57EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE57EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE58EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE58EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE59EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE59EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE60EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE60EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE61EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE61EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE62EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE62EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE63EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE63EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE64EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE64EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE65EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE65EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE66EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE66EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE67EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE67EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE68EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE68EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE69EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE69EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE70EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE70EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE71EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE71EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE72EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE72EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE73EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE73EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE74EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE74EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE80EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE80EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE81EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE81EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE82EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE82EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE83EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE83EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE84EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE84EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE85EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE85EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE86EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE86EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:133,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFPKhNS_8StackTopERNS_14ExecutionStateES3_ENS1_8PositionERlS6_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE87EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE87EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE88EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE88EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE89EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE89EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE90EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE90EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE91EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE91EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE92EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE92EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE93EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE93EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE94EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE94EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE95EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE95EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE96EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE96EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE97EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE97EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE98EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE98EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE99EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE99EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE100EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE100EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE101EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE101EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE102EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE102EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE103EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE103EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE104EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE104EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE105EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE105EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE106EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE106EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE107EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE107EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE108EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE108EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE109EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE109EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE110EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE110EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE111EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE111EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE112EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE112EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE113EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE113EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE114EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE114EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE115EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE115EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE116EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE116EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE117EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE117EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE118EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE118EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE119EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE119EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE120EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE120EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE121EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE121EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE122EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE122EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE123EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE123EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE124EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE124EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE125EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE125EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE126EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE126EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE127EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE127EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE128EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE128EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE129EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE129EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE130EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE130EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE131EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE131EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE132EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE132EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE133EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE133EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE134EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE134EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE135EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE135EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE136EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE136EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE137EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE137EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE138EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE138EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE139EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE139EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE140EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE140EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE141EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE141EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE142EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE142EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE143EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE143EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE144EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE144EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE145EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE145EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE146EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE146EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE147EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE147EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE148EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE148EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE149EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE149EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE150EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE150EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE151EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE151EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE152EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE152EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE153EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE153EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE154EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE154EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE155EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE155EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE156EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE156EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE157EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE157EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE158EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE158EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE159EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE159EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE160EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE160EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE161EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE161EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE162EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE162EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE163EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE163EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE164EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE164EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE240EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE240EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE241EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE241EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE242EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE242EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE243EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE243EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE244EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE244EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE245EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE245EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE250EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE250EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE253EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE253EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE254EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE254EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:151,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE255EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FN:46,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE255EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FN:167,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_18dispatchILb1EEElRKSt5arrayIsLm256EERNS_14ExecutionStateElPKhPNS_6TracerE +FN:167,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_18dispatchILb0EEElRKSt5arrayIsLm256EERNS_14ExecutionStateElPKhPNS_6TracerE +FNDA:2650828,_ZN6evmone8baseline7executeERNS_2VMERK19evmc_host_interfaceP17evmc_host_context13evmc_revisionRK12evmc_messageRKNS0_12CodeAnalysisE +FNDA:2650828,_ZN6evmone8baseline7executeEP7evmc_vmPK19evmc_host_interfaceP17evmc_host_context13evmc_revisionPK12evmc_messagePKhm +FNDA:2650828,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_114dispatch_cgotoERKSt5arrayIsLm256EERNS_14ExecutionStateElPKh +FNDA:1295362,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE0EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1295362,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE0EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1858342,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFNS_10TermResultENS_8StackTopElRNS_14ExecutionStateEENS1_8PositionERlS5_ +FNDA:15789465,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE1EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:15789465,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE1EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:72964298,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFvNS_8StackTopEENS1_8PositionERlRNS_14ExecutionStateE +FNDA:240819,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE2EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:240819,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE2EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3296947,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE3EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3296947,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE3EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:42691,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE4EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:42691,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE4EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:4137,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE5EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:4137,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE5EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:158950,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE6EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:158950,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE6EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3672,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE7EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3672,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE7EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2158,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE8EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2158,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE8EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2432,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE9EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2432,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE9EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:37524,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE10EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:37524,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE10EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:56927511,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFNS_6ResultENS_8StackTopElRNS_14ExecutionStateEENS1_8PositionERlS5_ +FNDA:2688,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE11EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2688,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE11EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2907338,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE16EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2907338,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE16EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:404405,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE17EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:404405,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE17EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:6670,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE18EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:6670,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE18EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:6310,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE19EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:6310,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE19EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:818277,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE20EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:818277,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE20EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:5270482,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE21EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:5270482,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE21EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:125253,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE22EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:125253,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE22EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:51155,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE23EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:51155,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE23EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1774,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE24EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1774,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE24EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:67886,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE25EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:67886,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE25EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:75552,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE26EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:75552,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE26EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3467820,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE27EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3467820,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE27EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:19470,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE28EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:19470,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE28EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:9197,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE29EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:9197,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE29EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3341,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE30EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3341,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE30EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:15922,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE32EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:15922,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE32EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:46993,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE48EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:46993,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE48EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:4770656,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFvNS_8StackTopERNS_14ExecutionStateEENS1_8PositionERlS4_ +FNDA:13204,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE49EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:13204,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE49EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:23769,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE50EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:23769,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE50EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:276748,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE51EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:276748,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE51EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:24844,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE52EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:24844,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE52EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1794220,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE53EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1794220,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE53EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:185431,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE54EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:185431,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE54EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:127905,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE55EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:127905,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE55EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:22077,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE56EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:22077,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE56EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:11432,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE57EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:11432,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE57EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:13559,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE58EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:13559,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE58EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:471743,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE59EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:471743,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE59EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:13389,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE60EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:13389,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE60EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:61158,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE61EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:61158,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE61EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:9886,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE62EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:9886,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE62EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3602,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE63EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3602,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE63EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:70026,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE64EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:70026,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE64EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:15075,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE65EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:15075,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE65EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:151800,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE66EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:151800,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE66EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:135104,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE67EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:135104,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE67EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:13974,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE68EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:13974,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE68EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:15397,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE69EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:15397,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE69EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:824,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE70EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:824,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE70EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1965,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE71EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1965,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE71EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1078,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE72EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1078,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE72EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3630,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE73EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3630,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE73EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:13628,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE74EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:13628,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE74EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:4496764,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE80EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:4496764,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE80EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:12248384,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE81EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:12248384,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE81EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:8640186,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE82EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:8640186,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE82EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:158911,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE83EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:158911,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE83EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:943729,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE84EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:943729,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE84EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:4583323,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE85EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:4583323,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE85EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:5501266,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE86EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:5501266,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE86EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:112803720,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeEPDoFPKhNS_8StackTopERNS_14ExecutionStateES3_ENS1_8PositionERlS6_ +FNDA:7067585,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE87EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:7067585,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE87EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:5684719,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE88EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:5684719,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE88EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:16773,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE89EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:16773,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE89EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:16541162,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE90EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:16541162,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE90EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:24059829,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE91EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:24059829,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE91EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1886887,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE92EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1886887,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE92EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:9078096,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE93EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:9078096,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE93EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2029,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE94EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2029,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE94EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1185256,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE95EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1185256,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE95EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:79710303,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE96EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:79710303,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE96EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:9932225,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE97EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:9932225,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE97EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1319900,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE98EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1319900,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE98EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:120279,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE99EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:120279,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE99EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:49716,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE100EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:49716,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE100EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:49922,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE101EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:49922,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE101EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:46797,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE102EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:46797,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE102EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:47279,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE103EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:47279,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE103EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:42057,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE104EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:42057,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE104EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:31011,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE105EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:31011,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE105EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:29005,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE106EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:29005,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE106EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:40653,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE107EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:40653,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE107EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:38968,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE108EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:38968,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE108EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:34261,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE109EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:34261,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE109EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:29217,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE110EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:29217,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE110EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:48837,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE111EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:48837,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE111EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:21433,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE112EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:21433,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE112EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:66392,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE113EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:66392,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE113EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:31801,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE114EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:31801,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE114EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2106341,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE115EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2106341,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE115EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:45173,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE116EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:45173,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE116EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:37535,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE117EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:37535,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE117EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:38475,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE118EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:38475,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE118EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:31993,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE119EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:31993,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE119EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:30319,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE120EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:30319,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE120EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:41141,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE121EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:41141,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE121EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:42255,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE122EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:42255,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE122EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:28895,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE123EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:28895,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE123EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:34521,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE124EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:34521,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE124EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:25129,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE125EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:25129,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE125EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:92072,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE126EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:92072,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE126EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:312598,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE127EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:312598,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE127EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:5863144,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE128EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:5863144,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE128EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1237842,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE129EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1237842,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE129EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:619923,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE130EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:619923,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE130EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:283062,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE131EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:283062,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE131EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:123552,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE132EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:123552,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE132EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:63450,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE133EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:63450,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE133EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:52501,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE134EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:52501,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE134EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:443759,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE135EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:443759,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE135EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:26724,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE136EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:26724,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE136EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:52581,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE137EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:52581,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE137EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:24678,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE138EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:24678,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE138EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:16662,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE139EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:16662,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE139EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:30203,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE140EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:30203,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE140EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:15110,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE141EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:15110,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE141EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:25118,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE142EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:25118,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE142EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:17359,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE143EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:17359,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE143EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:717136,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE144EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:717136,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE144EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:395249,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE145EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:395249,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE145EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:268604,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE146EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:268604,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE146EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:84951,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE147EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:84951,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE147EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:35886,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE148EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:35886,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE148EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:8197,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE149EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:8197,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE149EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3965,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE150EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3965,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE150EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:7875,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE151EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:7875,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE151EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:6005,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE152EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:6005,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE152EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2391,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE153EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2391,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE153EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2821,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE154EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2821,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE154EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:6877,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE155EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:6877,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE155EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:4331,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE156EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:4331,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE156EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:3658,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE157EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:3658,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE157EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2497,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE158EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2497,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE158EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2503,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE159EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2503,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE159EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:9771,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE160EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:9771,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE160EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:8507,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE161EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:8507,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE161EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:4978,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE162EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:4978,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE162EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:7154,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE163EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:7154,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE163EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:1136,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE164EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:1136,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE164EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:25526,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE240EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:25526,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE240EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:814683,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE241EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:814683,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE241EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:77704,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE242EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:77704,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE242EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:527587,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE243EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:527587,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE243EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:73281,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE244EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:73281,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE244EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:15655,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE245EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:15655,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE245EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2996866,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE250EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2996866,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE250EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:25474,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE253EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:25474,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE253EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:2033,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE254EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:2033,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE254EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:421209,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_16invokeILNS_6OpcodeE255EEENS1_8PositionERKSt5arrayIsLm256EEPKN4intx4uintILj256EEES4_RlRNS_14ExecutionStateE +FNDA:421209,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_118check_requirementsILNS_6OpcodeE255EEE16evmc_status_codeRKSt5arrayIsLm256EERlPKN4intx4uintILj256EEESE_ +FNDA:0,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_18dispatchILb1EEElRKSt5arrayIsLm256EERNS_14ExecutionStateElPKhPNS_6TracerE +FNDA:0,baseline_execution.cpp:_ZN6evmone8baseline12_GLOBAL__N_18dispatchILb0EEElRKSt5arrayIsLm256EERNS_14ExecutionStateElPKhPNS_6TracerE +FNF:11 +FNH:10 +DA:19,249761738 +DA:46,249761738 +DA:47,249761738 +DA:48,249761738 +DA:49,249761738 +DA:51,249761738 +DA:53,21614804 +DA:54,21614804 +DA:60,18859143 +DA:61,18859143 +DA:62,6774 +DA:63,18859143 +DA:64,21614804 +DA:69,127883505 +DA:70,127883505 +DA:71,127883505 +DA:72,127883505 +DA:73,3012 +DA:74,127883505 +DA:76,105416677 +DA:78,105416677 +DA:79,105416677 +DA:80,2838 +DA:81,105416677 +DA:84,243353433 +DA:85,243353433 +DA:86,424587 +DA:87,243353433 +DA:89,242928846 +DA:90,249761738 +DA:104,72964298 +DA:105,72964298 +DA:106,72964298 +DA:107,72964298 +DA:112,56927511 +DA:113,56927511 +DA:114,56927511 +DA:115,56927511 +DA:116,297033 +DA:117,297033 +DA:118,297033 +DA:119,297033 +DA:120,56630478 +DA:121,56927511 +DA:125,4770656 +DA:126,4770656 +DA:127,4770656 +DA:128,4770656 +DA:133,112803720 +DA:134,112803720 +DA:135,112803720 +DA:140,1858342 +DA:141,1858342 +DA:142,1858342 +DA:143,1858342 +DA:144,1858342 +DA:145,1858342 +DA:151,249761738 +DA:152,249761738 +DA:153,249761738 +DA:154,437211 +DA:155,437211 +DA:156,437211 +DA:157,437211 +DA:158,249324527 +DA:159,249324527 +DA:160,249324527 +DA:161,249761738 +DA:167,0 +DA:168,0 +DA:171,0 +DA:173,0 +DA:174,0 +DA:176,0 +DA:177,0 +DA:178,0 +DA:179,0 +DA:180,0 +DA:181,0 +DA:182,0 +DA:183,0 +DA:184,0 +DA:186,0 +DA:187,0 +DA:188,0 +DA:189,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:201,0 +DA:202,0 +DA:203,0 +DA:205,0 +DA:206,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:219,2650828 +DA:220,2650828 +DA:222,2650828 +DA:223,397624200 +DA:224,2650828 +DA:225,280987768 +DA:226,2650828 +DA:227,2650828 +DA:228,2650828 +DA:229,2650828 +DA:230,2650828 +DA:231,2650828 +DA:233,2650828 +DA:236,2650828 +DA:238,2650828 +DA:240,2650828 +DA:241,249761738 +DA:242,249761738 +DA:243,249761738 +DA:244,249761738 +DA:245,2595696 +DA:246,2595696 +DA:247,249761738 +DA:248,249761738 +DA:251,247166042 +DA:252,247166042 +DA:253,249761738 +DA:255,496927780 +DA:256,496927780 +DA:258,496927780 +DA:259,55132 +DA:260,55132 +DA:261,496927780 +DA:267,2650828 +DA:268,2650828 +DA:269,2650828 +DA:270,2650828 +DA:272,2650828 +DA:273,2650828 +DA:275,2650828 +DA:277,2650828 +DA:279,2650828 +DA:280,2650828 +DA:281,0 +DA:282,0 +DA:283,0 +DA:284,0 +DA:285,2650828 +DA:286,2650828 +DA:287,2650828 +DA:288,2650828 +DA:289,2650828 +DA:290,0 +DA:291,0 +DA:292,0 +DA:293,2650828 +DA:295,2650828 +DA:296,2650828 +DA:298,2650828 +DA:299,2650828 +DA:300,2650828 +DA:302,2650828 +DA:303,0 +DA:305,2650828 +DA:306,2650828 +DA:310,2650828 +DA:311,2650828 +DA:312,2650828 +DA:314,2650828 +DA:315,2650828 +DA:316,2650828 +BRDA:61,0,0,85 +BRDA:61,0,1,3467735 +BRDA:61,1,2,746 +BRDA:61,1,3,12882 +BRDA:61,2,4,154 +BRDA:61,2,5,3448 +BRDA:61,3,6,499 +BRDA:61,3,7,2842 +BRDA:61,4,8,83 +BRDA:61,4,9,9114 +BRDA:61,5,10,742 +BRDA:61,5,11,2888 +BRDA:61,6,12,19 +BRDA:61,6,13,73262 +BRDA:61,7,14,80 +BRDA:61,7,15,9806 +BRDA:61,8,16,83 +BRDA:61,8,17,19387 +BRDA:61,9,18,83 +BRDA:61,9,19,15572 +BRDA:61,10,20,80 +BRDA:61,10,21,61078 +BRDA:61,11,22,490 +BRDA:61,11,23,588 +BRDA:61,12,24,45 +BRDA:61,12,25,2996821 +BRDA:61,13,26,670 +BRDA:61,13,27,1184586 +BRDA:61,14,28,742 +BRDA:61,14,29,1886145 +BRDA:61,15,30,45 +BRDA:61,15,31,25429 +BRDA:61,16,32,742 +BRDA:61,16,33,9077354 +BRDA:61,17,34,322 +BRDA:61,17,35,1643 +BRDA:61,18,36,322 +BRDA:61,18,37,502 +BRDA:61,19,38,742 +BRDA:61,19,39,1287 +BRDA:72,0,0,58 +BRDA:72,0,1,30261 +BRDA:72,1,2,32 +BRDA:72,1,3,15365 +BRDA:72,2,4,58 +BRDA:72,2,5,31743 +BRDA:72,3,6,58 +BRDA:72,3,7,42197 +BRDA:72,4,8,58 +BRDA:72,4,9,2106283 +BRDA:72,5,10,58 +BRDA:72,5,11,41083 +BRDA:72,6,12,58 +BRDA:72,6,13,45115 +BRDA:72,7,14,12 +BRDA:72,7,15,1066 +BRDA:72,8,16,58 +BRDA:72,8,17,37477 +BRDA:72,9,18,16 +BRDA:72,9,19,808 +BRDA:72,10,20,12 +BRDA:72,10,21,13616 +BRDA:72,11,22,58 +BRDA:72,11,23,31935 +BRDA:72,12,24,16 +BRDA:72,12,25,1949 +BRDA:72,13,26,58 +BRDA:72,13,27,41999 +BRDA:72,14,28,40 +BRDA:72,14,29,1185216 +BRDA:72,15,30,88 +BRDA:72,15,31,79710215 +BRDA:72,16,32,58 +BRDA:72,16,33,9932167 +BRDA:72,17,34,58 +BRDA:72,17,35,1319842 +BRDA:72,18,36,58 +BRDA:72,18,37,120221 +BRDA:72,19,38,58 +BRDA:72,19,39,49658 +BRDA:72,20,40,58 +BRDA:72,20,41,49864 +BRDA:72,21,42,58 +BRDA:72,21,43,46739 +BRDA:72,22,44,32 +BRDA:72,22,45,16541130 +BRDA:72,23,46,58 +BRDA:72,23,47,47221 +BRDA:72,24,48,32 +BRDA:72,24,49,16741 +BRDA:72,25,50,58 +BRDA:72,25,51,66334 +BRDA:72,26,52,48 +BRDA:72,26,53,5684671 +BRDA:72,27,54,58 +BRDA:72,27,55,30953 +BRDA:72,28,56,58 +BRDA:72,28,57,28947 +BRDA:72,29,58,58 +BRDA:72,29,59,40595 +BRDA:72,30,60,58 +BRDA:72,30,61,38910 +BRDA:72,31,62,58 +BRDA:72,31,63,34203 +BRDA:72,32,64,58 +BRDA:72,32,65,29159 +BRDA:72,33,66,58 +BRDA:72,33,67,48779 +BRDA:72,34,68,58 +BRDA:72,34,69,21375 +BRDA:72,35,70,58 +BRDA:72,35,71,38417 +BRDA:72,36,72,32 +BRDA:72,36,73,16630 +BRDA:72,37,74,32 +BRDA:72,37,75,619891 +BRDA:72,38,76,32 +BRDA:72,38,77,283030 +BRDA:72,39,78,32 +BRDA:72,39,79,15078 +BRDA:72,40,80,32 +BRDA:72,40,81,24812 +BRDA:72,41,82,32 +BRDA:72,41,83,13527 +BRDA:72,42,84,32 +BRDA:72,42,85,30171 +BRDA:72,43,86,32 +BRDA:72,43,87,63418 +BRDA:72,44,88,32 +BRDA:72,44,89,52469 +BRDA:72,45,90,32 +BRDA:72,45,91,276716 +BRDA:72,46,92,32 +BRDA:72,46,93,123520 +BRDA:72,47,94,32 +BRDA:72,47,95,23737 +BRDA:72,48,96,32 +BRDA:72,48,97,443727 +BRDA:72,49,98,58 +BRDA:72,49,99,28837 +BRDA:72,50,100,32 +BRDA:72,50,101,24646 +BRDA:72,51,102,32 +BRDA:72,51,103,26692 +BRDA:72,52,104,32 +BRDA:72,52,105,52549 +BRDA:72,53,106,32 +BRDA:72,53,107,46961 +BRDA:72,54,108,22 +BRDA:72,54,109,61136 +BRDA:72,55,110,32 +BRDA:72,55,111,17327 +BRDA:72,56,112,58 +BRDA:72,56,113,92014 +BRDA:72,57,114,32 +BRDA:72,57,115,15043 +BRDA:72,58,116,32 +BRDA:72,58,117,22045 +BRDA:72,59,118,32 +BRDA:72,59,119,135072 +BRDA:72,60,120,58 +BRDA:72,60,121,312540 +BRDA:72,61,122,32 +BRDA:72,61,123,25086 +BRDA:72,62,124,32 +BRDA:72,62,125,5863112 +BRDA:72,63,126,58 +BRDA:72,63,127,25071 +BRDA:72,64,128,32 +BRDA:72,64,129,151768 +BRDA:72,65,130,32 +BRDA:72,65,131,13942 +BRDA:72,66,132,32 +BRDA:72,66,133,185399 +BRDA:72,67,134,32 +BRDA:72,67,135,1237810 +BRDA:72,68,136,58 +BRDA:72,68,137,34463 +BRDA:79,0,0,24 +BRDA:79,0,1,13180 +BRDA:79,1,2,18 +BRDA:79,1,3,42673 +BRDA:79,2,4,12 +BRDA:79,2,5,7067573 +BRDA:79,3,6,24 +BRDA:79,3,7,4113 +BRDA:79,4,8,18 +BRDA:79,4,9,3296929 +BRDA:79,5,10,50 +BRDA:79,5,11,84901 +BRDA:79,6,12,18 +BRDA:79,6,13,471725 +BRDA:79,7,14,18 +BRDA:79,7,15,13371 +BRDA:79,8,16,24 +BRDA:79,8,17,240795 +BRDA:79,9,18,12 +BRDA:79,9,19,2017 +BRDA:79,10,20,334 +BRDA:79,10,21,15789131 +BRDA:79,11,22,36 +BRDA:79,11,23,17323 +BRDA:79,12,24,24 +BRDA:79,12,25,1886863 +BRDA:79,13,26,44 +BRDA:79,13,27,717092 +BRDA:79,14,28,18 +BRDA:79,14,29,158893 +BRDA:79,15,30,50 +BRDA:79,15,31,268554 +BRDA:79,16,32,18 +BRDA:79,16,33,1794202 +BRDA:79,17,34,48 +BRDA:79,17,35,9078048 +BRDA:79,18,36,24 +BRDA:79,18,37,11408 +BRDA:79,19,38,44 +BRDA:79,19,39,395205 +BRDA:79,20,40,24 +BRDA:79,20,41,818253 +BRDA:79,21,42,12 +BRDA:79,21,43,9185 +BRDA:79,22,44,18 +BRDA:79,22,45,404387 +BRDA:79,23,46,6 +BRDA:79,23,47,3624 +BRDA:79,24,48,18 +BRDA:79,24,49,70008 +BRDA:79,25,50,18 +BRDA:79,25,51,6652 +BRDA:79,26,52,12 +BRDA:79,26,53,19458 +BRDA:79,27,54,18 +BRDA:79,27,55,6292 +BRDA:79,28,56,12 +BRDA:79,28,57,3467808 +BRDA:79,29,58,12 +BRDA:79,29,59,3590 +BRDA:79,30,60,50 +BRDA:79,30,61,127855 +BRDA:79,31,62,18 +BRDA:79,31,63,75534 +BRDA:79,32,64,18 +BRDA:79,32,65,5270464 +BRDA:79,33,66,24 +BRDA:79,33,67,67862 +BRDA:79,34,68,18 +BRDA:79,34,69,125235 +BRDA:79,35,70,18 +BRDA:79,35,71,51137 +BRDA:79,36,72,18 +BRDA:79,36,73,1756 +BRDA:79,37,74,24 +BRDA:79,37,75,5501242 +BRDA:79,38,76,34 +BRDA:79,38,77,2907304 +BRDA:79,39,78,24 +BRDA:79,39,79,2664 +BRDA:79,40,80,4 +BRDA:79,40,81,3337 +BRDA:79,41,82,48 +BRDA:79,41,83,4496716 +BRDA:79,42,84,18 +BRDA:79,42,85,12248366 +BRDA:79,43,86,6 +BRDA:79,43,87,9880 +BRDA:79,44,88,24 +BRDA:79,44,89,37500 +BRDA:79,45,90,18 +BRDA:79,45,91,8640168 +BRDA:79,46,92,18 +BRDA:79,46,93,2414 +BRDA:79,47,94,30 +BRDA:79,47,95,15892 +BRDA:79,48,96,18 +BRDA:79,48,97,2140 +BRDA:79,49,98,18 +BRDA:79,49,99,943711 +BRDA:79,50,100,18 +BRDA:79,50,101,3654 +BRDA:79,51,102,18 +BRDA:79,51,103,4583305 +BRDA:79,52,104,18 +BRDA:79,52,105,158932 +BRDA:79,53,106,30 +BRDA:79,53,107,4948 +BRDA:79,54,108,50 +BRDA:79,54,109,3608 +BRDA:79,55,110,24 +BRDA:79,55,111,52557 +BRDA:79,56,112,44 +BRDA:79,56,113,2453 +BRDA:79,57,114,36 +BRDA:79,57,115,26688 +BRDA:79,58,116,44 +BRDA:79,58,117,2459 +BRDA:79,59,118,12 +BRDA:79,59,119,15643 +BRDA:79,60,120,18 +BRDA:79,60,121,9753 +BRDA:79,61,122,24 +BRDA:79,61,123,443735 +BRDA:79,62,124,18 +BRDA:79,62,125,8489 +BRDA:79,63,126,30 +BRDA:79,63,127,73251 +BRDA:79,64,128,24 +BRDA:79,64,129,1237818 +BRDA:79,65,130,18 +BRDA:79,65,131,5863126 +BRDA:79,66,132,24 +BRDA:79,66,133,52477 +BRDA:79,67,134,18 +BRDA:79,67,135,527569 +BRDA:79,68,136,18 +BRDA:79,68,137,7136 +BRDA:79,69,138,18 +BRDA:79,69,139,63432 +BRDA:79,70,140,36 +BRDA:79,70,141,1100 +BRDA:79,71,142,42 +BRDA:79,71,143,123510 +BRDA:79,72,144,42 +BRDA:79,72,145,77662 +BRDA:79,73,146,24 +BRDA:79,73,147,283038 +BRDA:79,74,148,24 +BRDA:79,74,149,25502 +BRDA:79,75,150,18 +BRDA:79,75,151,619905 +BRDA:79,76,152,24 +BRDA:79,76,153,814659 +BRDA:79,77,154,50 +BRDA:79,77,155,2341 +BRDA:79,78,156,50 +BRDA:79,78,157,35836 +BRDA:79,79,158,50 +BRDA:79,79,159,8147 +BRDA:79,80,160,56 +BRDA:79,80,161,3909 +BRDA:79,81,162,36 +BRDA:79,81,163,25082 +BRDA:79,82,164,50 +BRDA:79,82,165,7825 +BRDA:79,83,166,30 +BRDA:79,83,167,15080 +BRDA:79,84,168,50 +BRDA:79,84,169,5955 +BRDA:79,85,170,12 +BRDA:79,85,171,421197 +BRDA:79,86,172,12 +BRDA:79,86,173,2996854 +BRDA:79,87,174,18 +BRDA:79,87,175,30185 +BRDA:79,88,176,50 +BRDA:79,88,177,2771 +BRDA:79,89,178,24 +BRDA:79,89,179,24654 +BRDA:79,90,180,36 +BRDA:79,90,181,16626 +BRDA:79,91,182,50 +BRDA:79,91,183,6827 +BRDA:79,92,184,50 +BRDA:79,92,185,25424 +BRDA:79,93,186,44 +BRDA:79,93,187,4287 +BRDA:85,0,0,14 +BRDA:85,0,1,1237828 +BRDA:85,1,2,14 +BRDA:85,1,3,28881 +BRDA:85,2,4,14 +BRDA:85,2,5,22063 +BRDA:85,3,6,18 +BRDA:85,3,7,34503 +BRDA:85,4,8,14 +BRDA:85,4,9,70012 +BRDA:85,5,10,14 +BRDA:85,5,11,312584 +BRDA:85,6,12,14 +BRDA:85,6,13,135090 +BRDA:85,7,14,14 +BRDA:85,7,15,92058 +BRDA:85,8,16,14 +BRDA:85,8,17,15061 +BRDA:85,9,18,14 +BRDA:85,9,19,25115 +BRDA:85,10,20,14 +BRDA:85,10,21,151786 +BRDA:85,11,22,14 +BRDA:85,11,23,5863130 +BRDA:85,12,24,18 +BRDA:85,12,25,52563 +BRDA:85,13,26,14 +BRDA:85,13,27,25104 +BRDA:85,14,28,14 +BRDA:85,14,29,127891 +BRDA:85,15,30,14 +BRDA:85,15,31,15096 +BRDA:85,16,32,14 +BRDA:85,16,33,11418 +BRDA:85,17,34,14 +BRDA:85,17,35,30189 +BRDA:85,18,36,14 +BRDA:85,18,37,13545 +BRDA:85,19,38,14 +BRDA:85,19,39,16648 +BRDA:85,20,40,422 +BRDA:85,20,41,471321 +BRDA:85,21,42,14 +BRDA:85,21,43,24664 +BRDA:85,22,44,38 +BRDA:85,22,45,13351 +BRDA:85,23,46,14 +BRDA:85,23,47,619909 +BRDA:85,24,48,14 +BRDA:85,24,49,26710 +BRDA:85,25,50,14 +BRDA:85,25,51,61144 +BRDA:85,26,52,14 +BRDA:85,26,53,443745 +BRDA:85,27,54,14 +BRDA:85,27,55,52487 +BRDA:85,28,56,14 +BRDA:85,28,57,9872 +BRDA:85,29,58,14 +BRDA:85,29,59,63436 +BRDA:85,30,60,14 +BRDA:85,30,61,123538 +BRDA:85,31,62,14 +BRDA:85,31,63,283048 +BRDA:85,32,64,14 +BRDA:85,32,65,3588 +BRDA:85,33,66,24 +BRDA:85,33,67,16541138 +BRDA:85,34,68,14 +BRDA:85,34,69,158897 +BRDA:85,35,70,14 +BRDA:85,35,71,40639 +BRDA:85,36,72,18 +BRDA:85,36,73,943711 +BRDA:85,37,74,14 +BRDA:85,37,75,28991 +BRDA:85,38,76,54 +BRDA:85,38,77,5501212 +BRDA:85,39,78,14 +BRDA:85,39,79,30997 +BRDA:85,40,80,8 +BRDA:85,40,81,7067577 +BRDA:85,41,82,14 +BRDA:85,41,83,42043 +BRDA:85,42,84,54 +BRDA:85,42,85,5684665 +BRDA:85,43,86,18 +BRDA:85,43,87,47261 +BRDA:85,44,88,14 +BRDA:85,44,89,16759 +BRDA:85,45,90,14 +BRDA:85,45,91,46783 +BRDA:85,46,92,14 +BRDA:85,46,93,38954 +BRDA:85,47,94,14 +BRDA:85,47,95,49908 +BRDA:85,48,96,56 +BRDA:85,48,97,24059773 +BRDA:85,49,98,14 +BRDA:85,49,99,49702 +BRDA:85,50,100,6 +BRDA:85,50,101,1886881 +BRDA:85,51,102,14 +BRDA:85,51,103,120265 +BRDA:85,52,104,20 +BRDA:85,52,105,1319880 +BRDA:85,53,106,36 +BRDA:85,53,107,9078060 +BRDA:85,54,108,128 +BRDA:85,54,109,9932097 +BRDA:85,55,110,3683 +BRDA:85,55,111,79706620 +BRDA:85,56,112,54 +BRDA:85,56,113,1975 +BRDA:85,57,114,26 +BRDA:85,57,115,1185230 +BRDA:85,58,116,36 +BRDA:85,58,117,2106305 +BRDA:85,59,118,14 +BRDA:85,59,119,42241 +BRDA:85,60,120,14 +BRDA:85,60,121,41127 +BRDA:85,61,122,14 +BRDA:85,61,123,15383 +BRDA:85,62,124,14 +BRDA:85,62,125,30305 +BRDA:85,63,126,14 +BRDA:85,63,127,31979 +BRDA:85,64,128,14 +BRDA:85,64,129,810 +BRDA:85,65,130,14 +BRDA:85,65,131,38461 +BRDA:85,66,132,14 +BRDA:85,66,133,37521 +BRDA:85,67,134,14 +BRDA:85,67,135,1951 +BRDA:85,68,136,14 +BRDA:85,68,137,45159 +BRDA:85,69,138,12 +BRDA:85,69,139,1066 +BRDA:85,70,140,14 +BRDA:85,70,141,13960 +BRDA:85,71,142,14 +BRDA:85,71,143,31787 +BRDA:85,72,144,6 +BRDA:85,72,145,3624 +BRDA:85,73,146,14 +BRDA:85,73,147,66378 +BRDA:85,74,148,12 +BRDA:85,74,149,13616 +BRDA:85,75,150,14 +BRDA:85,75,151,21419 +BRDA:85,76,152,14 +BRDA:85,76,153,48823 +BRDA:85,77,154,94 +BRDA:85,77,155,4496670 +BRDA:85,78,156,14 +BRDA:85,78,157,29203 +BRDA:85,79,158,20 +BRDA:85,79,159,12248364 +BRDA:85,80,160,14 +BRDA:85,80,161,34247 +BRDA:85,81,162,64 +BRDA:85,81,163,8640122 +BRDA:85,82,164,14 +BRDA:85,82,165,3658 +BRDA:85,83,166,14 +BRDA:85,83,167,35872 +BRDA:85,84,168,14 +BRDA:85,84,169,84937 +BRDA:85,85,170,14 +BRDA:85,85,171,268590 +BRDA:85,86,172,14 +BRDA:85,86,173,395235 +BRDA:85,87,174,14 +BRDA:85,87,175,717122 +BRDA:85,88,176,14 +BRDA:85,88,177,17345 +BRDA:85,89,178,48 +BRDA:85,89,179,15789417 +BRDA:85,90,180,26 +BRDA:85,90,181,240793 +BRDA:85,91,182,14 +BRDA:85,91,183,3296933 +BRDA:85,92,184,20 +BRDA:85,92,185,42671 +BRDA:85,93,186,14 +BRDA:85,93,187,4123 +BRDA:85,94,188,14 +BRDA:85,94,189,158936 +BRDA:85,95,190,14 +BRDA:85,95,191,8183 +BRDA:85,96,192,14 +BRDA:85,96,193,2144 +BRDA:85,97,194,14 +BRDA:85,97,195,2418 +BRDA:85,98,196,56 +BRDA:85,98,197,37468 +BRDA:85,99,198,14 +BRDA:85,99,199,2674 +BRDA:85,100,200,14 +BRDA:85,100,201,2907324 +BRDA:85,101,202,14 +BRDA:85,101,203,404391 +BRDA:85,102,204,14 +BRDA:85,102,205,6656 +BRDA:85,103,206,14 +BRDA:85,103,207,6296 +BRDA:85,104,208,14 +BRDA:85,104,209,818263 +BRDA:85,105,210,22 +BRDA:85,105,211,5270460 +BRDA:85,106,212,14 +BRDA:85,106,213,125239 +BRDA:85,107,214,28 +BRDA:85,107,215,8479 +BRDA:85,108,216,413198 +BRDA:85,108,217,8011 +BRDA:85,109,218,0 +BRDA:85,109,219,25474 +BRDA:85,110,220,122 +BRDA:85,110,221,2996744 +BRDA:85,111,222,1976 +BRDA:85,111,223,13679 +BRDA:85,112,224,90 +BRDA:85,112,225,73191 +BRDA:85,113,226,100 +BRDA:85,113,227,77604 +BRDA:85,114,228,84 +BRDA:85,114,229,814599 +BRDA:85,115,230,2314 +BRDA:85,115,231,23212 +BRDA:85,116,232,28 +BRDA:85,116,233,1108 +BRDA:85,117,234,28 +BRDA:85,117,235,7126 +BRDA:85,118,236,28 +BRDA:85,118,237,4950 +BRDA:85,119,238,14 +BRDA:85,119,239,185417 +BRDA:85,120,240,32 +BRDA:85,120,241,9739 +BRDA:85,121,242,14 +BRDA:85,121,243,2489 +BRDA:85,122,244,14 +BRDA:85,122,245,2483 +BRDA:85,123,246,14 +BRDA:85,123,247,3644 +BRDA:85,124,248,18 +BRDA:85,124,249,4313 +BRDA:85,125,250,14 +BRDA:85,125,251,6863 +BRDA:85,126,252,14 +BRDA:85,126,253,2807 +BRDA:85,127,254,14 +BRDA:85,127,255,2377 +BRDA:85,128,256,14 +BRDA:85,128,257,5991 +BRDA:85,129,258,14 +BRDA:85,129,259,7861 +BRDA:85,130,260,14 +BRDA:85,130,261,3951 +BRDA:85,131,262,14 +BRDA:85,131,263,3467806 +BRDA:85,132,264,14 +BRDA:85,132,265,9183 +BRDA:85,133,266,14 +BRDA:85,133,267,15908 +BRDA:85,134,268,14 +BRDA:85,134,269,23755 +BRDA:85,135,270,14 +BRDA:85,135,271,67872 +BRDA:85,136,272,14 +BRDA:85,136,273,1760 +BRDA:85,137,274,20 +BRDA:85,137,275,1794200 +BRDA:85,138,276,14 +BRDA:85,138,277,75538 +BRDA:85,139,278,18 +BRDA:85,139,279,3323 +BRDA:85,140,280,14 +BRDA:85,140,281,24830 +BRDA:85,141,282,14 +BRDA:85,141,283,46979 +BRDA:85,142,284,14 +BRDA:85,142,285,51141 +BRDA:85,143,286,14 +BRDA:85,143,287,13190 +BRDA:85,144,288,14 +BRDA:85,144,289,19456 +BRDA:85,145,290,20 +BRDA:85,145,291,276728 +BRDA:115,0,0,297033 +BRDA:115,0,1,56630478 +BRDA:153,0,0,46 +BRDA:153,0,1,13513 +BRDA:153,1,2,46 +BRDA:153,1,3,7108 +BRDA:153,2,4,46 +BRDA:153,2,5,24798 +BRDA:153,3,6,72 +BRDA:153,3,7,29145 +BRDA:153,4,8,72 +BRDA:153,4,9,48765 +BRDA:153,5,10,64 +BRDA:153,5,11,1072 +BRDA:153,6,12,72 +BRDA:153,6,13,21361 +BRDA:153,7,14,46 +BRDA:153,7,15,8461 +BRDA:153,8,16,2338 +BRDA:153,8,17,23188 +BRDA:153,9,18,72 +BRDA:153,9,19,66320 +BRDA:153,10,20,108 +BRDA:153,10,21,814575 +BRDA:153,11,22,72 +BRDA:153,11,23,31729 +BRDA:153,12,24,38 +BRDA:153,12,25,1794182 +BRDA:153,13,26,72 +BRDA:153,13,27,28933 +BRDA:153,14,28,116 +BRDA:153,14,29,61042 +BRDA:153,15,30,76 +BRDA:153,15,31,47203 +BRDA:153,16,32,62 +BRDA:153,16,33,4269 +BRDA:153,17,34,72 +BRDA:153,17,35,41985 +BRDA:153,18,36,64 +BRDA:153,18,37,3594 +BRDA:153,19,38,46 +BRDA:153,19,39,23723 +BRDA:153,20,40,72 +BRDA:153,20,41,30939 +BRDA:153,21,42,58 +BRDA:153,21,43,2439 +BRDA:153,22,44,56 +BRDA:153,22,45,13333 +BRDA:153,23,46,58 +BRDA:153,23,47,4920 +BRDA:153,24,48,58 +BRDA:153,24,49,2445 +BRDA:153,25,50,72 +BRDA:153,25,51,40581 +BRDA:153,26,52,50 +BRDA:153,26,53,9721 +BRDA:153,27,54,52 +BRDA:153,27,55,276696 +BRDA:153,28,56,72 +BRDA:153,28,57,38896 +BRDA:153,29,58,72 +BRDA:153,29,59,45101 +BRDA:153,30,60,440 +BRDA:153,30,61,471303 +BRDA:153,31,62,72 +BRDA:153,31,63,34189 +BRDA:153,32,64,70 +BRDA:153,32,65,52431 +BRDA:153,33,66,76 +BRDA:153,33,67,34445 +BRDA:153,34,68,72 +BRDA:153,34,69,25057 +BRDA:153,35,70,72 +BRDA:153,35,71,92000 +BRDA:153,36,72,72 +BRDA:153,36,73,312526 +BRDA:153,37,74,64 +BRDA:153,37,75,5863080 +BRDA:153,38,76,70 +BRDA:153,38,77,1237772 +BRDA:153,39,78,64 +BRDA:153,39,79,619859 +BRDA:153,40,80,70 +BRDA:153,40,81,282992 +BRDA:153,41,82,88 +BRDA:153,41,83,123464 +BRDA:153,42,84,64 +BRDA:153,42,85,63386 +BRDA:153,43,86,72 +BRDA:153,43,87,28823 +BRDA:153,44,88,70 +BRDA:153,44,89,443689 +BRDA:153,45,90,82 +BRDA:153,45,91,26642 +BRDA:153,46,92,74 +BRDA:153,46,93,52507 +BRDA:153,47,94,70 +BRDA:153,47,95,24608 +BRDA:153,48,96,82 +BRDA:153,48,97,16580 +BRDA:153,49,98,64 +BRDA:153,49,99,30139 +BRDA:153,50,100,76 +BRDA:153,50,101,15034 +BRDA:153,51,102,82 +BRDA:153,51,103,25036 +BRDA:153,52,104,82 +BRDA:153,52,105,17277 +BRDA:153,53,106,46 +BRDA:153,53,107,22031 +BRDA:153,54,108,94 +BRDA:153,54,109,2106247 +BRDA:153,55,110,38 +BRDA:153,55,111,11394 +BRDA:153,56,112,18 +BRDA:153,56,113,527569 +BRDA:153,57,114,32 +BRDA:153,57,115,125221 +BRDA:153,58,116,139 +BRDA:153,58,117,73142 +BRDA:153,59,118,72 +BRDA:153,59,119,37463 +BRDA:153,60,120,2071 +BRDA:153,60,121,13584 +BRDA:153,61,122,72 +BRDA:153,61,123,38403 +BRDA:153,62,124,179 +BRDA:153,62,125,2996687 +BRDA:153,63,126,142 +BRDA:153,63,127,77562 +BRDA:153,64,128,72 +BRDA:153,64,129,31921 +BRDA:153,65,130,95 +BRDA:153,65,131,25379 +BRDA:153,66,132,46 +BRDA:153,66,133,185385 +BRDA:153,67,134,72 +BRDA:153,67,135,30247 +BRDA:153,68,136,0 +BRDA:153,68,137,2033 +BRDA:153,69,138,413210 +BRDA:153,69,139,7999 +BRDA:153,70,140,72 +BRDA:153,70,141,41069 +BRDA:153,71,142,64 +BRDA:153,71,143,127841 +BRDA:153,72,144,72 +BRDA:153,72,145,42183 +BRDA:153,73,146,46 +BRDA:153,73,147,151754 +BRDA:153,74,148,82 +BRDA:153,74,149,8640104 +BRDA:153,75,150,352 +BRDA:153,75,151,472 +BRDA:153,76,152,46 +BRDA:153,76,153,135058 +BRDA:153,77,154,32 +BRDA:153,77,155,2400 +BRDA:153,78,156,32 +BRDA:153,78,157,158879 +BRDA:153,79,158,32 +BRDA:153,79,159,75520 +BRDA:153,80,160,32 +BRDA:153,80,161,2126 +BRDA:153,81,162,32 +BRDA:153,81,163,3640 +BRDA:153,82,164,18 +BRDA:153,82,165,4583305 +BRDA:153,83,166,80 +BRDA:153,83,167,37444 +BRDA:153,84,168,78 +BRDA:153,84,169,5501188 +BRDA:153,85,170,32 +BRDA:153,85,171,158918 +BRDA:153,86,172,111 +BRDA:153,86,173,3467709 +BRDA:153,87,174,20 +BRDA:153,87,175,7067565 +BRDA:153,88,176,38 +BRDA:153,88,177,4099 +BRDA:153,89,178,102 +BRDA:153,89,179,5684617 +BRDA:153,90,180,64 +BRDA:153,90,181,6813 +BRDA:153,91,182,38 +BRDA:153,91,183,42653 +BRDA:153,92,184,46 +BRDA:153,92,185,15029 +BRDA:153,93,186,38 +BRDA:153,93,187,818239 +BRDA:153,94,188,32 +BRDA:153,94,189,1742 +BRDA:153,95,190,754 +BRDA:153,95,191,2876 +BRDA:153,96,192,32 +BRDA:153,96,193,6278 +BRDA:153,97,194,32 +BRDA:153,97,195,6638 +BRDA:153,98,196,46 +BRDA:153,98,197,15351 +BRDA:153,99,198,32 +BRDA:153,99,199,404373 +BRDA:153,100,200,514 +BRDA:153,100,201,564 +BRDA:153,101,202,770 +BRDA:153,101,203,12858 +BRDA:153,102,204,46 +BRDA:153,102,205,13928 +BRDA:153,103,206,36 +BRDA:153,103,207,943693 +BRDA:153,104,208,48 +BRDA:153,104,209,2907290 +BRDA:153,105,210,40 +BRDA:153,105,211,5270442 +BRDA:153,106,212,38 +BRDA:153,106,213,67848 +BRDA:153,107,214,142 +BRDA:153,107,215,4496622 +BRDA:153,108,216,352 +BRDA:153,108,217,1613 +BRDA:153,109,218,38 +BRDA:153,109,219,2650 +BRDA:153,110,220,38 +BRDA:153,110,221,12248346 +BRDA:153,111,222,32 +BRDA:153,111,223,51123 +BRDA:153,112,224,100 +BRDA:153,112,225,9786 +BRDA:153,113,226,736 +BRDA:153,113,227,1184520 +BRDA:153,114,228,180 +BRDA:153,114,229,3422 +BRDA:153,115,230,64 +BRDA:153,115,231,35822 +BRDA:153,116,232,3771 +BRDA:153,116,233,79706532 +BRDA:153,117,234,64 +BRDA:153,117,235,8133 +BRDA:153,118,236,46 +BRDA:153,118,237,16727 +BRDA:153,119,238,186 +BRDA:153,119,239,9932039 +BRDA:153,120,240,70 +BRDA:153,120,241,3895 +BRDA:153,121,242,78 +BRDA:153,121,243,1319822 +BRDA:153,122,244,64 +BRDA:153,122,245,7811 +BRDA:153,123,246,44 +BRDA:153,123,247,15878 +BRDA:153,124,248,72 +BRDA:153,124,249,120207 +BRDA:153,125,250,64 +BRDA:153,125,251,5941 +BRDA:153,126,252,46 +BRDA:153,126,253,46947 +BRDA:153,127,254,72 +BRDA:153,127,255,49644 +BRDA:153,128,256,64 +BRDA:153,128,257,2327 +BRDA:153,129,258,72 +BRDA:153,129,259,49850 +BRDA:153,130,260,64 +BRDA:153,130,261,2757 +BRDA:153,131,262,38 +BRDA:153,131,263,13166 +BRDA:153,132,264,72 +BRDA:153,132,265,46725 +BRDA:153,133,266,808 +BRDA:153,133,267,1221 +BRDA:153,134,268,826 +BRDA:153,134,269,9077270 +BRDA:153,135,270,58 +BRDA:153,135,271,717078 +BRDA:153,136,272,32 +BRDA:153,136,273,69994 +BRDA:153,137,274,0 +BRDA:153,137,275,1295362 +BRDA:153,138,276,772 +BRDA:153,138,277,1886115 +BRDA:153,139,278,109 +BRDA:153,139,279,9088 +BRDA:153,140,280,58 +BRDA:153,140,281,395191 +BRDA:153,141,282,382 +BRDA:153,141,283,15789083 +BRDA:153,142,284,56 +BRDA:153,142,285,24059773 +BRDA:153,143,286,50 +BRDA:153,143,287,240769 +BRDA:153,144,288,64 +BRDA:153,144,289,268540 +BRDA:153,145,290,56 +BRDA:153,145,291,16541106 +BRDA:153,146,292,521 +BRDA:153,146,293,2820 +BRDA:153,147,294,109 +BRDA:153,147,295,19361 +BRDA:153,148,296,32 +BRDA:153,148,297,3296915 +BRDA:153,149,298,64 +BRDA:153,149,299,84887 +BRDA:173,0,0,- +BRDA:173,0,1,- +BRDA:173,1,2,- +BRDA:173,1,3,- +BRDA:179,0,0,- +BRDA:179,0,1,- +BRDA:190,0,0,- +BRDA:190,0,1,- +BRDA:190,1,2,- +BRDA:190,1,3,- +BRDA:190,2,4,- +BRDA:190,2,5,- +BRDA:190,3,6,- +BRDA:190,3,7,- +BRDA:190,4,8,- +BRDA:190,4,9,- +BRDA:190,5,10,- +BRDA:190,5,11,- +BRDA:190,6,12,- +BRDA:190,6,13,- +BRDA:190,7,14,- +BRDA:190,7,15,- +BRDA:190,8,16,- +BRDA:190,8,17,- +BRDA:190,9,18,- +BRDA:190,9,19,- +BRDA:190,10,20,- +BRDA:190,10,21,- +BRDA:190,11,22,- +BRDA:190,11,23,- +BRDA:190,12,24,- +BRDA:190,12,25,- +BRDA:190,13,26,- +BRDA:190,13,27,- +BRDA:190,14,28,- +BRDA:190,14,29,- +BRDA:190,15,30,- +BRDA:190,15,31,- +BRDA:190,16,32,- +BRDA:190,16,33,- +BRDA:190,17,34,- +BRDA:190,17,35,- +BRDA:190,18,36,- +BRDA:190,18,37,- +BRDA:190,19,38,- +BRDA:190,19,39,- +BRDA:190,20,40,- +BRDA:190,20,41,- +BRDA:190,21,42,- +BRDA:190,21,43,- +BRDA:190,22,44,- +BRDA:190,22,45,- +BRDA:190,23,46,- +BRDA:190,23,47,- +BRDA:190,24,48,- +BRDA:190,24,49,- +BRDA:190,25,50,- +BRDA:190,25,51,- +BRDA:190,26,52,- +BRDA:190,26,53,- +BRDA:190,27,54,- +BRDA:190,27,55,- +BRDA:190,28,56,- +BRDA:190,28,57,- +BRDA:190,29,58,- +BRDA:190,29,59,- +BRDA:190,30,60,- +BRDA:190,30,61,- +BRDA:190,31,62,- +BRDA:190,31,63,- +BRDA:190,32,64,- +BRDA:190,32,65,- +BRDA:190,33,66,- +BRDA:190,33,67,- +BRDA:190,34,68,- +BRDA:190,34,69,- +BRDA:190,35,70,- +BRDA:190,35,71,- +BRDA:190,36,72,- +BRDA:190,36,73,- +BRDA:190,37,74,- +BRDA:190,37,75,- +BRDA:190,38,76,- +BRDA:190,38,77,- +BRDA:190,39,78,- +BRDA:190,39,79,- +BRDA:190,40,80,- +BRDA:190,40,81,- +BRDA:190,41,82,- +BRDA:190,41,83,- +BRDA:190,42,84,- +BRDA:190,42,85,- +BRDA:190,43,86,- +BRDA:190,43,87,- +BRDA:190,44,88,- +BRDA:190,44,89,- +BRDA:190,45,90,- +BRDA:190,45,91,- +BRDA:190,46,92,- +BRDA:190,46,93,- +BRDA:190,47,94,- +BRDA:190,47,95,- +BRDA:190,48,96,- +BRDA:190,48,97,- +BRDA:190,49,98,- +BRDA:190,49,99,- +BRDA:190,50,100,- +BRDA:190,50,101,- +BRDA:190,51,102,- +BRDA:190,51,103,- +BRDA:190,52,104,- +BRDA:190,52,105,- +BRDA:190,53,106,- +BRDA:190,53,107,- +BRDA:190,54,108,- +BRDA:190,54,109,- +BRDA:190,55,110,- +BRDA:190,55,111,- +BRDA:190,56,112,- +BRDA:190,56,113,- +BRDA:190,57,114,- +BRDA:190,57,115,- +BRDA:190,58,116,- +BRDA:190,58,117,- +BRDA:190,59,118,- +BRDA:190,59,119,- +BRDA:190,60,120,- +BRDA:190,60,121,- +BRDA:190,61,122,- +BRDA:190,61,123,- +BRDA:190,62,124,- +BRDA:190,62,125,- +BRDA:190,63,126,- +BRDA:190,63,127,- +BRDA:190,64,128,- +BRDA:190,64,129,- +BRDA:190,65,130,- +BRDA:190,65,131,- +BRDA:190,66,132,- +BRDA:190,66,133,- +BRDA:190,67,134,- +BRDA:190,67,135,- +BRDA:190,68,136,- +BRDA:190,68,137,- +BRDA:190,69,138,- +BRDA:190,69,139,- +BRDA:190,70,140,- +BRDA:190,70,141,- +BRDA:190,71,142,- +BRDA:190,71,143,- +BRDA:190,72,144,- +BRDA:190,72,145,- +BRDA:190,73,146,- +BRDA:190,73,147,- +BRDA:190,74,148,- +BRDA:190,74,149,- +BRDA:190,75,150,- +BRDA:190,75,151,- +BRDA:190,76,152,- +BRDA:190,76,153,- +BRDA:190,77,154,- +BRDA:190,77,155,- +BRDA:190,78,156,- +BRDA:190,78,157,- +BRDA:190,79,158,- +BRDA:190,79,159,- +BRDA:190,80,160,- +BRDA:190,80,161,- +BRDA:190,81,162,- +BRDA:190,81,163,- +BRDA:190,82,164,- +BRDA:190,82,165,- +BRDA:190,83,166,- +BRDA:190,83,167,- +BRDA:190,84,168,- +BRDA:190,84,169,- +BRDA:190,85,170,- +BRDA:190,85,171,- +BRDA:190,86,172,- +BRDA:190,86,173,- +BRDA:190,87,174,- +BRDA:190,87,175,- +BRDA:190,88,176,- +BRDA:190,88,177,- +BRDA:190,89,178,- +BRDA:190,89,179,- +BRDA:190,90,180,- +BRDA:190,90,181,- +BRDA:190,91,182,- +BRDA:190,91,183,- +BRDA:190,92,184,- +BRDA:190,92,185,- +BRDA:190,93,186,- +BRDA:190,93,187,- +BRDA:190,94,188,- +BRDA:190,94,189,- +BRDA:190,95,190,- +BRDA:190,95,191,- +BRDA:190,96,192,- +BRDA:190,96,193,- +BRDA:190,97,194,- +BRDA:190,97,195,- +BRDA:190,98,196,- +BRDA:190,98,197,- +BRDA:190,99,198,- +BRDA:190,99,199,- +BRDA:190,100,200,- +BRDA:190,100,201,- +BRDA:190,101,202,- +BRDA:190,101,203,- +BRDA:190,102,204,- +BRDA:190,102,205,- +BRDA:190,103,206,- +BRDA:190,103,207,- +BRDA:190,104,208,- +BRDA:190,104,209,- +BRDA:190,105,210,- +BRDA:190,105,211,- +BRDA:190,106,212,- +BRDA:190,106,213,- +BRDA:190,107,214,- +BRDA:190,107,215,- +BRDA:190,108,216,- +BRDA:190,108,217,- +BRDA:190,109,218,- +BRDA:190,109,219,- +BRDA:190,110,220,- +BRDA:190,110,221,- +BRDA:190,111,222,- +BRDA:190,111,223,- +BRDA:190,112,224,- +BRDA:190,112,225,- +BRDA:190,113,226,- +BRDA:190,113,227,- +BRDA:190,114,228,- +BRDA:190,114,229,- +BRDA:190,115,230,- +BRDA:190,115,231,- +BRDA:190,116,232,- +BRDA:190,116,233,- +BRDA:190,117,234,- +BRDA:190,117,235,- +BRDA:190,118,236,- +BRDA:190,118,237,- +BRDA:190,119,238,- +BRDA:190,119,239,- +BRDA:190,120,240,- +BRDA:190,120,241,- +BRDA:190,121,242,- +BRDA:190,121,243,- +BRDA:190,122,244,- +BRDA:190,122,245,- +BRDA:190,123,246,- +BRDA:190,123,247,- +BRDA:190,124,248,- +BRDA:190,124,249,- +BRDA:190,125,250,- +BRDA:190,125,251,- +BRDA:190,126,252,- +BRDA:190,126,253,- +BRDA:190,127,254,- +BRDA:190,127,255,- +BRDA:190,128,256,- +BRDA:190,128,257,- +BRDA:190,129,258,- +BRDA:190,129,259,- +BRDA:190,130,260,- +BRDA:190,130,261,- +BRDA:190,131,262,- +BRDA:190,131,263,- +BRDA:190,132,264,- +BRDA:190,132,265,- +BRDA:190,133,266,- +BRDA:190,133,267,- +BRDA:190,134,268,- +BRDA:190,134,269,- +BRDA:190,135,270,- +BRDA:190,135,271,- +BRDA:190,136,272,- +BRDA:190,136,273,- +BRDA:190,137,274,- +BRDA:190,137,275,- +BRDA:190,138,276,- +BRDA:190,138,277,- +BRDA:190,139,278,- +BRDA:190,139,279,- +BRDA:190,140,280,- +BRDA:190,140,281,- +BRDA:190,141,282,- +BRDA:190,141,283,- +BRDA:190,142,284,- +BRDA:190,142,285,- +BRDA:190,143,286,- +BRDA:190,143,287,- +BRDA:190,144,288,- +BRDA:190,144,289,- +BRDA:190,145,290,- +BRDA:190,145,291,- +BRDA:190,146,292,- +BRDA:190,146,293,- +BRDA:190,147,294,- +BRDA:190,147,295,- +BRDA:190,148,296,- +BRDA:190,148,297,- +BRDA:190,149,298,- +BRDA:190,149,299,- +BRDA:190,150,300,- +BRDA:190,150,301,- +BRDA:190,151,302,- +BRDA:190,151,303,- +BRDA:190,152,304,- +BRDA:190,152,305,- +BRDA:190,153,306,- +BRDA:190,153,307,- +BRDA:190,154,308,- +BRDA:190,154,309,- +BRDA:190,155,310,- +BRDA:190,155,311,- +BRDA:190,156,312,- +BRDA:190,156,313,- +BRDA:190,157,314,- +BRDA:190,157,315,- +BRDA:190,158,316,- +BRDA:190,158,317,- +BRDA:190,159,318,- +BRDA:190,159,319,- +BRDA:190,160,320,- +BRDA:190,160,321,- +BRDA:190,161,322,- +BRDA:190,161,323,- +BRDA:190,162,324,- +BRDA:190,162,325,- +BRDA:190,163,326,- +BRDA:190,163,327,- +BRDA:190,164,328,- +BRDA:190,164,329,- +BRDA:190,165,330,- +BRDA:190,165,331,- +BRDA:190,166,332,- +BRDA:190,166,333,- +BRDA:190,167,334,- +BRDA:190,167,335,- +BRDA:190,168,336,- +BRDA:190,168,337,- +BRDA:190,169,338,- +BRDA:190,169,339,- +BRDA:190,170,340,- +BRDA:190,170,341,- +BRDA:190,171,342,- +BRDA:190,171,343,- +BRDA:190,172,344,- +BRDA:190,172,345,- +BRDA:190,173,346,- +BRDA:190,173,347,- +BRDA:190,174,348,- +BRDA:190,174,349,- +BRDA:190,175,350,- +BRDA:190,175,351,- +BRDA:190,176,352,- +BRDA:190,176,353,- +BRDA:190,177,354,- +BRDA:190,177,355,- +BRDA:190,178,356,- +BRDA:190,178,357,- +BRDA:190,179,358,- +BRDA:190,179,359,- +BRDA:190,180,360,- +BRDA:190,180,361,- +BRDA:190,181,362,- +BRDA:190,181,363,- +BRDA:190,182,364,- +BRDA:190,182,365,- +BRDA:190,183,366,- +BRDA:190,183,367,- +BRDA:190,184,368,- +BRDA:190,184,369,- +BRDA:190,185,370,- +BRDA:190,185,371,- +BRDA:190,186,372,- +BRDA:190,186,373,- +BRDA:190,187,374,- +BRDA:190,187,375,- +BRDA:190,188,376,- +BRDA:190,188,377,- +BRDA:190,189,378,- +BRDA:190,189,379,- +BRDA:190,190,380,- +BRDA:190,190,381,- +BRDA:190,191,382,- +BRDA:190,191,383,- +BRDA:190,192,384,- +BRDA:190,192,385,- +BRDA:190,193,386,- +BRDA:190,193,387,- +BRDA:190,194,388,- +BRDA:190,194,389,- +BRDA:190,195,390,- +BRDA:190,195,391,- +BRDA:190,196,392,- +BRDA:190,196,393,- +BRDA:190,197,394,- +BRDA:190,197,395,- +BRDA:190,198,396,- +BRDA:190,198,397,- +BRDA:190,199,398,- +BRDA:190,199,399,- +BRDA:190,200,400,- +BRDA:190,200,401,- +BRDA:190,201,402,- +BRDA:190,201,403,- +BRDA:190,202,404,- +BRDA:190,202,405,- +BRDA:190,203,406,- +BRDA:190,203,407,- +BRDA:190,204,408,- +BRDA:190,204,409,- +BRDA:190,205,410,- +BRDA:190,205,411,- +BRDA:190,206,412,- +BRDA:190,206,413,- +BRDA:190,207,414,- +BRDA:190,207,415,- +BRDA:190,208,416,- +BRDA:190,208,417,- +BRDA:190,209,418,- +BRDA:190,209,419,- +BRDA:190,210,420,- +BRDA:190,210,421,- +BRDA:190,211,422,- +BRDA:190,211,423,- +BRDA:190,212,424,- +BRDA:190,212,425,- +BRDA:190,213,426,- +BRDA:190,213,427,- +BRDA:190,214,428,- +BRDA:190,214,429,- +BRDA:190,215,430,- +BRDA:190,215,431,- +BRDA:190,216,432,- +BRDA:190,216,433,- +BRDA:190,217,434,- +BRDA:190,217,435,- +BRDA:190,218,436,- +BRDA:190,218,437,- +BRDA:190,219,438,- +BRDA:190,219,439,- +BRDA:190,220,440,- +BRDA:190,220,441,- +BRDA:190,221,442,- +BRDA:190,221,443,- +BRDA:190,222,444,- +BRDA:190,222,445,- +BRDA:190,223,446,- +BRDA:190,223,447,- +BRDA:190,224,448,- +BRDA:190,224,449,- +BRDA:190,225,450,- +BRDA:190,225,451,- +BRDA:190,226,452,- +BRDA:190,226,453,- +BRDA:190,227,454,- +BRDA:190,227,455,- +BRDA:190,228,456,- +BRDA:190,228,457,- +BRDA:190,229,458,- +BRDA:190,229,459,- +BRDA:190,230,460,- +BRDA:190,230,461,- +BRDA:190,231,462,- +BRDA:190,231,463,- +BRDA:190,232,464,- +BRDA:190,232,465,- +BRDA:190,233,466,- +BRDA:190,233,467,- +BRDA:190,234,468,- +BRDA:190,234,469,- +BRDA:190,235,470,- +BRDA:190,235,471,- +BRDA:190,236,472,- +BRDA:190,236,473,- +BRDA:190,237,474,- +BRDA:190,237,475,- +BRDA:190,238,476,- +BRDA:190,238,477,- +BRDA:190,239,478,- +BRDA:190,239,479,- +BRDA:190,240,480,- +BRDA:190,240,481,- +BRDA:190,241,482,- +BRDA:190,241,483,- +BRDA:190,242,484,- +BRDA:190,242,485,- +BRDA:190,243,486,- +BRDA:190,243,487,- +BRDA:190,244,488,- +BRDA:190,244,489,- +BRDA:190,245,490,- +BRDA:190,245,491,- +BRDA:190,246,492,- +BRDA:190,246,493,- +BRDA:190,247,494,- +BRDA:190,247,495,- +BRDA:190,248,496,- +BRDA:190,248,497,- +BRDA:190,249,498,- +BRDA:190,249,499,- +BRDA:190,250,500,- +BRDA:190,250,501,- +BRDA:190,251,502,- +BRDA:190,251,503,- +BRDA:190,252,504,- +BRDA:190,252,505,- +BRDA:190,253,506,- +BRDA:190,253,507,- +BRDA:190,254,508,- +BRDA:190,254,509,- +BRDA:190,255,510,- +BRDA:190,255,511,- +BRDA:190,256,512,- +BRDA:190,256,513,- +BRDA:190,257,514,- +BRDA:190,257,515,- +BRDA:190,258,516,- +BRDA:190,258,517,- +BRDA:190,259,518,- +BRDA:190,259,519,- +BRDA:190,260,520,- +BRDA:190,260,521,- +BRDA:190,261,522,- +BRDA:190,261,523,- +BRDA:190,262,524,- +BRDA:190,262,525,- +BRDA:190,263,526,- +BRDA:190,263,527,- +BRDA:190,264,528,- +BRDA:190,264,529,- +BRDA:190,265,530,- +BRDA:190,265,531,- +BRDA:190,266,532,- +BRDA:190,266,533,- +BRDA:190,267,534,- +BRDA:190,267,535,- +BRDA:190,268,536,- +BRDA:190,268,537,- +BRDA:190,269,538,- +BRDA:190,269,539,- +BRDA:190,270,540,- +BRDA:190,270,541,- +BRDA:190,271,542,- +BRDA:190,271,543,- +BRDA:190,272,544,- +BRDA:190,272,545,- +BRDA:190,273,546,- +BRDA:190,273,547,- +BRDA:190,274,548,- +BRDA:190,274,549,- +BRDA:190,275,550,- +BRDA:190,275,551,- +BRDA:190,276,552,- +BRDA:190,276,553,- +BRDA:190,277,554,- +BRDA:190,277,555,- +BRDA:190,278,556,- +BRDA:190,278,557,- +BRDA:190,279,558,- +BRDA:190,279,559,- +BRDA:190,280,560,- +BRDA:190,280,561,- +BRDA:190,281,562,- +BRDA:190,281,563,- +BRDA:190,282,564,- +BRDA:190,282,565,- +BRDA:190,283,566,- +BRDA:190,283,567,- +BRDA:190,284,568,- +BRDA:190,284,569,- +BRDA:190,285,570,- +BRDA:190,285,571,- +BRDA:190,286,572,- +BRDA:190,286,573,- +BRDA:190,287,574,- +BRDA:190,287,575,- +BRDA:190,288,576,- +BRDA:190,288,577,- +BRDA:190,289,578,- +BRDA:190,289,579,- +BRDA:190,290,580,- +BRDA:190,290,581,- +BRDA:190,291,582,- +BRDA:190,291,583,- +BRDA:190,292,584,- +BRDA:190,292,585,- +BRDA:190,293,586,- +BRDA:190,293,587,- +BRDA:190,294,588,- +BRDA:190,294,589,- +BRDA:190,295,590,- +BRDA:190,295,591,- +BRDA:190,296,592,- +BRDA:190,296,593,- +BRDA:190,297,594,- +BRDA:190,297,595,- +BRDA:190,298,596,- +BRDA:190,298,597,- +BRDA:190,299,598,- +BRDA:190,299,599,- +BRDA:193,0,0,- +BRDA:193,0,1,- +BRDA:193,1,2,- +BRDA:193,1,3,- +BRDA:193,2,4,- +BRDA:193,2,5,- +BRDA:193,3,6,- +BRDA:193,3,7,- +BRDA:193,4,8,- +BRDA:193,4,9,- +BRDA:193,5,10,- +BRDA:193,5,11,- +BRDA:193,6,12,- +BRDA:193,6,13,- +BRDA:193,7,14,- +BRDA:193,7,15,- +BRDA:193,8,16,- +BRDA:193,8,17,- +BRDA:193,9,18,- +BRDA:193,9,19,- +BRDA:193,10,20,- +BRDA:193,10,21,- +BRDA:193,11,22,- +BRDA:193,11,23,- +BRDA:193,12,24,- +BRDA:193,12,25,- +BRDA:193,13,26,- +BRDA:193,13,27,- +BRDA:193,14,28,- +BRDA:193,14,29,- +BRDA:193,15,30,- +BRDA:193,15,31,- +BRDA:193,16,32,- +BRDA:193,16,33,- +BRDA:193,17,34,- +BRDA:193,17,35,- +BRDA:193,18,36,- +BRDA:193,18,37,- +BRDA:193,19,38,- +BRDA:193,19,39,- +BRDA:193,20,40,- +BRDA:193,20,41,- +BRDA:193,21,42,- +BRDA:193,21,43,- +BRDA:193,22,44,- +BRDA:193,22,45,- +BRDA:193,23,46,- +BRDA:193,23,47,- +BRDA:193,24,48,- +BRDA:193,24,49,- +BRDA:193,25,50,- +BRDA:193,25,51,- +BRDA:193,26,52,- +BRDA:193,26,53,- +BRDA:193,27,54,- +BRDA:193,27,55,- +BRDA:193,28,56,- +BRDA:193,28,57,- +BRDA:193,29,58,- +BRDA:193,29,59,- +BRDA:193,30,60,- +BRDA:193,30,61,- +BRDA:193,31,62,- +BRDA:193,31,63,- +BRDA:193,32,64,- +BRDA:193,32,65,- +BRDA:193,33,66,- +BRDA:193,33,67,- +BRDA:193,34,68,- +BRDA:193,34,69,- +BRDA:193,35,70,- +BRDA:193,35,71,- +BRDA:193,36,72,- +BRDA:193,36,73,- +BRDA:193,37,74,- +BRDA:193,37,75,- +BRDA:193,38,76,- +BRDA:193,38,77,- +BRDA:193,39,78,- +BRDA:193,39,79,- +BRDA:193,40,80,- +BRDA:193,40,81,- +BRDA:193,41,82,- +BRDA:193,41,83,- +BRDA:193,42,84,- +BRDA:193,42,85,- +BRDA:193,43,86,- +BRDA:193,43,87,- +BRDA:193,44,88,- +BRDA:193,44,89,- +BRDA:193,45,90,- +BRDA:193,45,91,- +BRDA:193,46,92,- +BRDA:193,46,93,- +BRDA:193,47,94,- +BRDA:193,47,95,- +BRDA:193,48,96,- +BRDA:193,48,97,- +BRDA:193,49,98,- +BRDA:193,49,99,- +BRDA:193,50,100,- +BRDA:193,50,101,- +BRDA:193,51,102,- +BRDA:193,51,103,- +BRDA:193,52,104,- +BRDA:193,52,105,- +BRDA:193,53,106,- +BRDA:193,53,107,- +BRDA:193,54,108,- +BRDA:193,54,109,- +BRDA:193,55,110,- +BRDA:193,55,111,- +BRDA:193,56,112,- +BRDA:193,56,113,- +BRDA:193,57,114,- +BRDA:193,57,115,- +BRDA:193,58,116,- +BRDA:193,58,117,- +BRDA:193,59,118,- +BRDA:193,59,119,- +BRDA:193,60,120,- +BRDA:193,60,121,- +BRDA:193,61,122,- +BRDA:193,61,123,- +BRDA:193,62,124,- +BRDA:193,62,125,- +BRDA:193,63,126,- +BRDA:193,63,127,- +BRDA:193,64,128,- +BRDA:193,64,129,- +BRDA:193,65,130,- +BRDA:193,65,131,- +BRDA:193,66,132,- +BRDA:193,66,133,- +BRDA:193,67,134,- +BRDA:193,67,135,- +BRDA:193,68,136,- +BRDA:193,68,137,- +BRDA:193,69,138,- +BRDA:193,69,139,- +BRDA:193,70,140,- +BRDA:193,70,141,- +BRDA:193,71,142,- +BRDA:193,71,143,- +BRDA:193,72,144,- +BRDA:193,72,145,- +BRDA:193,73,146,- +BRDA:193,73,147,- +BRDA:193,74,148,- +BRDA:193,74,149,- +BRDA:193,75,150,- +BRDA:193,75,151,- +BRDA:193,76,152,- +BRDA:193,76,153,- +BRDA:193,77,154,- +BRDA:193,77,155,- +BRDA:193,78,156,- +BRDA:193,78,157,- +BRDA:193,79,158,- +BRDA:193,79,159,- +BRDA:193,80,160,- +BRDA:193,80,161,- +BRDA:193,81,162,- +BRDA:193,81,163,- +BRDA:193,82,164,- +BRDA:193,82,165,- +BRDA:193,83,166,- +BRDA:193,83,167,- +BRDA:193,84,168,- +BRDA:193,84,169,- +BRDA:193,85,170,- +BRDA:193,85,171,- +BRDA:193,86,172,- +BRDA:193,86,173,- +BRDA:193,87,174,- +BRDA:193,87,175,- +BRDA:193,88,176,- +BRDA:193,88,177,- +BRDA:193,89,178,- +BRDA:193,89,179,- +BRDA:193,90,180,- +BRDA:193,90,181,- +BRDA:193,91,182,- +BRDA:193,91,183,- +BRDA:193,92,184,- +BRDA:193,92,185,- +BRDA:193,93,186,- +BRDA:193,93,187,- +BRDA:193,94,188,- +BRDA:193,94,189,- +BRDA:193,95,190,- +BRDA:193,95,191,- +BRDA:193,96,192,- +BRDA:193,96,193,- +BRDA:193,97,194,- +BRDA:193,97,195,- +BRDA:193,98,196,- +BRDA:193,98,197,- +BRDA:193,99,198,- +BRDA:193,99,199,- +BRDA:193,100,200,- +BRDA:193,100,201,- +BRDA:193,101,202,- +BRDA:193,101,203,- +BRDA:193,102,204,- +BRDA:193,102,205,- +BRDA:193,103,206,- +BRDA:193,103,207,- +BRDA:193,104,208,- +BRDA:193,104,209,- +BRDA:193,105,210,- +BRDA:193,105,211,- +BRDA:193,106,212,- +BRDA:193,106,213,- +BRDA:193,107,214,- +BRDA:193,107,215,- +BRDA:193,108,216,- +BRDA:193,108,217,- +BRDA:193,109,218,- +BRDA:193,109,219,- +BRDA:193,110,220,- +BRDA:193,110,221,- +BRDA:193,111,222,- +BRDA:193,111,223,- +BRDA:193,112,224,- +BRDA:193,112,225,- +BRDA:193,113,226,- +BRDA:193,113,227,- +BRDA:193,114,228,- +BRDA:193,114,229,- +BRDA:193,115,230,- +BRDA:193,115,231,- +BRDA:193,116,232,- +BRDA:193,116,233,- +BRDA:193,117,234,- +BRDA:193,117,235,- +BRDA:193,118,236,- +BRDA:193,118,237,- +BRDA:193,119,238,- +BRDA:193,119,239,- +BRDA:193,120,240,- +BRDA:193,120,241,- +BRDA:193,121,242,- +BRDA:193,121,243,- +BRDA:193,122,244,- +BRDA:193,122,245,- +BRDA:193,123,246,- +BRDA:193,123,247,- +BRDA:193,124,248,- +BRDA:193,124,249,- +BRDA:193,125,250,- +BRDA:193,125,251,- +BRDA:193,126,252,- +BRDA:193,126,253,- +BRDA:193,127,254,- +BRDA:193,127,255,- +BRDA:193,128,256,- +BRDA:193,128,257,- +BRDA:193,129,258,- +BRDA:193,129,259,- +BRDA:193,130,260,- +BRDA:193,130,261,- +BRDA:193,131,262,- +BRDA:193,131,263,- +BRDA:193,132,264,- +BRDA:193,132,265,- +BRDA:193,133,266,- +BRDA:193,133,267,- +BRDA:193,134,268,- +BRDA:193,134,269,- +BRDA:193,135,270,- +BRDA:193,135,271,- +BRDA:193,136,272,- +BRDA:193,136,273,- +BRDA:193,137,274,- +BRDA:193,137,275,- +BRDA:193,138,276,- +BRDA:193,138,277,- +BRDA:193,139,278,- +BRDA:193,139,279,- +BRDA:193,140,280,- +BRDA:193,140,281,- +BRDA:193,141,282,- +BRDA:193,141,283,- +BRDA:193,142,284,- +BRDA:193,142,285,- +BRDA:193,143,286,- +BRDA:193,143,287,- +BRDA:193,144,288,- +BRDA:193,144,289,- +BRDA:193,145,290,- +BRDA:193,145,291,- +BRDA:193,146,292,- +BRDA:193,146,293,- +BRDA:193,147,294,- +BRDA:193,147,295,- +BRDA:193,148,296,- +BRDA:193,148,297,- +BRDA:193,149,298,- +BRDA:193,149,299,- +BRDA:193,150,300,- +BRDA:193,150,301,- +BRDA:193,151,302,- +BRDA:193,151,303,- +BRDA:193,152,304,- +BRDA:193,152,305,- +BRDA:193,153,306,- +BRDA:193,153,307,- +BRDA:193,154,308,- +BRDA:193,154,309,- +BRDA:193,155,310,- +BRDA:193,155,311,- +BRDA:193,156,312,- +BRDA:193,156,313,- +BRDA:193,157,314,- +BRDA:193,157,315,- +BRDA:193,158,316,- +BRDA:193,158,317,- +BRDA:193,159,318,- +BRDA:193,159,319,- +BRDA:193,160,320,- +BRDA:193,160,321,- +BRDA:193,161,322,- +BRDA:193,161,323,- +BRDA:193,162,324,- +BRDA:193,162,325,- +BRDA:193,163,326,- +BRDA:193,163,327,- +BRDA:193,164,328,- +BRDA:193,164,329,- +BRDA:193,165,330,- +BRDA:193,165,331,- +BRDA:193,166,332,- +BRDA:193,166,333,- +BRDA:193,167,334,- +BRDA:193,167,335,- +BRDA:193,168,336,- +BRDA:193,168,337,- +BRDA:193,169,338,- +BRDA:193,169,339,- +BRDA:193,170,340,- +BRDA:193,170,341,- +BRDA:193,171,342,- +BRDA:193,171,343,- +BRDA:193,172,344,- +BRDA:193,172,345,- +BRDA:193,173,346,- +BRDA:193,173,347,- +BRDA:193,174,348,- +BRDA:193,174,349,- +BRDA:193,175,350,- +BRDA:193,175,351,- +BRDA:193,176,352,- +BRDA:193,176,353,- +BRDA:193,177,354,- +BRDA:193,177,355,- +BRDA:193,178,356,- +BRDA:193,178,357,- +BRDA:193,179,358,- +BRDA:193,179,359,- +BRDA:193,180,360,- +BRDA:193,180,361,- +BRDA:193,181,362,- +BRDA:193,181,363,- +BRDA:193,182,364,- +BRDA:193,182,365,- +BRDA:193,183,366,- +BRDA:193,183,367,- +BRDA:193,184,368,- +BRDA:193,184,369,- +BRDA:193,185,370,- +BRDA:193,185,371,- +BRDA:193,186,372,- +BRDA:193,186,373,- +BRDA:193,187,374,- +BRDA:193,187,375,- +BRDA:193,188,376,- +BRDA:193,188,377,- +BRDA:193,189,378,- +BRDA:193,189,379,- +BRDA:193,190,380,- +BRDA:193,190,381,- +BRDA:193,191,382,- +BRDA:193,191,383,- +BRDA:193,192,384,- +BRDA:193,192,385,- +BRDA:193,193,386,- +BRDA:193,193,387,- +BRDA:193,194,388,- +BRDA:193,194,389,- +BRDA:193,195,390,- +BRDA:193,195,391,- +BRDA:193,196,392,- +BRDA:193,196,393,- +BRDA:193,197,394,- +BRDA:193,197,395,- +BRDA:193,198,396,- +BRDA:193,198,397,- +BRDA:193,199,398,- +BRDA:193,199,399,- +BRDA:193,200,400,- +BRDA:193,200,401,- +BRDA:193,201,402,- +BRDA:193,201,403,- +BRDA:193,202,404,- +BRDA:193,202,405,- +BRDA:193,203,406,- +BRDA:193,203,407,- +BRDA:193,204,408,- +BRDA:193,204,409,- +BRDA:193,205,410,- +BRDA:193,205,411,- +BRDA:193,206,412,- +BRDA:193,206,413,- +BRDA:193,207,414,- +BRDA:193,207,415,- +BRDA:193,208,416,- +BRDA:193,208,417,- +BRDA:193,209,418,- +BRDA:193,209,419,- +BRDA:193,210,420,- +BRDA:193,210,421,- +BRDA:193,211,422,- +BRDA:193,211,423,- +BRDA:193,212,424,- +BRDA:193,212,425,- +BRDA:193,213,426,- +BRDA:193,213,427,- +BRDA:193,214,428,- +BRDA:193,214,429,- +BRDA:193,215,430,- +BRDA:193,215,431,- +BRDA:193,216,432,- +BRDA:193,216,433,- +BRDA:193,217,434,- +BRDA:193,217,435,- +BRDA:193,218,436,- +BRDA:193,218,437,- +BRDA:193,219,438,- +BRDA:193,219,439,- +BRDA:193,220,440,- +BRDA:193,220,441,- +BRDA:193,221,442,- +BRDA:193,221,443,- +BRDA:193,222,444,- +BRDA:193,222,445,- +BRDA:193,223,446,- +BRDA:193,223,447,- +BRDA:193,224,448,- +BRDA:193,224,449,- +BRDA:193,225,450,- +BRDA:193,225,451,- +BRDA:193,226,452,- +BRDA:193,226,453,- +BRDA:193,227,454,- +BRDA:193,227,455,- +BRDA:193,228,456,- +BRDA:193,228,457,- +BRDA:193,229,458,- +BRDA:193,229,459,- +BRDA:193,230,460,- +BRDA:193,230,461,- +BRDA:193,231,462,- +BRDA:193,231,463,- +BRDA:193,232,464,- +BRDA:193,232,465,- +BRDA:193,233,466,- +BRDA:193,233,467,- +BRDA:193,234,468,- +BRDA:193,234,469,- +BRDA:193,235,470,- +BRDA:193,235,471,- +BRDA:193,236,472,- +BRDA:193,236,473,- +BRDA:193,237,474,- +BRDA:193,237,475,- +BRDA:193,238,476,- +BRDA:193,238,477,- +BRDA:193,239,478,- +BRDA:193,239,479,- +BRDA:193,240,480,- +BRDA:193,240,481,- +BRDA:193,241,482,- +BRDA:193,241,483,- +BRDA:193,242,484,- +BRDA:193,242,485,- +BRDA:193,243,486,- +BRDA:193,243,487,- +BRDA:193,244,488,- +BRDA:193,244,489,- +BRDA:193,245,490,- +BRDA:193,245,491,- +BRDA:193,246,492,- +BRDA:193,246,493,- +BRDA:193,247,494,- +BRDA:193,247,495,- +BRDA:193,248,496,- +BRDA:193,248,497,- +BRDA:193,249,498,- +BRDA:193,249,499,- +BRDA:193,250,500,- +BRDA:193,250,501,- +BRDA:193,251,502,- +BRDA:193,251,503,- +BRDA:193,252,504,- +BRDA:193,252,505,- +BRDA:193,253,506,- +BRDA:193,253,507,- +BRDA:193,254,508,- +BRDA:193,254,509,- +BRDA:193,255,510,- +BRDA:193,255,511,- +BRDA:193,256,512,- +BRDA:193,256,513,- +BRDA:193,257,514,- +BRDA:193,257,515,- +BRDA:193,258,516,- +BRDA:193,258,517,- +BRDA:193,259,518,- +BRDA:193,259,519,- +BRDA:193,260,520,- +BRDA:193,260,521,- +BRDA:193,261,522,- +BRDA:193,261,523,- +BRDA:193,262,524,- +BRDA:193,262,525,- +BRDA:193,263,526,- +BRDA:193,263,527,- +BRDA:193,264,528,- +BRDA:193,264,529,- +BRDA:193,265,530,- +BRDA:193,265,531,- +BRDA:193,266,532,- +BRDA:193,266,533,- +BRDA:193,267,534,- +BRDA:193,267,535,- +BRDA:193,268,536,- +BRDA:193,268,537,- +BRDA:193,269,538,- +BRDA:193,269,539,- +BRDA:193,270,540,- +BRDA:193,270,541,- +BRDA:193,271,542,- +BRDA:193,271,543,- +BRDA:193,272,544,- +BRDA:193,272,545,- +BRDA:193,273,546,- +BRDA:193,273,547,- +BRDA:193,274,548,- +BRDA:193,274,549,- +BRDA:193,275,550,- +BRDA:193,275,551,- +BRDA:193,276,552,- +BRDA:193,276,553,- +BRDA:193,277,554,- +BRDA:193,277,555,- +BRDA:193,278,556,- +BRDA:193,278,557,- +BRDA:193,279,558,- +BRDA:193,279,559,- +BRDA:193,280,560,- +BRDA:193,280,561,- +BRDA:193,281,562,- +BRDA:193,281,563,- +BRDA:193,282,564,- +BRDA:193,282,565,- +BRDA:193,283,566,- +BRDA:193,283,567,- +BRDA:193,284,568,- +BRDA:193,284,569,- +BRDA:193,285,570,- +BRDA:193,285,571,- +BRDA:193,286,572,- +BRDA:193,286,573,- +BRDA:193,287,574,- +BRDA:193,287,575,- +BRDA:193,288,576,- +BRDA:193,288,577,- +BRDA:193,289,578,- +BRDA:193,289,579,- +BRDA:193,290,580,- +BRDA:193,290,581,- +BRDA:193,291,582,- +BRDA:193,291,583,- +BRDA:193,292,584,- +BRDA:193,292,585,- +BRDA:193,293,586,- +BRDA:193,293,587,- +BRDA:193,294,588,- +BRDA:193,294,589,- +BRDA:193,295,590,- +BRDA:193,295,591,- +BRDA:193,296,592,- +BRDA:193,296,593,- +BRDA:193,297,594,- +BRDA:193,297,595,- +BRDA:193,298,596,- +BRDA:193,298,597,- +BRDA:193,299,598,- +BRDA:193,299,599,- +BRDA:205,0,0,- +BRDA:205,0,1,- +BRDA:205,1,2,- +BRDA:205,1,3,- +BRDA:205,2,4,- +BRDA:205,2,5,- +BRDA:205,3,6,- +BRDA:205,3,7,- +BRDA:205,4,8,- +BRDA:205,4,9,- +BRDA:205,5,10,- +BRDA:205,5,11,- +BRDA:205,6,12,- +BRDA:205,6,13,- +BRDA:205,7,14,- +BRDA:205,7,15,- +BRDA:205,8,16,- +BRDA:205,8,17,- +BRDA:205,9,18,- +BRDA:205,9,19,- +BRDA:205,10,20,- +BRDA:205,10,21,- +BRDA:205,11,22,- +BRDA:205,11,23,- +BRDA:205,12,24,- +BRDA:205,12,25,- +BRDA:205,13,26,- +BRDA:205,13,27,- +BRDA:205,14,28,- +BRDA:205,14,29,- +BRDA:205,15,30,- +BRDA:205,15,31,- +BRDA:205,16,32,- +BRDA:205,16,33,- +BRDA:205,17,34,- +BRDA:205,17,35,- +BRDA:205,18,36,- +BRDA:205,18,37,- +BRDA:205,19,38,- +BRDA:205,19,39,- +BRDA:205,20,40,- +BRDA:205,20,41,- +BRDA:205,21,42,- +BRDA:205,21,43,- +BRDA:205,22,44,- +BRDA:205,22,45,- +BRDA:205,23,46,- +BRDA:205,23,47,- +BRDA:205,24,48,- +BRDA:205,24,49,- +BRDA:205,25,50,- +BRDA:205,25,51,- +BRDA:205,26,52,- +BRDA:205,26,53,- +BRDA:205,27,54,- +BRDA:205,27,55,- +BRDA:205,28,56,- +BRDA:205,28,57,- +BRDA:205,29,58,- +BRDA:205,29,59,- +BRDA:205,30,60,- +BRDA:205,30,61,- +BRDA:205,31,62,- +BRDA:205,31,63,- +BRDA:205,32,64,- +BRDA:205,32,65,- +BRDA:205,33,66,- +BRDA:205,33,67,- +BRDA:205,34,68,- +BRDA:205,34,69,- +BRDA:205,35,70,- +BRDA:205,35,71,- +BRDA:205,36,72,- +BRDA:205,36,73,- +BRDA:205,37,74,- +BRDA:205,37,75,- +BRDA:205,38,76,- +BRDA:205,38,77,- +BRDA:205,39,78,- +BRDA:205,39,79,- +BRDA:205,40,80,- +BRDA:205,40,81,- +BRDA:205,41,82,- +BRDA:205,41,83,- +BRDA:205,42,84,- +BRDA:205,42,85,- +BRDA:205,43,86,- +BRDA:205,43,87,- +BRDA:205,44,88,- +BRDA:205,44,89,- +BRDA:205,45,90,- +BRDA:205,45,91,- +BRDA:205,46,92,- +BRDA:205,46,93,- +BRDA:205,47,94,- +BRDA:205,47,95,- +BRDA:205,48,96,- +BRDA:205,48,97,- +BRDA:205,49,98,- +BRDA:205,49,99,- +BRDA:205,50,100,- +BRDA:205,50,101,- +BRDA:205,51,102,- +BRDA:205,51,103,- +BRDA:205,52,104,- +BRDA:205,52,105,- +BRDA:205,53,106,- +BRDA:205,53,107,- +BRDA:205,54,108,- +BRDA:205,54,109,- +BRDA:205,55,110,- +BRDA:205,55,111,- +BRDA:205,56,112,- +BRDA:205,56,113,- +BRDA:205,57,114,- +BRDA:205,57,115,- +BRDA:205,58,116,- +BRDA:205,58,117,- +BRDA:205,59,118,- +BRDA:205,59,119,- +BRDA:205,60,120,- +BRDA:205,60,121,- +BRDA:205,61,122,- +BRDA:205,61,123,- +BRDA:205,62,124,- +BRDA:205,62,125,- +BRDA:205,63,126,- +BRDA:205,63,127,- +BRDA:205,64,128,- +BRDA:205,64,129,- +BRDA:205,65,130,- +BRDA:205,65,131,- +BRDA:205,66,132,- +BRDA:205,66,133,- +BRDA:205,67,134,- +BRDA:205,67,135,- +BRDA:205,68,136,- +BRDA:205,68,137,- +BRDA:205,69,138,- +BRDA:205,69,139,- +BRDA:205,70,140,- +BRDA:205,70,141,- +BRDA:205,71,142,- +BRDA:205,71,143,- +BRDA:205,72,144,- +BRDA:205,72,145,- +BRDA:205,73,146,- +BRDA:205,73,147,- +BRDA:205,74,148,- +BRDA:205,74,149,- +BRDA:205,75,150,- +BRDA:205,75,151,- +BRDA:205,76,152,- +BRDA:205,76,153,- +BRDA:205,77,154,- +BRDA:205,77,155,- +BRDA:205,78,156,- +BRDA:205,78,157,- +BRDA:205,79,158,- +BRDA:205,79,159,- +BRDA:205,80,160,- +BRDA:205,80,161,- +BRDA:205,81,162,- +BRDA:205,81,163,- +BRDA:205,82,164,- +BRDA:205,82,165,- +BRDA:205,83,166,- +BRDA:205,83,167,- +BRDA:205,84,168,- +BRDA:205,84,169,- +BRDA:205,85,170,- +BRDA:205,85,171,- +BRDA:205,86,172,- +BRDA:205,86,173,- +BRDA:205,87,174,- +BRDA:205,87,175,- +BRDA:205,88,176,- +BRDA:205,88,177,- +BRDA:205,89,178,- +BRDA:205,89,179,- +BRDA:205,90,180,- +BRDA:205,90,181,- +BRDA:205,91,182,- +BRDA:205,91,183,- +BRDA:205,92,184,- +BRDA:205,92,185,- +BRDA:205,93,186,- +BRDA:205,93,187,- +BRDA:205,94,188,- +BRDA:205,94,189,- +BRDA:205,95,190,- +BRDA:205,95,191,- +BRDA:205,96,192,- +BRDA:205,96,193,- +BRDA:205,97,194,- +BRDA:205,97,195,- +BRDA:205,98,196,- +BRDA:205,98,197,- +BRDA:205,99,198,- +BRDA:205,99,199,- +BRDA:205,100,200,- +BRDA:205,100,201,- +BRDA:205,101,202,- +BRDA:205,101,203,- +BRDA:205,102,204,- +BRDA:205,102,205,- +BRDA:205,103,206,- +BRDA:205,103,207,- +BRDA:205,104,208,- +BRDA:205,104,209,- +BRDA:205,105,210,- +BRDA:205,105,211,- +BRDA:205,106,212,- +BRDA:205,106,213,- +BRDA:205,107,214,- +BRDA:205,107,215,- +BRDA:205,108,216,- +BRDA:205,108,217,- +BRDA:205,109,218,- +BRDA:205,109,219,- +BRDA:205,110,220,- +BRDA:205,110,221,- +BRDA:205,111,222,- +BRDA:205,111,223,- +BRDA:205,112,224,- +BRDA:205,112,225,- +BRDA:205,113,226,- +BRDA:205,113,227,- +BRDA:205,114,228,- +BRDA:205,114,229,- +BRDA:205,115,230,- +BRDA:205,115,231,- +BRDA:205,116,232,- +BRDA:205,116,233,- +BRDA:205,117,234,- +BRDA:205,117,235,- +BRDA:205,118,236,- +BRDA:205,118,237,- +BRDA:205,119,238,- +BRDA:205,119,239,- +BRDA:205,120,240,- +BRDA:205,120,241,- +BRDA:205,121,242,- +BRDA:205,121,243,- +BRDA:205,122,244,- +BRDA:205,122,245,- +BRDA:205,123,246,- +BRDA:205,123,247,- +BRDA:205,124,248,- +BRDA:205,124,249,- +BRDA:205,125,250,- +BRDA:205,125,251,- +BRDA:205,126,252,- +BRDA:205,126,253,- +BRDA:205,127,254,- +BRDA:205,127,255,- +BRDA:205,128,256,- +BRDA:205,128,257,- +BRDA:205,129,258,- +BRDA:205,129,259,- +BRDA:205,130,260,- +BRDA:205,130,261,- +BRDA:205,131,262,- +BRDA:205,131,263,- +BRDA:205,132,264,- +BRDA:205,132,265,- +BRDA:205,133,266,- +BRDA:205,133,267,- +BRDA:205,134,268,- +BRDA:205,134,269,- +BRDA:205,135,270,- +BRDA:205,135,271,- +BRDA:205,136,272,- +BRDA:205,136,273,- +BRDA:205,137,274,- +BRDA:205,137,275,- +BRDA:205,138,276,- +BRDA:205,138,277,- +BRDA:205,139,278,- +BRDA:205,139,279,- +BRDA:205,140,280,- +BRDA:205,140,281,- +BRDA:205,141,282,- +BRDA:205,141,283,- +BRDA:205,142,284,- +BRDA:205,142,285,- +BRDA:205,143,286,- +BRDA:205,143,287,- +BRDA:205,144,288,- +BRDA:205,144,289,- +BRDA:205,145,290,- +BRDA:205,145,291,- +BRDA:205,146,292,- +BRDA:205,146,293,- +BRDA:205,147,294,- +BRDA:205,147,295,- +BRDA:205,148,296,- +BRDA:205,148,297,- +BRDA:205,149,298,- +BRDA:205,149,299,- +BRDA:205,150,300,- +BRDA:205,150,301,- +BRDA:205,151,302,- +BRDA:205,151,303,- +BRDA:205,152,304,- +BRDA:205,152,305,- +BRDA:205,153,306,- +BRDA:205,153,307,- +BRDA:205,154,308,- +BRDA:205,154,309,- +BRDA:205,155,310,- +BRDA:205,155,311,- +BRDA:205,156,312,- +BRDA:205,156,313,- +BRDA:205,157,314,- +BRDA:205,157,315,- +BRDA:205,158,316,- +BRDA:205,158,317,- +BRDA:205,159,318,- +BRDA:205,159,319,- +BRDA:205,160,320,- +BRDA:205,160,321,- +BRDA:205,161,322,- +BRDA:205,161,323,- +BRDA:205,162,324,- +BRDA:205,162,325,- +BRDA:205,163,326,- +BRDA:205,163,327,- +BRDA:205,164,328,- +BRDA:205,164,329,- +BRDA:205,165,330,- +BRDA:205,165,331,- +BRDA:205,166,332,- +BRDA:205,166,333,- +BRDA:205,167,334,- +BRDA:205,167,335,- +BRDA:205,168,336,- +BRDA:205,168,337,- +BRDA:205,169,338,- +BRDA:205,169,339,- +BRDA:205,170,340,- +BRDA:205,170,341,- +BRDA:205,171,342,- +BRDA:205,171,343,- +BRDA:205,172,344,- +BRDA:205,172,345,- +BRDA:205,173,346,- +BRDA:205,173,347,- +BRDA:205,174,348,- +BRDA:205,174,349,- +BRDA:205,175,350,- +BRDA:205,175,351,- +BRDA:205,176,352,- +BRDA:205,176,353,- +BRDA:205,177,354,- +BRDA:205,177,355,- +BRDA:205,178,356,- +BRDA:205,178,357,- +BRDA:205,179,358,- +BRDA:205,179,359,- +BRDA:205,180,360,- +BRDA:205,180,361,- +BRDA:205,181,362,- +BRDA:205,181,363,- +BRDA:205,182,364,- +BRDA:205,182,365,- +BRDA:205,183,366,- +BRDA:205,183,367,- +BRDA:205,184,368,- +BRDA:205,184,369,- +BRDA:205,185,370,- +BRDA:205,185,371,- +BRDA:205,186,372,- +BRDA:205,186,373,- +BRDA:205,187,374,- +BRDA:205,187,375,- +BRDA:205,188,376,- +BRDA:205,188,377,- +BRDA:205,189,378,- +BRDA:205,189,379,- +BRDA:205,190,380,- +BRDA:205,190,381,- +BRDA:205,191,382,- +BRDA:205,191,383,- +BRDA:205,192,384,- +BRDA:205,192,385,- +BRDA:205,193,386,- +BRDA:205,193,387,- +BRDA:205,194,388,- +BRDA:205,194,389,- +BRDA:205,195,390,- +BRDA:205,195,391,- +BRDA:205,196,392,- +BRDA:205,196,393,- +BRDA:205,197,394,- +BRDA:205,197,395,- +BRDA:205,198,396,- +BRDA:205,198,397,- +BRDA:205,199,398,- +BRDA:205,199,399,- +BRDA:205,200,400,- +BRDA:205,200,401,- +BRDA:205,201,402,- +BRDA:205,201,403,- +BRDA:205,202,404,- +BRDA:205,202,405,- +BRDA:205,203,406,- +BRDA:205,203,407,- +BRDA:205,204,408,- +BRDA:205,204,409,- +BRDA:205,205,410,- +BRDA:205,205,411,- +BRDA:205,206,412,- +BRDA:205,206,413,- +BRDA:205,207,414,- +BRDA:205,207,415,- +BRDA:205,208,416,- +BRDA:205,208,417,- +BRDA:205,209,418,- +BRDA:205,209,419,- +BRDA:205,210,420,- +BRDA:205,210,421,- +BRDA:205,211,422,- +BRDA:205,211,423,- +BRDA:205,212,424,- +BRDA:205,212,425,- +BRDA:205,213,426,- +BRDA:205,213,427,- +BRDA:205,214,428,- +BRDA:205,214,429,- +BRDA:205,215,430,- +BRDA:205,215,431,- +BRDA:205,216,432,- +BRDA:205,216,433,- +BRDA:205,217,434,- +BRDA:205,217,435,- +BRDA:205,218,436,- +BRDA:205,218,437,- +BRDA:205,219,438,- +BRDA:205,219,439,- +BRDA:205,220,440,- +BRDA:205,220,441,- +BRDA:205,221,442,- +BRDA:205,221,443,- +BRDA:205,222,444,- +BRDA:205,222,445,- +BRDA:205,223,446,- +BRDA:205,223,447,- +BRDA:205,224,448,- +BRDA:205,224,449,- +BRDA:205,225,450,- +BRDA:205,225,451,- +BRDA:205,226,452,- +BRDA:205,226,453,- +BRDA:205,227,454,- +BRDA:205,227,455,- +BRDA:205,228,456,- +BRDA:205,228,457,- +BRDA:205,229,458,- +BRDA:205,229,459,- +BRDA:205,230,460,- +BRDA:205,230,461,- +BRDA:205,231,462,- +BRDA:205,231,463,- +BRDA:205,232,464,- +BRDA:205,232,465,- +BRDA:205,233,466,- +BRDA:205,233,467,- +BRDA:205,234,468,- +BRDA:205,234,469,- +BRDA:205,235,470,- +BRDA:205,235,471,- +BRDA:205,236,472,- +BRDA:205,236,473,- +BRDA:205,237,474,- +BRDA:205,237,475,- +BRDA:205,238,476,- +BRDA:205,238,477,- +BRDA:205,239,478,- +BRDA:205,239,479,- +BRDA:205,240,480,- +BRDA:205,240,481,- +BRDA:205,241,482,- +BRDA:205,241,483,- +BRDA:205,242,484,- +BRDA:205,242,485,- +BRDA:205,243,486,- +BRDA:205,243,487,- +BRDA:205,244,488,- +BRDA:205,244,489,- +BRDA:205,245,490,- +BRDA:205,245,491,- +BRDA:205,246,492,- +BRDA:205,246,493,- +BRDA:205,247,494,- +BRDA:205,247,495,- +BRDA:205,248,496,- +BRDA:205,248,497,- +BRDA:205,249,498,- +BRDA:205,249,499,- +BRDA:205,250,500,- +BRDA:205,250,501,- +BRDA:205,251,502,- +BRDA:205,251,503,- +BRDA:205,252,504,- +BRDA:205,252,505,- +BRDA:205,253,506,- +BRDA:205,253,507,- +BRDA:205,254,508,- +BRDA:205,254,509,- +BRDA:205,255,510,- +BRDA:205,255,511,- +BRDA:205,256,512,- +BRDA:205,256,513,- +BRDA:205,257,514,- +BRDA:205,257,515,- +BRDA:205,258,516,- +BRDA:205,258,517,- +BRDA:205,259,518,- +BRDA:205,259,519,- +BRDA:205,260,520,- +BRDA:205,260,521,- +BRDA:205,261,522,- +BRDA:205,261,523,- +BRDA:205,262,524,- +BRDA:205,262,525,- +BRDA:205,263,526,- +BRDA:205,263,527,- +BRDA:205,264,528,- +BRDA:205,264,529,- +BRDA:205,265,530,- +BRDA:205,265,531,- +BRDA:205,266,532,- +BRDA:205,266,533,- +BRDA:205,267,534,- +BRDA:205,267,535,- +BRDA:205,268,536,- +BRDA:205,268,537,- +BRDA:205,269,538,- +BRDA:205,269,539,- +BRDA:205,270,540,- +BRDA:205,270,541,- +BRDA:205,271,542,- +BRDA:205,271,543,- +BRDA:205,272,544,- +BRDA:205,272,545,- +BRDA:205,273,546,- +BRDA:205,273,547,- +BRDA:205,274,548,- +BRDA:205,274,549,- +BRDA:205,275,550,- +BRDA:205,275,551,- +BRDA:205,276,552,- +BRDA:205,276,553,- +BRDA:205,277,554,- +BRDA:205,277,555,- +BRDA:205,278,556,- +BRDA:205,278,557,- +BRDA:205,279,558,- +BRDA:205,279,559,- +BRDA:205,280,560,- +BRDA:205,280,561,- +BRDA:205,281,562,- +BRDA:205,281,563,- +BRDA:205,282,564,- +BRDA:205,282,565,- +BRDA:205,283,566,- +BRDA:205,283,567,- +BRDA:205,284,568,- +BRDA:205,284,569,- +BRDA:205,285,570,- +BRDA:205,285,571,- +BRDA:205,286,572,- +BRDA:205,286,573,- +BRDA:205,287,574,- +BRDA:205,287,575,- +BRDA:205,288,576,- +BRDA:205,288,577,- +BRDA:205,289,578,- +BRDA:205,289,579,- +BRDA:205,290,580,- +BRDA:205,290,581,- +BRDA:205,291,582,- +BRDA:205,291,583,- +BRDA:205,292,584,- +BRDA:205,292,585,- +BRDA:205,293,586,- +BRDA:205,293,587,- +BRDA:205,294,588,- +BRDA:205,294,589,- +BRDA:205,295,590,- +BRDA:205,295,591,- +BRDA:205,296,592,- +BRDA:205,296,593,- +BRDA:205,297,594,- +BRDA:205,297,595,- +BRDA:205,298,596,- +BRDA:205,298,597,- +BRDA:205,299,598,- +BRDA:205,299,599,- +BRDA:205,300,600,- +BRDA:205,300,601,- +BRDA:205,301,602,- +BRDA:205,301,603,- +BRDA:205,302,604,- +BRDA:205,302,605,- +BRDA:205,303,606,- +BRDA:205,303,607,- +BRDA:205,304,608,- +BRDA:205,304,609,- +BRDA:205,305,610,- +BRDA:205,305,611,- +BRDA:205,306,612,- +BRDA:205,306,613,- +BRDA:205,307,614,- +BRDA:205,307,615,- +BRDA:205,308,616,- +BRDA:205,308,617,- +BRDA:205,309,618,- +BRDA:205,309,619,- +BRDA:205,310,620,- +BRDA:205,310,621,- +BRDA:205,311,622,- +BRDA:205,311,623,- +BRDA:205,312,624,- +BRDA:205,312,625,- +BRDA:205,313,626,- +BRDA:205,313,627,- +BRDA:205,314,628,- +BRDA:205,314,629,- +BRDA:205,315,630,- +BRDA:205,315,631,- +BRDA:205,316,632,- +BRDA:205,316,633,- +BRDA:205,317,634,- +BRDA:205,317,635,- +BRDA:205,318,636,- +BRDA:205,318,637,- +BRDA:205,319,638,- +BRDA:205,319,639,- +BRDA:205,320,640,- +BRDA:205,320,641,- +BRDA:205,321,642,- +BRDA:205,321,643,- +BRDA:205,322,644,- +BRDA:205,322,645,- +BRDA:205,323,646,- +BRDA:205,323,647,- +BRDA:205,324,648,- +BRDA:205,324,649,- +BRDA:205,325,650,- +BRDA:205,325,651,- +BRDA:205,326,652,- +BRDA:205,326,653,- +BRDA:205,327,654,- +BRDA:205,327,655,- +BRDA:205,328,656,- +BRDA:205,328,657,- +BRDA:205,329,658,- +BRDA:205,329,659,- +BRDA:205,330,660,- +BRDA:205,330,661,- +BRDA:205,331,662,- +BRDA:205,331,663,- +BRDA:205,332,664,- +BRDA:205,332,665,- +BRDA:205,333,666,- +BRDA:205,333,667,- +BRDA:205,334,668,- +BRDA:205,334,669,- +BRDA:205,335,670,- +BRDA:205,335,671,- +BRDA:205,336,672,- +BRDA:205,336,673,- +BRDA:205,337,674,- +BRDA:205,337,675,- +BRDA:205,338,676,- +BRDA:205,338,677,- +BRDA:205,339,678,- +BRDA:205,339,679,- +BRDA:205,340,680,- +BRDA:205,340,681,- +BRDA:205,341,682,- +BRDA:205,341,683,- +BRDA:205,342,684,- +BRDA:205,342,685,- +BRDA:205,343,686,- +BRDA:205,343,687,- +BRDA:205,344,688,- +BRDA:205,344,689,- +BRDA:205,345,690,- +BRDA:205,345,691,- +BRDA:205,346,692,- +BRDA:205,346,693,- +BRDA:205,347,694,- +BRDA:205,347,695,- +BRDA:205,348,696,- +BRDA:205,348,697,- +BRDA:205,349,698,- +BRDA:205,349,699,- +BRDA:205,350,700,- +BRDA:205,350,701,- +BRDA:205,351,702,- +BRDA:205,351,703,- +BRDA:205,352,704,- +BRDA:205,352,705,- +BRDA:205,353,706,- +BRDA:205,353,707,- +BRDA:205,354,708,- +BRDA:205,354,709,- +BRDA:205,355,710,- +BRDA:205,355,711,- +BRDA:205,356,712,- +BRDA:205,356,713,- +BRDA:205,357,714,- +BRDA:205,357,715,- +BRDA:205,358,716,- +BRDA:205,358,717,- +BRDA:205,359,718,- +BRDA:205,359,719,- +BRDA:205,360,720,- +BRDA:205,360,721,- +BRDA:205,361,722,- +BRDA:205,361,723,- +BRDA:205,362,724,- +BRDA:205,362,725,- +BRDA:205,363,726,- +BRDA:205,363,727,- +BRDA:205,364,728,- +BRDA:205,364,729,- +BRDA:205,365,730,- +BRDA:205,365,731,- +BRDA:205,366,732,- +BRDA:205,366,733,- +BRDA:205,367,734,- +BRDA:205,367,735,- +BRDA:205,368,736,- +BRDA:205,368,737,- +BRDA:205,369,738,- +BRDA:205,369,739,- +BRDA:205,370,740,- +BRDA:205,370,741,- +BRDA:205,371,742,- +BRDA:205,371,743,- +BRDA:205,372,744,- +BRDA:205,372,745,- +BRDA:205,373,746,- +BRDA:205,373,747,- +BRDA:205,374,748,- +BRDA:205,374,749,- +BRDA:205,375,750,- +BRDA:205,375,751,- +BRDA:205,376,752,- +BRDA:205,376,753,- +BRDA:205,377,754,- +BRDA:205,377,755,- +BRDA:205,378,756,- +BRDA:205,378,757,- +BRDA:205,379,758,- +BRDA:205,379,759,- +BRDA:205,380,760,- +BRDA:205,380,761,- +BRDA:205,381,762,- +BRDA:205,381,763,- +BRDA:205,382,764,- +BRDA:205,382,765,- +BRDA:205,383,766,- +BRDA:205,383,767,- +BRDA:205,384,768,- +BRDA:205,384,769,- +BRDA:205,385,770,- +BRDA:205,385,771,- +BRDA:205,386,772,- +BRDA:205,386,773,- +BRDA:205,387,774,- +BRDA:205,387,775,- +BRDA:205,388,776,- +BRDA:205,388,777,- +BRDA:205,389,778,- +BRDA:205,389,779,- +BRDA:205,390,780,- +BRDA:205,390,781,- +BRDA:205,391,782,- +BRDA:205,391,783,- +BRDA:205,392,784,- +BRDA:205,392,785,- +BRDA:205,393,786,- +BRDA:205,393,787,- +BRDA:205,394,788,- +BRDA:205,394,789,- +BRDA:205,395,790,- +BRDA:205,395,791,- +BRDA:205,396,792,- +BRDA:205,396,793,- +BRDA:205,397,794,- +BRDA:205,397,795,- +BRDA:205,398,796,- +BRDA:205,398,797,- +BRDA:205,399,798,- +BRDA:205,399,799,- +BRDA:205,400,800,- +BRDA:205,400,801,- +BRDA:205,401,802,- +BRDA:205,401,803,- +BRDA:205,402,804,- +BRDA:205,402,805,- +BRDA:205,403,806,- +BRDA:205,403,807,- +BRDA:205,404,808,- +BRDA:205,404,809,- +BRDA:205,405,810,- +BRDA:205,405,811,- +BRDA:205,406,812,- +BRDA:205,406,813,- +BRDA:205,407,814,- +BRDA:205,407,815,- +BRDA:205,408,816,- +BRDA:205,408,817,- +BRDA:205,409,818,- +BRDA:205,409,819,- +BRDA:205,410,820,- +BRDA:205,410,821,- +BRDA:205,411,822,- +BRDA:205,411,823,- +BRDA:205,412,824,- +BRDA:205,412,825,- +BRDA:205,413,826,- +BRDA:205,413,827,- +BRDA:205,414,828,- +BRDA:205,414,829,- +BRDA:205,415,830,- +BRDA:205,415,831,- +BRDA:205,416,832,- +BRDA:205,416,833,- +BRDA:205,417,834,- +BRDA:205,417,835,- +BRDA:205,418,836,- +BRDA:205,418,837,- +BRDA:205,419,838,- +BRDA:205,419,839,- +BRDA:205,420,840,- +BRDA:205,420,841,- +BRDA:205,421,842,- +BRDA:205,421,843,- +BRDA:205,422,844,- +BRDA:205,422,845,- +BRDA:205,423,846,- +BRDA:205,423,847,- +BRDA:205,424,848,- +BRDA:205,424,849,- +BRDA:205,425,850,- +BRDA:205,425,851,- +BRDA:205,426,852,- +BRDA:205,426,853,- +BRDA:205,427,854,- +BRDA:205,427,855,- +BRDA:205,428,856,- +BRDA:205,428,857,- +BRDA:205,429,858,- +BRDA:205,429,859,- +BRDA:205,430,860,- +BRDA:205,430,861,- +BRDA:205,431,862,- +BRDA:205,431,863,- +BRDA:205,432,864,- +BRDA:205,432,865,- +BRDA:205,433,866,- +BRDA:205,433,867,- +BRDA:205,434,868,- +BRDA:205,434,869,- +BRDA:205,435,870,- +BRDA:205,435,871,- +BRDA:205,436,872,- +BRDA:205,436,873,- +BRDA:205,437,874,- +BRDA:205,437,875,- +BRDA:205,438,876,- +BRDA:205,438,877,- +BRDA:205,439,878,- +BRDA:205,439,879,- +BRDA:205,440,880,- +BRDA:205,440,881,- +BRDA:205,441,882,- +BRDA:205,441,883,- +BRDA:205,442,884,- +BRDA:205,442,885,- +BRDA:205,443,886,- +BRDA:205,443,887,- +BRDA:205,444,888,- +BRDA:205,444,889,- +BRDA:205,445,890,- +BRDA:205,445,891,- +BRDA:205,446,892,- +BRDA:205,446,893,- +BRDA:205,447,894,- +BRDA:205,447,895,- +BRDA:205,448,896,- +BRDA:205,448,897,- +BRDA:205,449,898,- +BRDA:205,449,899,- +BRDA:205,450,900,- +BRDA:205,450,901,- +BRDA:205,451,902,- +BRDA:205,451,903,- +BRDA:205,452,904,- +BRDA:205,452,905,- +BRDA:205,453,906,- +BRDA:205,453,907,- +BRDA:205,454,908,- +BRDA:205,454,909,- +BRDA:205,455,910,- +BRDA:205,455,911,- +BRDA:205,456,912,- +BRDA:205,456,913,- +BRDA:205,457,914,- +BRDA:205,457,915,- +BRDA:205,458,916,- +BRDA:205,458,917,- +BRDA:205,459,918,- +BRDA:205,459,919,- +BRDA:205,460,920,- +BRDA:205,460,921,- +BRDA:205,461,922,- +BRDA:205,461,923,- +BRDA:205,462,924,- +BRDA:205,462,925,- +BRDA:205,463,926,- +BRDA:205,463,927,- +BRDA:205,464,928,- +BRDA:205,464,929,- +BRDA:205,465,930,- +BRDA:205,465,931,- +BRDA:205,466,932,- +BRDA:205,466,933,- +BRDA:205,467,934,- +BRDA:205,467,935,- +BRDA:205,468,936,- +BRDA:205,468,937,- +BRDA:205,469,938,- +BRDA:205,469,939,- +BRDA:205,470,940,- +BRDA:205,470,941,- +BRDA:205,471,942,- +BRDA:205,471,943,- +BRDA:205,472,944,- +BRDA:205,472,945,- +BRDA:205,473,946,- +BRDA:205,473,947,- +BRDA:205,474,948,- +BRDA:205,474,949,- +BRDA:205,475,950,- +BRDA:205,475,951,- +BRDA:205,476,952,- +BRDA:205,476,953,- +BRDA:205,477,954,- +BRDA:205,477,955,- +BRDA:205,478,956,- +BRDA:205,478,957,- +BRDA:205,479,958,- +BRDA:205,479,959,- +BRDA:205,480,960,- +BRDA:205,480,961,- +BRDA:205,481,962,- +BRDA:205,481,963,- +BRDA:205,482,964,- +BRDA:205,482,965,- +BRDA:205,483,966,- +BRDA:205,483,967,- +BRDA:205,484,968,- +BRDA:205,484,969,- +BRDA:205,485,970,- +BRDA:205,485,971,- +BRDA:205,486,972,- +BRDA:205,486,973,- +BRDA:205,487,974,- +BRDA:205,487,975,- +BRDA:205,488,976,- +BRDA:205,488,977,- +BRDA:205,489,978,- +BRDA:205,489,979,- +BRDA:205,490,980,- +BRDA:205,490,981,- +BRDA:205,491,982,- +BRDA:205,491,983,- +BRDA:205,492,984,- +BRDA:205,492,985,- +BRDA:205,493,986,- +BRDA:205,493,987,- +BRDA:205,494,988,- +BRDA:205,494,989,- +BRDA:205,495,990,- +BRDA:205,495,991,- +BRDA:205,496,992,- +BRDA:205,496,993,- +BRDA:205,497,994,- +BRDA:205,497,995,- +BRDA:205,498,996,- +BRDA:205,498,997,- +BRDA:205,499,998,- +BRDA:205,499,999,- +BRDA:205,500,1000,- +BRDA:205,500,1001,- +BRDA:205,501,1002,- +BRDA:205,501,1003,- +BRDA:205,502,1004,- +BRDA:205,502,1005,- +BRDA:205,503,1006,- +BRDA:205,503,1007,- +BRDA:205,504,1008,- +BRDA:205,504,1009,- +BRDA:205,505,1010,- +BRDA:205,505,1011,- +BRDA:205,506,1012,- +BRDA:205,506,1013,- +BRDA:205,507,1014,- +BRDA:205,507,1015,- +BRDA:205,508,1016,- +BRDA:205,508,1017,- +BRDA:205,509,1018,- +BRDA:205,509,1019,- +BRDA:205,510,1020,- +BRDA:205,510,1021,- +BRDA:205,511,1022,- +BRDA:205,511,1023,- +BRDA:205,512,1024,- +BRDA:205,512,1025,- +BRDA:205,513,1026,- +BRDA:205,513,1027,- +BRDA:205,514,1028,- +BRDA:205,514,1029,- +BRDA:205,515,1030,- +BRDA:205,515,1031,- +BRDA:205,516,1032,- +BRDA:205,516,1033,- +BRDA:205,517,1034,- +BRDA:205,517,1035,- +BRDA:205,518,1036,- +BRDA:205,518,1037,- +BRDA:205,519,1038,- +BRDA:205,519,1039,- +BRDA:205,520,1040,- +BRDA:205,520,1041,- +BRDA:205,521,1042,- +BRDA:205,521,1043,- +BRDA:205,522,1044,- +BRDA:205,522,1045,- +BRDA:205,523,1046,- +BRDA:205,523,1047,- +BRDA:205,524,1048,- +BRDA:205,524,1049,- +BRDA:205,525,1050,- +BRDA:205,525,1051,- +BRDA:205,526,1052,- +BRDA:205,526,1053,- +BRDA:205,527,1054,- +BRDA:205,527,1055,- +BRDA:205,528,1056,- +BRDA:205,528,1057,- +BRDA:205,529,1058,- +BRDA:205,529,1059,- +BRDA:205,530,1060,- +BRDA:205,530,1061,- +BRDA:205,531,1062,- +BRDA:205,531,1063,- +BRDA:205,532,1064,- +BRDA:205,532,1065,- +BRDA:205,533,1066,- +BRDA:205,533,1067,- +BRDA:205,534,1068,- +BRDA:205,534,1069,- +BRDA:205,535,1070,- +BRDA:205,535,1071,- +BRDA:205,536,1072,- +BRDA:205,536,1073,- +BRDA:205,537,1074,- +BRDA:205,537,1075,- +BRDA:205,538,1076,- +BRDA:205,538,1077,- +BRDA:205,539,1078,- +BRDA:205,539,1079,- +BRDA:205,540,1080,- +BRDA:205,540,1081,- +BRDA:205,541,1082,- +BRDA:205,541,1083,- +BRDA:205,542,1084,- +BRDA:205,542,1085,- +BRDA:205,543,1086,- +BRDA:205,543,1087,- +BRDA:205,544,1088,- +BRDA:205,544,1089,- +BRDA:205,545,1090,- +BRDA:205,545,1091,- +BRDA:205,546,1092,- +BRDA:205,546,1093,- +BRDA:205,547,1094,- +BRDA:205,547,1095,- +BRDA:205,548,1096,- +BRDA:205,548,1097,- +BRDA:205,549,1098,- +BRDA:205,549,1099,- +BRDA:205,550,1100,- +BRDA:205,550,1101,- +BRDA:205,551,1102,- +BRDA:205,551,1103,- +BRDA:205,552,1104,- +BRDA:205,552,1105,- +BRDA:205,553,1106,- +BRDA:205,553,1107,- +BRDA:205,554,1108,- +BRDA:205,554,1109,- +BRDA:205,555,1110,- +BRDA:205,555,1111,- +BRDA:205,556,1112,- +BRDA:205,556,1113,- +BRDA:205,557,1114,- +BRDA:205,557,1115,- +BRDA:205,558,1116,- +BRDA:205,558,1117,- +BRDA:205,559,1118,- +BRDA:205,559,1119,- +BRDA:205,560,1120,- +BRDA:205,560,1121,- +BRDA:205,561,1122,- +BRDA:205,561,1123,- +BRDA:205,562,1124,- +BRDA:205,562,1125,- +BRDA:205,563,1126,- +BRDA:205,563,1127,- +BRDA:205,564,1128,- +BRDA:205,564,1129,- +BRDA:205,565,1130,- +BRDA:205,565,1131,- +BRDA:205,566,1132,- +BRDA:205,566,1133,- +BRDA:205,567,1134,- +BRDA:205,567,1135,- +BRDA:205,568,1136,- +BRDA:205,568,1137,- +BRDA:205,569,1138,- +BRDA:205,569,1139,- +BRDA:205,570,1140,- +BRDA:205,570,1141,- +BRDA:205,571,1142,- +BRDA:205,571,1143,- +BRDA:205,572,1144,- +BRDA:205,572,1145,- +BRDA:205,573,1146,- +BRDA:205,573,1147,- +BRDA:205,574,1148,- +BRDA:205,574,1149,- +BRDA:205,575,1150,- +BRDA:205,575,1151,- +BRDA:205,576,1152,- +BRDA:205,576,1153,- +BRDA:205,577,1154,- +BRDA:205,577,1155,- +BRDA:205,578,1156,- +BRDA:205,578,1157,- +BRDA:205,579,1158,- +BRDA:205,579,1159,- +BRDA:205,580,1160,- +BRDA:205,580,1161,- +BRDA:205,581,1162,- +BRDA:205,581,1163,- +BRDA:205,582,1164,- +BRDA:205,582,1165,- +BRDA:205,583,1166,- +BRDA:205,583,1167,- +BRDA:205,584,1168,- +BRDA:205,584,1169,- +BRDA:205,585,1170,- +BRDA:205,585,1171,- +BRDA:205,586,1172,- +BRDA:205,586,1173,- +BRDA:205,587,1174,- +BRDA:205,587,1175,- +BRDA:205,588,1176,- +BRDA:205,588,1177,- +BRDA:205,589,1178,- +BRDA:205,589,1179,- +BRDA:205,590,1180,- +BRDA:205,590,1181,- +BRDA:205,591,1182,- +BRDA:205,591,1183,- +BRDA:205,592,1184,- +BRDA:205,592,1185,- +BRDA:205,593,1186,- +BRDA:205,593,1187,- +BRDA:205,594,1188,- +BRDA:205,594,1189,- +BRDA:205,595,1190,- +BRDA:205,595,1191,- +BRDA:205,596,1192,- +BRDA:205,596,1193,- +BRDA:205,597,1194,- +BRDA:205,597,1195,- +BRDA:205,598,1196,- +BRDA:205,598,1197,- +BRDA:205,599,1198,- +BRDA:205,599,1199,- +BRDA:208,0,0,- +BRDA:208,0,1,- +BRDA:208,1,2,- +BRDA:208,1,3,- +BRDA:243,0,0,72 +BRDA:243,0,1,30247 +BRDA:243,1,2,72 +BRDA:243,1,3,41069 +BRDA:243,2,4,72 +BRDA:243,2,5,42183 +BRDA:243,3,6,72 +BRDA:243,3,7,28823 +BRDA:243,4,8,76 +BRDA:243,4,9,34445 +BRDA:243,5,10,72 +BRDA:243,5,11,25057 +BRDA:243,6,12,72 +BRDA:243,6,13,92000 +BRDA:243,7,14,72 +BRDA:243,7,15,312526 +BRDA:243,8,16,64 +BRDA:243,8,17,5863080 +BRDA:243,9,18,70 +BRDA:243,9,19,1237772 +BRDA:243,10,20,64 +BRDA:243,10,21,619859 +BRDA:243,11,22,421209 +BRDA:243,11,23,0 +BRDA:243,12,24,70 +BRDA:243,12,25,282992 +BRDA:243,13,26,88 +BRDA:243,13,27,123464 +BRDA:243,14,28,64 +BRDA:243,14,29,63386 +BRDA:243,15,30,70 +BRDA:243,15,31,52431 +BRDA:243,16,32,70 +BRDA:243,16,33,443689 +BRDA:243,17,34,82 +BRDA:243,17,35,26642 +BRDA:243,18,36,72 +BRDA:243,18,37,29145 +BRDA:243,19,38,72 +BRDA:243,19,39,49850 +BRDA:243,20,40,72 +BRDA:243,20,41,46725 +BRDA:243,21,42,76 +BRDA:243,21,43,47203 +BRDA:243,22,44,72 +BRDA:243,22,45,41985 +BRDA:243,23,46,72 +BRDA:243,23,47,30939 +BRDA:243,24,48,72 +BRDA:243,24,49,28933 +BRDA:243,25,50,72 +BRDA:243,25,51,40581 +BRDA:243,26,52,72 +BRDA:243,26,53,38896 +BRDA:243,27,54,72 +BRDA:243,27,55,34189 +BRDA:243,28,56,72 +BRDA:243,28,57,31921 +BRDA:243,29,58,72 +BRDA:243,29,59,48765 +BRDA:243,30,60,72 +BRDA:243,30,61,21361 +BRDA:243,31,62,72 +BRDA:243,31,63,66320 +BRDA:243,32,64,72 +BRDA:243,32,65,31729 +BRDA:243,33,66,94 +BRDA:243,33,67,2106247 +BRDA:243,34,68,72 +BRDA:243,34,69,45101 +BRDA:243,35,70,72 +BRDA:243,35,71,37463 +BRDA:243,36,72,72 +BRDA:243,36,73,38403 +BRDA:243,37,74,2570 +BRDA:243,37,75,22956 +BRDA:243,38,76,62 +BRDA:243,38,77,4269 +BRDA:243,39,78,64 +BRDA:243,39,79,3594 +BRDA:243,40,80,58 +BRDA:243,40,81,2439 +BRDA:243,41,82,58 +BRDA:243,41,83,2445 +BRDA:243,42,84,373 +BRDA:243,42,85,9398 +BRDA:243,43,86,254 +BRDA:243,43,87,8253 +BRDA:243,44,88,234 +BRDA:243,44,89,4744 +BRDA:243,45,90,220 +BRDA:243,45,91,6934 +BRDA:243,46,92,238 +BRDA:243,46,93,898 +BRDA:243,47,94,64 +BRDA:243,47,95,6813 +BRDA:243,48,96,912 +BRDA:243,48,97,813771 +BRDA:243,49,98,778 +BRDA:243,49,99,76926 +BRDA:243,50,100,527587 +BRDA:243,50,101,0 +BRDA:243,51,102,531 +BRDA:243,51,103,72750 +BRDA:243,52,104,2255 +BRDA:243,52,105,13400 +BRDA:243,53,106,573 +BRDA:243,53,107,2996293 +BRDA:243,54,108,25474 +BRDA:243,54,109,0 +BRDA:243,55,110,2033 +BRDA:243,55,111,0 +BRDA:243,56,112,64 +BRDA:243,56,113,268540 +BRDA:243,57,114,70 +BRDA:243,57,115,24608 +BRDA:243,58,116,82 +BRDA:243,58,117,16580 +BRDA:243,59,118,64 +BRDA:243,59,119,30139 +BRDA:243,60,120,76 +BRDA:243,60,121,15034 +BRDA:243,61,122,82 +BRDA:243,61,123,25036 +BRDA:243,62,124,82 +BRDA:243,62,125,17277 +BRDA:243,63,126,58 +BRDA:243,63,127,717078 +BRDA:243,64,128,58 +BRDA:243,64,129,395191 +BRDA:243,65,130,74 +BRDA:243,65,131,52507 +BRDA:243,66,132,64 +BRDA:243,66,133,84887 +BRDA:243,67,134,64 +BRDA:243,67,135,35822 +BRDA:243,68,136,64 +BRDA:243,68,137,8133 +BRDA:243,69,138,70 +BRDA:243,69,139,3895 +BRDA:243,70,140,64 +BRDA:243,70,141,7811 +BRDA:243,71,142,64 +BRDA:243,71,143,5941 +BRDA:243,72,144,64 +BRDA:243,72,145,2327 +BRDA:243,73,146,64 +BRDA:243,73,147,2757 +BRDA:243,74,148,46 +BRDA:243,74,149,46947 +BRDA:243,75,150,32 +BRDA:243,75,151,51123 +BRDA:243,76,152,32 +BRDA:243,76,153,1742 +BRDA:243,77,154,38 +BRDA:243,77,155,67848 +BRDA:243,78,156,32 +BRDA:243,78,157,75520 +BRDA:243,79,158,111 +BRDA:243,79,159,3467709 +BRDA:243,80,160,109 +BRDA:243,80,161,19361 +BRDA:243,81,162,109 +BRDA:243,81,163,9088 +BRDA:243,82,164,521 +BRDA:243,82,165,2820 +BRDA:243,83,166,2908 +BRDA:243,83,167,13014 +BRDA:243,84,168,32 +BRDA:243,84,169,125221 +BRDA:243,85,170,50 +BRDA:243,85,171,13154 +BRDA:243,86,172,46 +BRDA:243,86,173,23723 +BRDA:243,87,174,52 +BRDA:243,87,175,276696 +BRDA:243,88,176,46 +BRDA:243,88,177,24798 +BRDA:243,89,178,38 +BRDA:243,89,179,1794182 +BRDA:243,90,180,46 +BRDA:243,90,181,185385 +BRDA:243,91,182,178 +BRDA:243,91,183,127727 +BRDA:243,92,184,46 +BRDA:243,92,185,22031 +BRDA:243,93,186,32 +BRDA:243,93,187,2400 +BRDA:243,94,188,1295362 +BRDA:243,94,189,0 +BRDA:243,95,190,382 +BRDA:243,95,191,15789083 +BRDA:243,96,192,50 +BRDA:243,96,193,240769 +BRDA:243,97,194,32 +BRDA:243,97,195,3296915 +BRDA:243,98,196,38 +BRDA:243,98,197,42653 +BRDA:243,99,198,38 +BRDA:243,99,199,4099 +BRDA:243,100,200,32 +BRDA:243,100,201,158918 +BRDA:243,101,202,32 +BRDA:243,101,203,3640 +BRDA:243,102,204,32 +BRDA:243,102,205,2126 +BRDA:243,103,206,72 +BRDA:243,103,207,120207 +BRDA:243,104,208,332 +BRDA:243,104,209,37192 +BRDA:243,105,210,38 +BRDA:243,105,211,2650 +BRDA:243,106,212,48 +BRDA:243,106,213,2907290 +BRDA:243,107,214,32 +BRDA:243,107,215,404373 +BRDA:243,108,216,32 +BRDA:243,108,217,6638 +BRDA:243,109,218,32 +BRDA:243,109,219,6278 +BRDA:243,110,220,38 +BRDA:243,110,221,818239 +BRDA:243,111,222,40 +BRDA:243,111,223,5270442 +BRDA:243,112,224,56 +BRDA:243,112,225,24059773 +BRDA:243,113,226,780 +BRDA:243,113,227,8639406 +BRDA:243,114,228,644 +BRDA:243,114,229,158267 +BRDA:243,115,230,59 +BRDA:243,115,231,943670 +BRDA:243,116,232,286757 +BRDA:243,116,233,4296566 +BRDA:243,117,234,550 +BRDA:243,117,235,5500716 +BRDA:243,118,236,2658 +BRDA:243,118,237,7064927 +BRDA:243,119,238,102 +BRDA:243,119,239,5684617 +BRDA:243,120,240,46 +BRDA:243,120,241,16727 +BRDA:243,121,242,56 +BRDA:243,121,243,16541106 +BRDA:243,122,244,46 +BRDA:243,122,245,13513 +BRDA:243,123,246,772 +BRDA:243,123,247,1886115 +BRDA:243,124,248,910 +BRDA:243,124,249,9077186 +BRDA:243,125,250,988 +BRDA:243,125,251,1041 +BRDA:243,126,252,736 +BRDA:243,126,253,1184520 +BRDA:243,127,254,3771 +BRDA:243,127,255,79706532 +BRDA:243,128,256,186 +BRDA:243,128,257,9932039 +BRDA:243,129,258,78 +BRDA:243,129,259,1319822 +BRDA:243,130,260,72 +BRDA:243,130,261,49644 +BRDA:243,131,262,142 +BRDA:243,131,263,4496622 +BRDA:243,132,264,152 +BRDA:243,132,265,11280 +BRDA:243,133,266,596 +BRDA:243,133,267,471147 +BRDA:243,134,268,176 +BRDA:243,134,269,13213 +BRDA:243,135,270,116 +BRDA:243,135,271,61042 +BRDA:243,136,272,796 +BRDA:243,136,273,9090 +BRDA:243,137,274,186 +BRDA:243,137,275,3416 +BRDA:243,138,276,32 +BRDA:243,138,277,69994 +BRDA:243,139,278,46 +BRDA:243,139,279,15029 +BRDA:243,140,280,46 +BRDA:243,140,281,151754 +BRDA:243,141,282,46 +BRDA:243,141,283,135058 +BRDA:243,142,284,46 +BRDA:243,142,285,13928 +BRDA:243,143,286,46 +BRDA:243,143,287,15351 +BRDA:243,144,288,352 +BRDA:243,144,289,472 +BRDA:243,145,290,352 +BRDA:243,145,291,1613 +BRDA:243,146,292,514 +BRDA:243,146,293,564 +BRDA:243,147,294,754 +BRDA:243,147,295,2876 +BRDA:243,148,296,770 +BRDA:243,148,297,12858 +BRDA:243,149,298,704 +BRDA:243,149,299,12247680 +BRDA:255,0,0,186 +BRDA:255,0,1,3416 +BRDA:255,1,2,70 +BRDA:255,1,3,1237772 +BRDA:255,2,4,72 +BRDA:255,2,5,30247 +BRDA:255,3,6,72 +BRDA:255,3,7,41069 +BRDA:255,4,8,72 +BRDA:255,4,9,42183 +BRDA:255,5,10,72 +BRDA:255,5,11,28823 +BRDA:255,6,12,76 +BRDA:255,6,13,34445 +BRDA:255,7,14,72 +BRDA:255,7,15,25057 +BRDA:255,8,16,72 +BRDA:255,8,17,92000 +BRDA:255,9,18,72 +BRDA:255,9,19,312526 +BRDA:255,10,20,64 +BRDA:255,10,21,5863080 +BRDA:255,11,22,72 +BRDA:255,11,23,31921 +BRDA:255,12,24,64 +BRDA:255,12,25,619859 +BRDA:255,13,26,70 +BRDA:255,13,27,282992 +BRDA:255,14,28,88 +BRDA:255,14,29,123464 +BRDA:255,15,30,64 +BRDA:255,15,31,63386 +BRDA:255,16,32,70 +BRDA:255,16,33,52431 +BRDA:255,17,34,70 +BRDA:255,17,35,443689 +BRDA:255,18,36,82 +BRDA:255,18,37,26642 +BRDA:255,19,38,74 +BRDA:255,19,39,52507 +BRDA:255,20,40,72 +BRDA:255,20,41,29145 +BRDA:255,21,42,72 +BRDA:255,21,43,49850 +BRDA:255,22,44,72 +BRDA:255,22,45,46725 +BRDA:255,23,46,76 +BRDA:255,23,47,47203 +BRDA:255,24,48,72 +BRDA:255,24,49,41985 +BRDA:255,25,50,72 +BRDA:255,25,51,30939 +BRDA:255,26,52,72 +BRDA:255,26,53,28933 +BRDA:255,27,54,72 +BRDA:255,27,55,40581 +BRDA:255,28,56,72 +BRDA:255,28,57,38896 +BRDA:255,29,58,72 +BRDA:255,29,59,34189 +BRDA:255,30,60,70 +BRDA:255,30,61,24608 +BRDA:255,31,62,72 +BRDA:255,31,63,48765 +BRDA:255,32,64,72 +BRDA:255,32,65,21361 +BRDA:255,33,66,72 +BRDA:255,33,67,66320 +BRDA:255,34,68,72 +BRDA:255,34,69,31729 +BRDA:255,35,70,94 +BRDA:255,35,71,2106247 +BRDA:255,36,72,72 +BRDA:255,36,73,45101 +BRDA:255,37,74,72 +BRDA:255,37,75,37463 +BRDA:255,38,76,72 +BRDA:255,38,77,38403 +BRDA:255,39,78,912 +BRDA:255,39,79,813771 +BRDA:255,40,80,64 +BRDA:255,40,81,3594 +BRDA:255,41,82,58 +BRDA:255,41,83,2439 +BRDA:255,42,84,58 +BRDA:255,42,85,2445 +BRDA:255,43,86,373 +BRDA:255,43,87,9398 +BRDA:255,44,88,254 +BRDA:255,44,89,8253 +BRDA:255,45,90,234 +BRDA:255,45,91,4744 +BRDA:255,46,92,220 +BRDA:255,46,93,6934 +BRDA:255,47,94,238 +BRDA:255,47,95,898 +BRDA:255,48,96,2570 +BRDA:255,48,97,22956 +BRDA:255,49,98,62 +BRDA:255,49,99,4269 +BRDA:255,50,100,778 +BRDA:255,50,101,76926 +BRDA:255,51,102,527587 +BRDA:255,51,103,0 +BRDA:255,52,104,531 +BRDA:255,52,105,72750 +BRDA:255,53,106,2255 +BRDA:255,53,107,13400 +BRDA:255,54,108,573 +BRDA:255,54,109,2996293 +BRDA:255,55,110,25474 +BRDA:255,55,111,0 +BRDA:255,56,112,2033 +BRDA:255,56,113,0 +BRDA:255,57,114,421209 +BRDA:255,57,115,0 +BRDA:255,58,116,64 +BRDA:255,58,117,84887 +BRDA:255,59,118,82 +BRDA:255,59,119,16580 +BRDA:255,60,120,64 +BRDA:255,60,121,30139 +BRDA:255,61,122,76 +BRDA:255,61,123,15034 +BRDA:255,62,124,82 +BRDA:255,62,125,25036 +BRDA:255,63,126,82 +BRDA:255,63,127,17277 +BRDA:255,64,128,58 +BRDA:255,64,129,717078 +BRDA:255,65,130,58 +BRDA:255,65,131,395191 +BRDA:255,66,132,64 +BRDA:255,66,133,268540 +BRDA:255,67,134,382 +BRDA:255,67,135,15789083 +BRDA:255,68,136,64 +BRDA:255,68,137,35822 +BRDA:255,69,138,64 +BRDA:255,69,139,8133 +BRDA:255,70,140,70 +BRDA:255,70,141,3895 +BRDA:255,71,142,64 +BRDA:255,71,143,7811 +BRDA:255,72,144,64 +BRDA:255,72,145,5941 +BRDA:255,73,146,64 +BRDA:255,73,147,2327 +BRDA:255,74,148,64 +BRDA:255,74,149,2757 +BRDA:255,75,150,64 +BRDA:255,75,151,6813 +BRDA:255,76,152,46 +BRDA:255,76,153,46947 +BRDA:255,77,154,32 +BRDA:255,77,155,51123 +BRDA:255,78,156,32 +BRDA:255,78,157,1742 +BRDA:255,79,158,38 +BRDA:255,79,159,67848 +BRDA:255,80,160,32 +BRDA:255,80,161,75520 +BRDA:255,81,162,111 +BRDA:255,81,163,3467709 +BRDA:255,82,164,109 +BRDA:255,82,165,19361 +BRDA:255,83,166,109 +BRDA:255,83,167,9088 +BRDA:255,84,168,521 +BRDA:255,84,169,2820 +BRDA:255,85,170,2908 +BRDA:255,85,171,13014 +BRDA:255,86,172,32 +BRDA:255,86,173,125221 +BRDA:255,87,174,50 +BRDA:255,87,175,13154 +BRDA:255,88,176,46 +BRDA:255,88,177,23723 +BRDA:255,89,178,52 +BRDA:255,89,179,276696 +BRDA:255,90,180,46 +BRDA:255,90,181,24798 +BRDA:255,91,182,38 +BRDA:255,91,183,1794182 +BRDA:255,92,184,46 +BRDA:255,92,185,185385 +BRDA:255,93,186,178 +BRDA:255,93,187,127727 +BRDA:255,94,188,46 +BRDA:255,94,189,22031 +BRDA:255,95,190,32 +BRDA:255,95,191,2400 +BRDA:255,96,192,1295362 +BRDA:255,96,193,0 +BRDA:255,97,194,50 +BRDA:255,97,195,240769 +BRDA:255,98,196,32 +BRDA:255,98,197,3296915 +BRDA:255,99,198,38 +BRDA:255,99,199,42653 +BRDA:255,100,200,38 +BRDA:255,100,201,4099 +BRDA:255,101,202,32 +BRDA:255,101,203,158918 +BRDA:255,102,204,32 +BRDA:255,102,205,3640 +BRDA:255,103,206,32 +BRDA:255,103,207,2126 +BRDA:255,104,208,72 +BRDA:255,104,209,120207 +BRDA:255,105,210,332 +BRDA:255,105,211,37192 +BRDA:255,106,212,38 +BRDA:255,106,213,2650 +BRDA:255,107,214,48 +BRDA:255,107,215,2907290 +BRDA:255,108,216,32 +BRDA:255,108,217,404373 +BRDA:255,109,218,32 +BRDA:255,109,219,6638 +BRDA:255,110,220,32 +BRDA:255,110,221,6278 +BRDA:255,111,222,38 +BRDA:255,111,223,818239 +BRDA:255,112,224,40 +BRDA:255,112,225,5270442 +BRDA:255,113,226,56 +BRDA:255,113,227,24059773 +BRDA:255,114,228,780 +BRDA:255,114,229,8639406 +BRDA:255,115,230,644 +BRDA:255,115,231,158267 +BRDA:255,116,232,59 +BRDA:255,116,233,943670 +BRDA:255,117,234,286757 +BRDA:255,117,235,4296566 +BRDA:255,118,236,550 +BRDA:255,118,237,5500716 +BRDA:255,119,238,2658 +BRDA:255,119,239,7064927 +BRDA:255,120,240,102 +BRDA:255,120,241,5684617 +BRDA:255,121,242,46 +BRDA:255,121,243,16727 +BRDA:255,122,244,56 +BRDA:255,122,245,16541106 +BRDA:255,123,246,46 +BRDA:255,123,247,13513 +BRDA:255,124,248,772 +BRDA:255,124,249,1886115 +BRDA:255,125,250,910 +BRDA:255,125,251,9077186 +BRDA:255,126,252,988 +BRDA:255,126,253,1041 +BRDA:255,127,254,736 +BRDA:255,127,255,1184520 +BRDA:255,128,256,3771 +BRDA:255,128,257,79706532 +BRDA:255,129,258,186 +BRDA:255,129,259,9932039 +BRDA:255,130,260,78 +BRDA:255,130,261,1319822 +BRDA:255,131,262,72 +BRDA:255,131,263,49644 +BRDA:255,132,264,142 +BRDA:255,132,265,4496622 +BRDA:255,133,266,152 +BRDA:255,133,267,11280 +BRDA:255,134,268,596 +BRDA:255,134,269,471147 +BRDA:255,135,270,176 +BRDA:255,135,271,13213 +BRDA:255,136,272,116 +BRDA:255,136,273,61042 +BRDA:255,137,274,796 +BRDA:255,137,275,9090 +BRDA:255,138,276,32 +BRDA:255,138,277,69994 +BRDA:255,139,278,46 +BRDA:255,139,279,15029 +BRDA:255,140,280,46 +BRDA:255,140,281,151754 +BRDA:255,141,282,46 +BRDA:255,141,283,135058 +BRDA:255,142,284,46 +BRDA:255,142,285,13928 +BRDA:255,143,286,46 +BRDA:255,143,287,15351 +BRDA:255,144,288,352 +BRDA:255,144,289,472 +BRDA:255,145,290,352 +BRDA:255,145,291,1613 +BRDA:255,146,292,514 +BRDA:255,146,293,564 +BRDA:255,147,294,754 +BRDA:255,147,295,2876 +BRDA:255,148,296,770 +BRDA:255,148,297,12858 +BRDA:255,149,298,704 +BRDA:255,149,299,12247680 +BRDA:280,0,0,0 +BRDA:280,0,1,2650828 +BRDA:288,0,0,2650828 +BRDA:288,0,1,0 +BRDA:295,0,0,1830329 +BRDA:295,0,1,820499 +BRDA:295,1,2,25295 +BRDA:295,1,3,795204 +BRDA:296,0,0,1830329 +BRDA:296,0,1,820499 +BRDA:300,0,0,454208 +BRDA:300,0,1,2196620 +BRDA:302,0,0,0 +BRDA:302,0,1,2650828 +BRF:929 +BRH:316 +LF:172 +LH:125 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone/baseline_instruction_table.cpp +FN:32,_ZN6evmone8baseline23get_baseline_cost_tableE13evmc_revision +FNDA:2650828,_ZN6evmone8baseline23get_baseline_cost_tableE13evmc_revision +FNF:1 +FNH:1 +DA:32,2650828 +DA:33,2650828 +DA:34,2650828 +BRF:0 +BRH:0 +LF:3 +LH:3 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone/delegation.cpp +FN:11,_ZN6evmone20get_delegate_addressERKN4evmc13HostInterfaceERKNS0_7addressE +FNDA:2353775,_ZN6evmone20get_delegate_addressERKN4evmc13HostInterfaceERKNS0_7addressE +FNF:1 +FNH:1 +DA:11,2353775 +DA:15,2353775 +DA:16,2353775 +DA:17,2353775 +DA:19,2353775 +DA:20,2350397 +DA:23,3378 +DA:26,3378 +DA:27,3378 +DA:28,2353775 +BRDA:19,0,0,2350397 +BRDA:19,0,1,3378 +BRF:2 +BRH:2 +LF:10 +LH:10 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone/delegation.hpp +FN:21,_ZN6evmone17is_code_delegatedESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:2954753,_ZN6evmone17is_code_delegatedESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNF:1 +FNH:1 +DA:21,2954753 +DA:22,2954753 +DA:23,2954753 +BRF:0 +BRH:0 +LF:3 +LH:3 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone/execution_state.hpp +FN:50,_ZN6evmone10StackSpace6bottomEv +FN:65,_ZNK6evmone6Memory11FreeDeleterclEPh +FN:77,_ZN6evmone6Memory20handle_out_of_memoryEv +FN:80,_ZN6evmone6Memory17allocate_capacityEv +FN:88,_ZN6evmone6MemoryC2Ev +FN:90,_ZN6evmone6MemoryixEm +FN:92,_ZNK6evmone6Memory4sizeEv +FN:98,_ZN6evmone6Memory4growEm +FN:122,_ZN6evmone6Memory5clearEv +FN:176,_ZN6evmone14ExecutionStateC2ERK12evmc_message13evmc_revisionRK19evmc_host_interfaceP17evmc_host_contextSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:183,_ZN6evmone14ExecutionState5resetERK12evmc_message13evmc_revisionRK19evmc_host_interfaceP17evmc_host_contextSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:197,_ZNK6evmone14ExecutionState14in_static_modeEv +FN:200,_ZN6evmone14ExecutionState14get_tx_contextEv +FN:171,_ZN6evmone14ExecutionStateC2Ev +FNDA:2650828,_ZN6evmone10StackSpace6bottomEv +FNDA:1826,_ZNK6evmone6Memory11FreeDeleterclEPh +FNDA:0,_ZN6evmone6Memory20handle_out_of_memoryEv +FNDA:6540,_ZN6evmone6Memory17allocate_capacityEv +FNDA:1826,_ZN6evmone6MemoryC2Ev +FNDA:24923406,_ZN6evmone6MemoryixEm +FNDA:27185234,_ZNK6evmone6Memory4sizeEv +FNDA:1735345,_ZN6evmone6Memory4growEm +FNDA:2650828,_ZN6evmone6Memory5clearEv +FNDA:0,_ZN6evmone14ExecutionStateC2ERK12evmc_message13evmc_revisionRK19evmc_host_interfaceP17evmc_host_contextSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:2650828,_ZN6evmone14ExecutionState5resetERK12evmc_message13evmc_revisionRK19evmc_host_interfaceP17evmc_host_contextSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:13783796,_ZNK6evmone14ExecutionState14in_static_modeEv +FNDA:455120,_ZN6evmone14ExecutionState14get_tx_contextEv +FNDA:1826,_ZN6evmone14ExecutionStateC2Ev +FNF:14 +FNH:12 +DA:50,2650828 +DA:65,1826 +DA:77,0 +DA:80,6540 +DA:81,6540 +DA:82,6540 +DA:83,0 +DA:84,6540 +DA:88,1826 +DA:90,24923406 +DA:92,27185234 +DA:98,1735345 +DA:100,1735345 +DA:103,1735345 +DA:105,1735345 +DA:106,4714 +DA:107,4714 +DA:109,4714 +DA:110,1668 +DA:112,1668 +DA:113,1668 +DA:115,4714 +DA:116,4714 +DA:117,1735345 +DA:118,1735345 +DA:119,1735345 +DA:122,2650828 +DA:171,1826 +DA:176,0 +DA:177,0 +DA:183,2650828 +DA:184,2650828 +DA:185,2650828 +DA:186,2650828 +DA:187,2650828 +DA:188,2650828 +DA:189,2650828 +DA:190,2650828 +DA:191,2650828 +DA:192,2650828 +DA:193,2650828 +DA:194,2650828 +DA:195,2650828 +DA:197,13783796 +DA:200,455120 +DA:201,455120 +DA:202,173806 +DA:203,455120 +DA:204,455120 +BRDA:82,0,0,0 +BRDA:82,0,1,6540 +BRDA:100,0,0,1735345 +BRDA:100,0,1,0 +BRDA:103,0,0,1735345 +BRDA:103,0,1,0 +BRDA:105,0,0,4714 +BRDA:105,0,1,1730631 +BRDA:109,0,0,1668 +BRDA:109,0,1,3046 +BRDA:201,0,0,173806 +BRDA:201,0,1,281314 +BRF:12 +BRH:9 +LF:49 +LH:45 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone/instructions.hpp +FN:24,_ZN6evmone8StackTopC2EPN4intx4uintILj256EEE +FN:28,_ZN6evmone8StackTop3endEv +FN:33,_ZN6evmone8StackTopixEi +FN:36,_ZN6evmone8StackTop3topEv +FN:40,_ZN6evmone8StackTop3popEv +FN:43,_ZN6evmone8StackTop4pushERKN4intx4uintILj256EEE +FN:66,_ZN6evmone9num_wordsEm +FN:72,_ZN6evmone9copy_costEm +FN:86,_ZN6evmone11grow_memoryElRNS_6MemoryEm +FN:105,_ZN6evmone12check_memoryERlRNS_6MemoryERKN4intx4uintILj256EEEm +FN:126,_ZN6evmone12check_memoryERlRNS_6MemoryERKN4intx4uintILj256EEES7_ +FN:150,_ZN6evmone5instr4core4noopENS_8StackTopE +FN:164,_ZN6evmone5instr4core3addENS_8StackTopE +FN:169,_ZN6evmone5instr4core3mulENS_8StackTopE +FN:174,_ZN6evmone5instr4core3subENS_8StackTopE +FN:179,_ZN6evmone5instr4core3divENS_8StackTopE +FN:185,_ZN6evmone5instr4core4sdivENS_8StackTopE +FN:191,_ZN6evmone5instr4core3modENS_8StackTopE +FN:197,_ZN6evmone5instr4core4smodENS_8StackTopE +FN:203,_ZN6evmone5instr4core6addmodENS_8StackTopE +FN:211,_ZN6evmone5instr4core6mulmodENS_8StackTopE +FN:219,_ZN6evmone5instr4core3expENS_8StackTopElRNS_14ExecutionStateE +FN:235,_ZN6evmone5instr4core10signextendENS_8StackTopE +FN:268,_ZN6evmone5instr4core2ltENS_8StackTopE +FN:274,_ZN6evmone5instr4core2gtENS_8StackTopE +FN:280,_ZN6evmone5instr4core3sltENS_8StackTopE +FN:286,_ZN6evmone5instr4core3sgtENS_8StackTopE +FN:292,_ZN6evmone5instr4core2eqENS_8StackTopE +FN:297,_ZN6evmone5instr4core6iszeroENS_8StackTopE +FN:302,_ZN6evmone5instr4core4and_ENS_8StackTopE +FN:307,_ZN6evmone5instr4core3or_ENS_8StackTopE +FN:312,_ZN6evmone5instr4core4xor_ENS_8StackTopE +FN:317,_ZN6evmone5instr4core4not_ENS_8StackTopE +FN:322,_ZN6evmone5instr4core4byteENS_8StackTopE +FN:337,_ZN6evmone5instr4core3shlENS_8StackTopE +FN:342,_ZN6evmone5instr4core3shrENS_8StackTopE +FN:347,_ZN6evmone5instr4core3sarENS_8StackTopE +FN:359,_ZN6evmone5instr4core3clzENS_8StackTopE +FN:364,_ZN6evmone5instr4core9keccak256ENS_8StackTopElRNS_14ExecutionStateE +FN:385,_ZN6evmone5instr4core7addressENS_8StackTopERNS_14ExecutionStateE +FN:390,_ZN6evmone5instr4core7balanceENS_8StackTopElRNS_14ExecutionStateE +FN:405,_ZN6evmone5instr4core6originENS_8StackTopERNS_14ExecutionStateE +FN:410,_ZN6evmone5instr4core6callerENS_8StackTopERNS_14ExecutionStateE +FN:415,_ZN6evmone5instr4core9callvalueENS_8StackTopERNS_14ExecutionStateE +FN:420,_ZN6evmone5instr4core12calldataloadENS_8StackTopERNS_14ExecutionStateE +FN:439,_ZN6evmone5instr4core12calldatasizeENS_8StackTopERNS_14ExecutionStateE +FN:444,_ZN6evmone5instr4core12calldatacopyENS_8StackTopElRNS_14ExecutionStateE +FN:471,_ZN6evmone5instr4core8codesizeENS_8StackTopERNS_14ExecutionStateE +FN:476,_ZN6evmone5instr4core8codecopyENS_8StackTopElRNS_14ExecutionStateE +FN:507,_ZN6evmone5instr4core8gaspriceENS_8StackTopERNS_14ExecutionStateE +FN:512,_ZN6evmone5instr4core7basefeeENS_8StackTopERNS_14ExecutionStateE +FN:517,_ZN6evmone5instr4core8blobhashENS_8StackTopERNS_14ExecutionStateE +FN:527,_ZN6evmone5instr4core11blobbasefeeENS_8StackTopERNS_14ExecutionStateE +FN:532,_ZN6evmone5instr4core11extcodesizeENS_8StackTopElRNS_14ExecutionStateE +FN:547,_ZN6evmone5instr4core11extcodecopyENS_8StackTopElRNS_14ExecutionStateE +FN:580,_ZN6evmone5instr4core14returndatasizeENS_8StackTopERNS_14ExecutionStateE +FN:585,_ZN6evmone5instr4core14returndatacopyENS_8StackTopElRNS_14ExecutionStateE +FN:613,_ZN6evmone5instr4core11extcodehashENS_8StackTopElRNS_14ExecutionStateE +FN:629,_ZN6evmone5instr4core9blockhashENS_8StackTopERNS_14ExecutionStateE +FN:641,_ZN6evmone5instr4core8coinbaseENS_8StackTopERNS_14ExecutionStateE +FN:646,_ZN6evmone5instr4core9timestampENS_8StackTopERNS_14ExecutionStateE +FN:652,_ZN6evmone5instr4core6numberENS_8StackTopERNS_14ExecutionStateE +FN:658,_ZN6evmone5instr4core10prevrandaoENS_8StackTopERNS_14ExecutionStateE +FN:663,_ZN6evmone5instr4core8gaslimitENS_8StackTopERNS_14ExecutionStateE +FN:668,_ZN6evmone5instr4core7chainidENS_8StackTopERNS_14ExecutionStateE +FN:673,_ZN6evmone5instr4core11selfbalanceENS_8StackTopERNS_14ExecutionStateE +FN:679,_ZN6evmone5instr4core5mloadENS_8StackTopElRNS_14ExecutionStateE +FN:690,_ZN6evmone5instr4core6mstoreENS_8StackTopElRNS_14ExecutionStateE +FN:702,_ZN6evmone5instr4core7mstore8ENS_8StackTopElRNS_14ExecutionStateE +FN:719,_ZN6evmone5instr4core9jump_implERNS_14ExecutionStateERKN4intx4uintILj256EEE +FN:732,_ZN6evmone5instr4core4jumpENS_8StackTopERNS_14ExecutionStateEPKh +FN:738,_ZN6evmone5instr4core5jumpiENS_8StackTopERNS_14ExecutionStateEPKh +FN:745,_ZN6evmone5instr4core2pcENS_8StackTopERNS_14ExecutionStateEPKh +FN:751,_ZN6evmone5instr4core5msizeENS_8StackTopERNS_14ExecutionStateE +FN:756,_ZN6evmone5instr4core3gasENS_8StackTopElRNS_14ExecutionStateE +FN:762,_ZN6evmone5instr4core5tloadENS_8StackTopERNS_14ExecutionStateE +FN:770,_ZN6evmone5instr4core6tstoreENS_8StackTopElRNS_14ExecutionStateE +FN:781,_ZN6evmone5instr4core5push0ENS_8StackTopE +FN:797,_ZN6evmone5instr4core22load_partial_push_dataILm1EEEmPKh +FN:803,_ZN6evmone5instr4core22load_partial_push_dataILm2EEEmPKh +FN:809,_ZN6evmone5instr4core22load_partial_push_dataILm3EEEmPKh +FN:816,_ZN6evmone5instr4core22load_partial_push_dataILm4EEEmPKh +FN:889,_ZN6evmone5instr4core5mcopyENS_8StackTopElRNS_14ExecutionStateE +FN:974,_ZN6evmone5instr4core12selfdestructENS_8StackTopElRNS_14ExecutionStateE +FN:157,_ZN6evmone5instr4core9stop_implIL16evmc_status_code0EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FN:157,_ZN6evmone5instr4core9stop_implIL16evmc_status_code4EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FN:958,_ZN6evmone5instr4core11return_implIL16evmc_status_code0EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FN:958,_ZN6evmone5instr4core11return_implIL16evmc_status_code2EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FN:826,_ZN6evmone5instr4core4pushILm1EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm2EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm3EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm4EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm5EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:788,_ZN6evmone5instr4core22load_partial_push_dataILm5EEEmPKh +FN:826,_ZN6evmone5instr4core4pushILm6EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:788,_ZN6evmone5instr4core22load_partial_push_dataILm6EEEmPKh +FN:826,_ZN6evmone5instr4core4pushILm7EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:788,_ZN6evmone5instr4core22load_partial_push_dataILm7EEEmPKh +FN:826,_ZN6evmone5instr4core4pushILm8EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm9EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm10EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm11EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm12EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm13EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm14EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm15EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm16EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm17EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm18EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm19EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm20EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm21EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm22EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm23EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm24EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm25EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm26EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm27EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm28EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm29EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm30EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm31EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:826,_ZN6evmone5instr4core4pushILm32EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FN:859,_ZN6evmone5instr4core3dupILi1EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi2EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi3EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi4EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi5EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi6EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi7EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi8EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi9EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi10EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi11EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi12EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi13EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi14EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi15EEEvNS_8StackTopE +FN:859,_ZN6evmone5instr4core3dupILi16EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi1EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi2EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi3EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi4EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi5EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi6EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi7EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi8EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi9EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi10EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi11EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi12EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi13EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi14EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi15EEEvNS_8StackTopE +FN:868,_ZN6evmone5instr4core4swapILi16EEEvNS_8StackTopE +FN:912,_ZN6evmone5instr4core3logILm0EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:912,_ZN6evmone5instr4core3logILm1EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:912,_ZN6evmone5instr4core3logILm2EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:912,_ZN6evmone5instr4core3logILm3EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:912,_ZN6evmone5instr4core3logILm4EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:249324527,_ZN6evmone8StackTopC2EPN4intx4uintILj256EEE +FNDA:0,_ZN6evmone8StackTop3endEv +FNDA:30979860,_ZN6evmone8StackTopixEi +FNDA:148048750,_ZN6evmone8StackTop3topEv +FNDA:112609959,_ZN6evmone8StackTop3popEv +FNDA:131871262,_ZN6evmone8StackTop4pushERKN4intx4uintILj256EEE +FNDA:1951716,_ZN6evmone9num_wordsEm +FNDA:162465,_ZN6evmone9copy_costEm +FNDA:1739221,_ZN6evmone11grow_memoryElRNS_6MemoryEm +FNDA:25430390,_ZN6evmone12check_memoryERlRNS_6MemoryERKN4intx4uintILj256EEEm +FNDA:8721624,_ZN6evmone12check_memoryERlRNS_6MemoryERKN4intx4uintILj256EEES7_ +FNDA:28556395,_ZN6evmone5instr4core4noopENS_8StackTopE +FNDA:15789083,_ZN6evmone5instr4core3addENS_8StackTopE +FNDA:240769,_ZN6evmone5instr4core3mulENS_8StackTopE +FNDA:3296915,_ZN6evmone5instr4core3subENS_8StackTopE +FNDA:42653,_ZN6evmone5instr4core3divENS_8StackTopE +FNDA:4099,_ZN6evmone5instr4core4sdivENS_8StackTopE +FNDA:158918,_ZN6evmone5instr4core3modENS_8StackTopE +FNDA:3640,_ZN6evmone5instr4core4smodENS_8StackTopE +FNDA:2126,_ZN6evmone5instr4core6addmodENS_8StackTopE +FNDA:2400,_ZN6evmone5instr4core6mulmodENS_8StackTopE +FNDA:37444,_ZN6evmone5instr4core3expENS_8StackTopElRNS_14ExecutionStateE +FNDA:2650,_ZN6evmone5instr4core10signextendENS_8StackTopE +FNDA:2907290,_ZN6evmone5instr4core2ltENS_8StackTopE +FNDA:404373,_ZN6evmone5instr4core2gtENS_8StackTopE +FNDA:6638,_ZN6evmone5instr4core3sltENS_8StackTopE +FNDA:6278,_ZN6evmone5instr4core3sgtENS_8StackTopE +FNDA:818239,_ZN6evmone5instr4core2eqENS_8StackTopE +FNDA:5270442,_ZN6evmone5instr4core6iszeroENS_8StackTopE +FNDA:125221,_ZN6evmone5instr4core4and_ENS_8StackTopE +FNDA:51123,_ZN6evmone5instr4core3or_ENS_8StackTopE +FNDA:1742,_ZN6evmone5instr4core4xor_ENS_8StackTopE +FNDA:67848,_ZN6evmone5instr4core4not_ENS_8StackTopE +FNDA:75520,_ZN6evmone5instr4core4byteENS_8StackTopE +FNDA:3467709,_ZN6evmone5instr4core3shlENS_8StackTopE +FNDA:19361,_ZN6evmone5instr4core3shrENS_8StackTopE +FNDA:9088,_ZN6evmone5instr4core3sarENS_8StackTopE +FNDA:2820,_ZN6evmone5instr4core3clzENS_8StackTopE +FNDA:15878,_ZN6evmone5instr4core9keccak256ENS_8StackTopElRNS_14ExecutionStateE +FNDA:46947,_ZN6evmone5instr4core7addressENS_8StackTopERNS_14ExecutionStateE +FNDA:13166,_ZN6evmone5instr4core7balanceENS_8StackTopElRNS_14ExecutionStateE +FNDA:23723,_ZN6evmone5instr4core6originENS_8StackTopERNS_14ExecutionStateE +FNDA:276696,_ZN6evmone5instr4core6callerENS_8StackTopERNS_14ExecutionStateE +FNDA:24798,_ZN6evmone5instr4core9callvalueENS_8StackTopERNS_14ExecutionStateE +FNDA:1794182,_ZN6evmone5instr4core12calldataloadENS_8StackTopERNS_14ExecutionStateE +FNDA:185385,_ZN6evmone5instr4core12calldatasizeENS_8StackTopERNS_14ExecutionStateE +FNDA:127841,_ZN6evmone5instr4core12calldatacopyENS_8StackTopElRNS_14ExecutionStateE +FNDA:22031,_ZN6evmone5instr4core8codesizeENS_8StackTopERNS_14ExecutionStateE +FNDA:11394,_ZN6evmone5instr4core8codecopyENS_8StackTopElRNS_14ExecutionStateE +FNDA:13513,_ZN6evmone5instr4core8gaspriceENS_8StackTopERNS_14ExecutionStateE +FNDA:564,_ZN6evmone5instr4core7basefeeENS_8StackTopERNS_14ExecutionStateE +FNDA:2876,_ZN6evmone5instr4core8blobhashENS_8StackTopERNS_14ExecutionStateE +FNDA:12858,_ZN6evmone5instr4core11blobbasefeeENS_8StackTopERNS_14ExecutionStateE +FNDA:471303,_ZN6evmone5instr4core11extcodesizeENS_8StackTopElRNS_14ExecutionStateE +FNDA:13333,_ZN6evmone5instr4core11extcodecopyENS_8StackTopElRNS_14ExecutionStateE +FNDA:61042,_ZN6evmone5instr4core14returndatasizeENS_8StackTopERNS_14ExecutionStateE +FNDA:9786,_ZN6evmone5instr4core14returndatacopyENS_8StackTopElRNS_14ExecutionStateE +FNDA:3422,_ZN6evmone5instr4core11extcodehashENS_8StackTopElRNS_14ExecutionStateE +FNDA:69994,_ZN6evmone5instr4core9blockhashENS_8StackTopERNS_14ExecutionStateE +FNDA:15029,_ZN6evmone5instr4core8coinbaseENS_8StackTopERNS_14ExecutionStateE +FNDA:151754,_ZN6evmone5instr4core9timestampENS_8StackTopERNS_14ExecutionStateE +FNDA:135058,_ZN6evmone5instr4core6numberENS_8StackTopERNS_14ExecutionStateE +FNDA:13928,_ZN6evmone5instr4core10prevrandaoENS_8StackTopERNS_14ExecutionStateE +FNDA:15351,_ZN6evmone5instr4core8gaslimitENS_8StackTopERNS_14ExecutionStateE +FNDA:472,_ZN6evmone5instr4core7chainidENS_8StackTopERNS_14ExecutionStateE +FNDA:1613,_ZN6evmone5instr4core11selfbalanceENS_8StackTopERNS_14ExecutionStateE +FNDA:12248346,_ZN6evmone5instr4core5mloadENS_8StackTopElRNS_14ExecutionStateE +FNDA:8640104,_ZN6evmone5instr4core6mstoreENS_8StackTopElRNS_14ExecutionStateE +FNDA:158879,_ZN6evmone5instr4core7mstore8ENS_8StackTopElRNS_14ExecutionStateE +FNDA:7133799,_ZN6evmone5instr4core9jump_implERNS_14ExecutionStateERKN4intx4uintILj256EEE +FNDA:5501188,_ZN6evmone5instr4core4jumpENS_8StackTopERNS_14ExecutionStateEPKh +FNDA:7067565,_ZN6evmone5instr4core5jumpiENS_8StackTopERNS_14ExecutionStateEPKh +FNDA:5684617,_ZN6evmone5instr4core2pcENS_8StackTopERNS_14ExecutionStateEPKh +FNDA:16727,_ZN6evmone5instr4core5msizeENS_8StackTopERNS_14ExecutionStateE +FNDA:16541106,_ZN6evmone5instr4core3gasENS_8StackTopElRNS_14ExecutionStateE +FNDA:1886115,_ZN6evmone5instr4core5tloadENS_8StackTopERNS_14ExecutionStateE +FNDA:9077270,_ZN6evmone5instr4core6tstoreENS_8StackTopElRNS_14ExecutionStateE +FNDA:1184520,_ZN6evmone5instr4core5push0ENS_8StackTopE +FNDA:79800125,_ZN6evmone5instr4core22load_partial_push_dataILm1EEEmPKh +FNDA:10070367,_ZN6evmone5instr4core22load_partial_push_dataILm2EEEmPKh +FNDA:1422667,_ZN6evmone5instr4core22load_partial_push_dataILm3EEEmPKh +FNDA:2295858,_ZN6evmone5instr4core22load_partial_push_dataILm4EEEmPKh +FNDA:1221,_ZN6evmone5instr4core5mcopyENS_8StackTopElRNS_14ExecutionStateE +FNDA:7999,_ZN6evmone5instr4core12selfdestructENS_8StackTopElRNS_14ExecutionStateE +FNDA:1295362,_ZN6evmone5instr4core9stop_implIL16evmc_status_code0EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:2033,_ZN6evmone5instr4core9stop_implIL16evmc_status_code4EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:527569,_ZN6evmone5instr4core11return_implIL16evmc_status_code0EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:25379,_ZN6evmone5instr4core11return_implIL16evmc_status_code2EEENS_10TermResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:79706532,_ZN6evmone5instr4core4pushILm1EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:9932039,_ZN6evmone5instr4core4pushILm2EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:1319822,_ZN6evmone5instr4core4pushILm3EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:120207,_ZN6evmone5instr4core4pushILm4EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:49644,_ZN6evmone5instr4core4pushILm5EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:168086,_ZN6evmone5instr4core22load_partial_push_dataILm5EEEmPKh +FNDA:49850,_ZN6evmone5instr4core4pushILm6EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:146559,_ZN6evmone5instr4core22load_partial_push_dataILm6EEEmPKh +FNDA:46725,_ZN6evmone5instr4core4pushILm7EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:206273,_ZN6evmone5instr4core22load_partial_push_dataILm7EEEmPKh +FNDA:47203,_ZN6evmone5instr4core4pushILm8EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:41985,_ZN6evmone5instr4core4pushILm9EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:30939,_ZN6evmone5instr4core4pushILm10EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:28933,_ZN6evmone5instr4core4pushILm11EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:40581,_ZN6evmone5instr4core4pushILm12EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:38896,_ZN6evmone5instr4core4pushILm13EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:34189,_ZN6evmone5instr4core4pushILm14EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:29145,_ZN6evmone5instr4core4pushILm15EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:48765,_ZN6evmone5instr4core4pushILm16EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:21361,_ZN6evmone5instr4core4pushILm17EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:66320,_ZN6evmone5instr4core4pushILm18EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:31729,_ZN6evmone5instr4core4pushILm19EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:2106247,_ZN6evmone5instr4core4pushILm20EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:45101,_ZN6evmone5instr4core4pushILm21EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:37463,_ZN6evmone5instr4core4pushILm22EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:38403,_ZN6evmone5instr4core4pushILm23EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:31921,_ZN6evmone5instr4core4pushILm24EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:30247,_ZN6evmone5instr4core4pushILm25EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:41069,_ZN6evmone5instr4core4pushILm26EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:42183,_ZN6evmone5instr4core4pushILm27EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:28823,_ZN6evmone5instr4core4pushILm28EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:34445,_ZN6evmone5instr4core4pushILm29EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:25057,_ZN6evmone5instr4core4pushILm30EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:92000,_ZN6evmone5instr4core4pushILm31EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:312526,_ZN6evmone5instr4core4pushILm32EEEPKhNS_8StackTopERNS_14ExecutionStateES4_ +FNDA:5863080,_ZN6evmone5instr4core3dupILi1EEEvNS_8StackTopE +FNDA:1237772,_ZN6evmone5instr4core3dupILi2EEEvNS_8StackTopE +FNDA:619859,_ZN6evmone5instr4core3dupILi3EEEvNS_8StackTopE +FNDA:282992,_ZN6evmone5instr4core3dupILi4EEEvNS_8StackTopE +FNDA:123464,_ZN6evmone5instr4core3dupILi5EEEvNS_8StackTopE +FNDA:63386,_ZN6evmone5instr4core3dupILi6EEEvNS_8StackTopE +FNDA:52431,_ZN6evmone5instr4core3dupILi7EEEvNS_8StackTopE +FNDA:443689,_ZN6evmone5instr4core3dupILi8EEEvNS_8StackTopE +FNDA:26642,_ZN6evmone5instr4core3dupILi9EEEvNS_8StackTopE +FNDA:52507,_ZN6evmone5instr4core3dupILi10EEEvNS_8StackTopE +FNDA:24608,_ZN6evmone5instr4core3dupILi11EEEvNS_8StackTopE +FNDA:16580,_ZN6evmone5instr4core3dupILi12EEEvNS_8StackTopE +FNDA:30139,_ZN6evmone5instr4core3dupILi13EEEvNS_8StackTopE +FNDA:15034,_ZN6evmone5instr4core3dupILi14EEEvNS_8StackTopE +FNDA:25036,_ZN6evmone5instr4core3dupILi15EEEvNS_8StackTopE +FNDA:17277,_ZN6evmone5instr4core3dupILi16EEEvNS_8StackTopE +FNDA:717078,_ZN6evmone5instr4core4swapILi1EEEvNS_8StackTopE +FNDA:395191,_ZN6evmone5instr4core4swapILi2EEEvNS_8StackTopE +FNDA:268540,_ZN6evmone5instr4core4swapILi3EEEvNS_8StackTopE +FNDA:84887,_ZN6evmone5instr4core4swapILi4EEEvNS_8StackTopE +FNDA:35822,_ZN6evmone5instr4core4swapILi5EEEvNS_8StackTopE +FNDA:8133,_ZN6evmone5instr4core4swapILi6EEEvNS_8StackTopE +FNDA:3895,_ZN6evmone5instr4core4swapILi7EEEvNS_8StackTopE +FNDA:7811,_ZN6evmone5instr4core4swapILi8EEEvNS_8StackTopE +FNDA:5941,_ZN6evmone5instr4core4swapILi9EEEvNS_8StackTopE +FNDA:2327,_ZN6evmone5instr4core4swapILi10EEEvNS_8StackTopE +FNDA:2757,_ZN6evmone5instr4core4swapILi11EEEvNS_8StackTopE +FNDA:6813,_ZN6evmone5instr4core4swapILi12EEEvNS_8StackTopE +FNDA:4269,_ZN6evmone5instr4core4swapILi13EEEvNS_8StackTopE +FNDA:3594,_ZN6evmone5instr4core4swapILi14EEEvNS_8StackTopE +FNDA:2439,_ZN6evmone5instr4core4swapILi15EEEvNS_8StackTopE +FNDA:2445,_ZN6evmone5instr4core4swapILi16EEEvNS_8StackTopE +FNDA:9721,_ZN6evmone5instr4core3logILm0EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:8461,_ZN6evmone5instr4core3logILm1EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:4920,_ZN6evmone5instr4core3logILm2EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:7108,_ZN6evmone5instr4core3logILm3EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:1072,_ZN6evmone5instr4core3logILm4EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNF:91 +FNH:90 +DA:24,249324527 +DA:25,249324527 +DA:28,0 +DA:33,30979860 +DA:36,148048750 +DA:40,112609959 +DA:43,131871262 +DA:66,1951716 +DA:67,1951716 +DA:68,1951716 +DA:72,162465 +DA:73,162465 +DA:74,162465 +DA:75,162465 +DA:86,1739221 +DA:90,1739221 +DA:91,1739221 +DA:92,1739221 +DA:93,1739221 +DA:94,1739221 +DA:96,1739221 +DA:97,1739221 +DA:98,1735345 +DA:99,1739221 +DA:100,1739221 +DA:105,25430390 +DA:109,25430390 +DA:110,1104 +DA:112,25429286 +DA:113,25429286 +DA:114,1739221 +DA:115,1739221 +DA:116,1739221 +DA:117,3876 +DA:118,1739221 +DA:120,25425410 +DA:121,25429286 +DA:126,8721624 +DA:127,8721624 +DA:128,4336819 +DA:133,4384805 +DA:134,1744 +DA:136,4383061 +DA:137,4384805 +DA:150,28556395 +DA:157,1297395 +DA:158,1297395 +DA:159,1297395 +DA:164,15789083 +DA:165,15789083 +DA:166,15789083 +DA:169,240769 +DA:170,240769 +DA:171,240769 +DA:174,3296915 +DA:175,3296915 +DA:176,3296915 +DA:179,42653 +DA:180,42653 +DA:181,42653 +DA:182,42653 +DA:185,4099 +DA:186,4099 +DA:187,4099 +DA:188,4099 +DA:191,158918 +DA:192,158918 +DA:193,158918 +DA:194,158918 +DA:197,3640 +DA:198,3640 +DA:199,3640 +DA:200,3640 +DA:203,2126 +DA:204,2126 +DA:205,2126 +DA:206,2126 +DA:207,2126 +DA:208,2126 +DA:211,2400 +DA:212,2400 +DA:213,2400 +DA:214,2400 +DA:215,2400 +DA:216,2400 +DA:219,37444 +DA:220,37444 +DA:221,37444 +DA:223,37444 +DA:224,37444 +DA:225,37444 +DA:226,37444 +DA:227,37444 +DA:228,252 +DA:230,37192 +DA:231,37192 +DA:232,37444 +DA:235,2650 +DA:236,2650 +DA:237,2650 +DA:239,2650 +DA:240,1186 +DA:241,1186 +DA:242,1186 +DA:243,1186 +DA:244,1186 +DA:245,1186 +DA:247,1186 +DA:248,1186 +DA:251,1186 +DA:252,1186 +DA:254,1186 +DA:255,1186 +DA:256,1186 +DA:260,1186 +DA:262,4720 +DA:263,3534 +DA:264,1186 +DA:265,2650 +DA:268,2907290 +DA:269,2907290 +DA:270,2907290 +DA:271,2907290 +DA:274,404373 +DA:275,404373 +DA:276,404373 +DA:277,404373 +DA:280,6638 +DA:281,6638 +DA:282,6638 +DA:283,6638 +DA:286,6278 +DA:287,6278 +DA:288,6278 +DA:289,6278 +DA:292,818239 +DA:293,818239 +DA:294,818239 +DA:297,5270442 +DA:298,5270442 +DA:299,5270442 +DA:302,125221 +DA:303,125221 +DA:304,125221 +DA:307,51123 +DA:308,51123 +DA:309,51123 +DA:312,1742 +DA:313,1742 +DA:314,1742 +DA:317,67848 +DA:318,67848 +DA:319,67848 +DA:322,75520 +DA:323,75520 +DA:324,75520 +DA:326,75520 +DA:327,75520 +DA:329,75520 +DA:330,75520 +DA:331,75520 +DA:332,75520 +DA:333,75520 +DA:334,75520 +DA:337,3467709 +DA:338,3467709 +DA:339,3467709 +DA:342,19361 +DA:343,19361 +DA:344,19361 +DA:347,9088 +DA:348,9088 +DA:349,9088 +DA:351,9088 +DA:352,9088 +DA:354,9088 +DA:355,9088 +DA:356,9088 +DA:359,2820 +DA:360,2820 +DA:361,2820 +DA:364,15878 +DA:365,15878 +DA:366,15878 +DA:368,15878 +DA:369,2264 +DA:371,13614 +DA:372,13614 +DA:373,13614 +DA:374,13614 +DA:375,13614 +DA:376,600 +DA:378,13014 +DA:379,13014 +DA:380,13014 +DA:381,13614 +DA:385,46947 +DA:386,46947 +DA:387,46947 +DA:390,13166 +DA:391,13166 +DA:392,13166 +DA:394,13166 +DA:395,6802 +DA:396,6802 +DA:397,12 +DA:398,6802 +DA:400,13154 +DA:401,13154 +DA:402,13166 +DA:405,23723 +DA:406,23723 +DA:407,23723 +DA:410,276696 +DA:411,276696 +DA:412,276696 +DA:415,24798 +DA:416,24798 +DA:417,24798 +DA:420,1794182 +DA:421,1794182 +DA:423,1794182 +DA:424,8086 +DA:425,1786096 +DA:426,1786096 +DA:427,1786096 +DA:428,1786096 +DA:430,1786096 +DA:431,49465698 +DA:432,47679602 +DA:434,1786096 +DA:435,1786096 +DA:436,1794182 +DA:439,185385 +DA:440,185385 +DA:441,185385 +DA:444,127841 +DA:445,127841 +DA:446,127841 +DA:447,127841 +DA:449,127841 +DA:450,108 +DA:452,127733 +DA:453,127733 +DA:454,127733 +DA:455,127733 +DA:456,127733 +DA:458,127733 +DA:459,6 +DA:461,127727 +DA:462,119727 +DA:464,127727 +DA:465,7309 +DA:467,127727 +DA:468,127733 +DA:471,22031 +DA:472,22031 +DA:473,22031 +DA:476,11394 +DA:479,11394 +DA:480,11394 +DA:481,11394 +DA:483,11394 +DA:484,108 +DA:486,11286 +DA:487,11286 +DA:488,11286 +DA:489,11286 +DA:490,11286 +DA:492,11286 +DA:493,6 +DA:496,11280 +DA:497,10914 +DA:499,11280 +DA:500,905 +DA:502,11280 +DA:503,11286 +DA:507,13513 +DA:508,13513 +DA:509,13513 +DA:512,564 +DA:513,564 +DA:514,564 +DA:517,2876 +DA:518,2876 +DA:519,2876 +DA:521,2876 +DA:522,2079 +DA:523,2876 +DA:524,2876 +DA:527,12858 +DA:528,12858 +DA:529,12858 +DA:532,471303 +DA:533,471303 +DA:534,471303 +DA:536,471303 +DA:537,4779 +DA:538,4779 +DA:539,156 +DA:540,4779 +DA:542,471147 +DA:543,471147 +DA:544,471303 +DA:547,13333 +DA:548,13333 +DA:549,13333 +DA:550,13333 +DA:551,13333 +DA:553,13333 +DA:554,96 +DA:556,13237 +DA:557,13237 +DA:558,18 +DA:560,13219 +DA:561,1052 +DA:562,1052 +DA:563,6 +DA:564,1052 +DA:566,13213 +DA:567,12983 +DA:568,12983 +DA:569,12983 +DA:570,12983 +DA:571,12983 +DA:572,12983 +DA:573,1480 +DA:574,12983 +DA:576,13213 +DA:577,13219 +DA:580,61042 +DA:581,61042 +DA:582,61042 +DA:585,9786 +DA:586,9786 +DA:587,9786 +DA:588,9786 +DA:590,9786 +DA:591,204 +DA:593,9582 +DA:594,9582 +DA:596,9582 +DA:597,252 +DA:598,9330 +DA:600,9330 +DA:601,234 +DA:603,9096 +DA:604,6 +DA:606,9090 +DA:607,7315 +DA:609,9090 +DA:610,9096 +DA:613,3422 +DA:614,3422 +DA:615,3422 +DA:617,3422 +DA:618,815 +DA:619,815 +DA:620,6 +DA:621,815 +DA:623,3416 +DA:624,3416 +DA:625,3422 +DA:629,69994 +DA:630,69994 +DA:632,69994 +DA:633,69994 +DA:634,69994 +DA:635,69994 +DA:636,69994 +DA:637,69994 +DA:638,69994 +DA:641,15029 +DA:642,15029 +DA:643,15029 +DA:646,151754 +DA:648,151754 +DA:649,151754 +DA:652,135058 +DA:654,135058 +DA:655,135058 +DA:658,13928 +DA:659,13928 +DA:660,13928 +DA:663,15351 +DA:664,15351 +DA:665,15351 +DA:668,472 +DA:669,472 +DA:670,472 +DA:673,1613 +DA:675,1613 +DA:676,1613 +DA:679,12248346 +DA:680,12248346 +DA:682,12248346 +DA:683,666 +DA:685,12247680 +DA:686,12247680 +DA:687,12248346 +DA:690,8640104 +DA:691,8640104 +DA:692,8640104 +DA:694,8640104 +DA:695,698 +DA:697,8639406 +DA:698,8639406 +DA:699,8640104 +DA:702,158879 +DA:703,158879 +DA:704,158879 +DA:706,158879 +DA:707,612 +DA:709,158267 +DA:710,158267 +DA:711,158879 +DA:719,7133799 +DA:720,7133799 +DA:721,7133799 +DA:722,3110 +DA:723,3110 +DA:724,3110 +DA:725,3110 +DA:727,7130689 +DA:728,7133799 +DA:732,5501188 +DA:733,5501188 +DA:734,5501188 +DA:738,7067565 +DA:739,7067565 +DA:740,7067565 +DA:741,7067565 +DA:742,7067565 +DA:745,5684617 +DA:746,5684617 +DA:747,5684617 +DA:748,5684617 +DA:751,16727 +DA:752,16727 +DA:753,16727 +DA:756,16541106 +DA:757,16541106 +DA:758,16541106 +DA:759,16541106 +DA:762,1886115 +DA:763,1886115 +DA:764,1886115 +DA:765,1886115 +DA:766,1886115 +DA:767,1886115 +DA:770,9077270 +DA:771,9077270 +DA:772,84 +DA:774,9077186 +DA:775,9077186 +DA:776,9077186 +DA:777,9077186 +DA:778,9077270 +DA:781,1184520 +DA:782,1184520 +DA:783,1184520 +DA:788,520918 +DA:789,520918 +DA:792,520918 +DA:793,520918 +DA:797,79800125 +DA:798,79800125 +DA:799,79800125 +DA:803,10070367 +DA:804,10070367 +DA:805,10070367 +DA:809,1422667 +DA:811,1422667 +DA:812,1422667 +DA:816,2295858 +DA:817,2295858 +DA:818,2295858 +DA:826,94550350 +DA:827,94550350 +DA:828,94550350 +DA:829,94550350 +DA:831,94550350 +DA:832,94550350 +DA:833,94550350 +DA:837,94109935 +DA:838,94109935 +DA:839,94109935 +DA:840,94109935 +DA:844,3325531 +DA:845,10635519 +DA:846,7309988 +DA:847,7309988 +DA:848,7309988 +DA:849,7309988 +DA:850,3325531 +DA:852,94550350 +DA:853,94550350 +DA:859,8894496 +DA:860,8894496 +DA:861,8894496 +DA:862,8894496 +DA:868,1551942 +DA:869,1551942 +DA:875,1551942 +DA:876,1551942 +DA:877,1551942 +DA:878,1551942 +DA:879,1551942 +DA:880,1551942 +DA:881,1551942 +DA:882,1551942 +DA:883,1551942 +DA:884,1551942 +DA:885,1551942 +DA:886,1551942 +DA:889,1221 +DA:890,1221 +DA:891,1221 +DA:892,1221 +DA:894,1221 +DA:895,108 +DA:897,1113 +DA:898,1113 +DA:899,1113 +DA:901,1113 +DA:902,72 +DA:904,1041 +DA:905,891 +DA:907,1041 +DA:908,1113 +DA:912,31282 +DA:913,31282 +DA:915,31282 +DA:916,225 +DA:918,31057 +DA:919,31057 +DA:921,31057 +DA:922,536 +DA:924,30521 +DA:925,30521 +DA:927,30521 +DA:928,30521 +DA:929,294 +DA:931,30227 +DA:933,20829 +DA:934,20829 +DA:935,42135 +DA:936,20829 +DA:938,30227 +DA:939,30227 +DA:940,30227 +DA:941,30521 +DA:958,552948 +DA:959,552948 +DA:960,552948 +DA:962,552948 +DA:963,198 +DA:965,552750 +DA:966,552750 +DA:967,454208 +DA:968,552750 +DA:969,552948 +DA:974,7999 +DA:975,7999 +DA:976,451 +DA:978,7548 +DA:980,7548 +DA:981,2208 +DA:982,2208 +DA:983,12 +DA:984,2208 +DA:986,7536 +DA:987,7469 +DA:988,7469 +DA:989,3622 +DA:992,3622 +DA:993,776 +DA:994,776 +DA:995,24 +DA:996,776 +DA:997,3622 +DA:998,7469 +DA:1000,7512 +DA:1001,4342 +DA:1002,4342 +DA:1003,290 +DA:1004,4342 +DA:1005,7512 +DA:1006,7536 +DA:1024,644790242 +BRDA:97,0,0,1735345 +BRDA:97,0,1,3876 +BRDA:109,0,0,468 +BRDA:109,0,1,25429922 +BRDA:109,1,2,636 +BRDA:109,1,3,25429286 +BRDA:113,0,0,1739221 +BRDA:113,0,1,23690065 +BRDA:116,0,0,3876 +BRDA:116,0,1,1735345 +BRDA:127,0,0,4336819 +BRDA:127,0,1,4384805 +BRDA:133,0,0,604 +BRDA:133,0,1,4384201 +BRDA:133,1,2,1140 +BRDA:133,1,3,4383061 +BRDA:181,0,0,42545 +BRDA:181,0,1,108 +BRDA:187,0,0,3967 +BRDA:187,0,1,132 +BRDA:193,0,0,158810 +BRDA:193,0,1,108 +BRDA:199,0,0,3526 +BRDA:199,0,1,114 +BRDA:207,0,0,1832 +BRDA:207,0,1,294 +BRDA:215,0,0,2118 +BRDA:215,0,1,282 +BRDA:225,0,0,37358 +BRDA:225,0,1,86 +BRDA:227,0,0,252 +BRDA:227,0,1,37192 +BRDA:239,0,0,1186 +BRDA:239,0,1,1464 +BRDA:262,0,0,3534 +BRDA:262,0,1,1186 +BRDA:327,0,0,75440 +BRDA:327,0,1,80 +BRDA:352,0,0,2568 +BRDA:352,0,1,6520 +BRDA:354,0,0,3622 +BRDA:354,0,1,5466 +BRDA:368,0,0,2264 +BRDA:368,0,1,13614 +BRDA:375,0,0,600 +BRDA:375,0,1,13014 +BRDA:378,0,0,12125 +BRDA:378,0,1,889 +BRDA:394,0,0,12948 +BRDA:394,0,1,218 +BRDA:394,1,2,6802 +BRDA:394,1,3,6146 +BRDA:396,0,0,12 +BRDA:396,0,1,6790 +BRDA:423,0,0,8086 +BRDA:423,0,1,1786096 +BRDA:431,0,0,47679602 +BRDA:431,0,1,1786096 +BRDA:449,0,0,108 +BRDA:449,0,1,127733 +BRDA:453,0,0,240 +BRDA:453,0,1,127493 +BRDA:458,0,0,6 +BRDA:458,0,1,127727 +BRDA:461,0,0,119727 +BRDA:461,0,1,8000 +BRDA:464,0,0,7309 +BRDA:464,0,1,120418 +BRDA:483,0,0,108 +BRDA:483,0,1,11286 +BRDA:488,0,0,186 +BRDA:488,0,1,11100 +BRDA:492,0,0,6 +BRDA:492,0,1,11280 +BRDA:496,0,0,10914 +BRDA:496,0,1,366 +BRDA:499,0,0,905 +BRDA:499,0,1,10375 +BRDA:521,0,0,2079 +BRDA:521,0,1,797 +BRDA:536,0,0,468235 +BRDA:536,0,1,3068 +BRDA:536,1,2,4779 +BRDA:536,1,3,463456 +BRDA:538,0,0,156 +BRDA:538,0,1,4623 +BRDA:553,0,0,96 +BRDA:553,0,1,13237 +BRDA:557,0,0,18 +BRDA:557,0,1,13219 +BRDA:560,0,0,11297 +BRDA:560,0,1,1922 +BRDA:560,1,2,1052 +BRDA:560,1,3,10245 +BRDA:562,0,0,6 +BRDA:562,0,1,1046 +BRDA:566,0,0,12983 +BRDA:566,0,1,230 +BRDA:569,0,0,66 +BRDA:569,0,1,12917 +BRDA:572,0,0,1480 +BRDA:572,0,1,11503 +BRDA:590,0,0,204 +BRDA:590,0,1,9582 +BRDA:596,0,0,252 +BRDA:596,0,1,9330 +BRDA:600,0,0,234 +BRDA:600,0,1,9096 +BRDA:603,0,0,6 +BRDA:603,0,1,9090 +BRDA:606,0,0,7315 +BRDA:606,0,1,1775 +BRDA:617,0,0,3293 +BRDA:617,0,1,129 +BRDA:617,1,2,815 +BRDA:617,1,3,2478 +BRDA:619,0,0,6 +BRDA:619,0,1,809 +BRDA:636,0,0,69862 +BRDA:636,0,1,132 +BRDA:636,1,2,69780 +BRDA:636,1,3,82 +BRDA:682,0,0,666 +BRDA:682,0,1,12247680 +BRDA:694,0,0,698 +BRDA:694,0,1,8639406 +BRDA:706,0,0,612 +BRDA:706,0,1,158267 +BRDA:721,0,0,12 +BRDA:721,0,1,7133787 +BRDA:721,1,2,3098 +BRDA:721,1,3,7130689 +BRDA:741,0,0,1632611 +BRDA:741,0,1,5434954 +BRDA:771,0,0,84 +BRDA:771,0,1,9077186 +BRDA:845,0,0,34189 +BRDA:845,0,1,34189 +BRDA:845,1,2,38896 +BRDA:845,1,3,38896 +BRDA:845,2,4,40581 +BRDA:845,2,5,40581 +BRDA:845,3,6,28933 +BRDA:845,3,7,28933 +BRDA:845,4,8,30939 +BRDA:845,4,9,30939 +BRDA:845,5,10,41985 +BRDA:845,5,11,41985 +BRDA:845,6,12,47203 +BRDA:845,6,13,47203 +BRDA:845,7,14,29145 +BRDA:845,7,15,29145 +BRDA:845,8,16,97530 +BRDA:845,8,17,48765 +BRDA:845,9,18,42722 +BRDA:845,9,19,21361 +BRDA:845,10,20,132640 +BRDA:845,10,21,66320 +BRDA:845,11,22,63458 +BRDA:845,11,23,31729 +BRDA:845,12,24,4212494 +BRDA:845,12,25,2106247 +BRDA:845,13,26,90202 +BRDA:845,13,27,45101 +BRDA:845,14,28,74926 +BRDA:845,14,29,37463 +BRDA:845,15,30,76806 +BRDA:845,15,31,38403 +BRDA:845,16,32,95763 +BRDA:845,16,33,31921 +BRDA:845,17,34,90741 +BRDA:845,17,35,30247 +BRDA:845,18,36,123207 +BRDA:845,18,37,41069 +BRDA:845,19,38,126549 +BRDA:845,19,39,42183 +BRDA:845,20,40,86469 +BRDA:845,20,41,28823 +BRDA:845,21,42,103335 +BRDA:845,21,43,34445 +BRDA:845,22,44,75171 +BRDA:845,22,45,25057 +BRDA:845,23,46,276000 +BRDA:845,23,47,92000 +BRDA:845,24,48,1250104 +BRDA:845,24,49,312526 +BRDA:894,0,0,108 +BRDA:894,0,1,1113 +BRDA:901,0,0,72 +BRDA:901,0,1,1041 +BRDA:904,0,0,891 +BRDA:904,0,1,150 +BRDA:915,0,0,6 +BRDA:915,0,1,4914 +BRDA:915,1,2,6 +BRDA:915,1,3,1066 +BRDA:915,2,4,36 +BRDA:915,2,5,8425 +BRDA:915,3,6,171 +BRDA:915,3,7,9550 +BRDA:915,4,8,6 +BRDA:915,4,9,7102 +BRDA:921,0,0,108 +BRDA:921,0,1,6994 +BRDA:921,1,2,114 +BRDA:921,1,3,4800 +BRDA:921,2,4,90 +BRDA:921,2,5,9460 +BRDA:921,3,6,112 +BRDA:921,3,7,954 +BRDA:921,4,8,112 +BRDA:921,4,9,8313 +BRDA:928,0,0,60 +BRDA:928,0,1,6934 +BRDA:928,1,2,62 +BRDA:928,1,3,9398 +BRDA:928,2,4,56 +BRDA:928,2,5,4744 +BRDA:928,3,6,56 +BRDA:928,3,7,898 +BRDA:928,4,8,60 +BRDA:928,4,9,8253 +BRDA:934,0,0,8253 +BRDA:934,0,1,8253 +BRDA:934,1,2,9488 +BRDA:934,1,3,4744 +BRDA:934,2,4,20802 +BRDA:934,2,5,6934 +BRDA:934,3,6,3592 +BRDA:934,3,7,898 +BRDA:938,0,0,4576 +BRDA:938,0,1,168 +BRDA:938,1,2,8109 +BRDA:938,1,3,144 +BRDA:938,2,4,6792 +BRDA:938,2,5,142 +BRDA:938,3,6,766 +BRDA:938,3,7,132 +BRDA:938,4,8,9260 +BRDA:938,4,9,138 +BRDA:962,0,0,114 +BRDA:962,0,1,527455 +BRDA:962,1,2,84 +BRDA:962,1,3,25295 +BRDA:966,0,0,24346 +BRDA:966,0,1,949 +BRDA:966,1,2,429862 +BRDA:966,1,3,97593 +BRDA:975,0,0,451 +BRDA:975,0,1,7548 +BRDA:980,0,0,7283 +BRDA:980,0,1,265 +BRDA:980,1,2,2208 +BRDA:980,1,3,5075 +BRDA:982,0,0,12 +BRDA:982,0,1,2196 +BRDA:986,0,0,7469 +BRDA:986,0,1,67 +BRDA:988,0,0,3622 +BRDA:988,0,1,3847 +BRDA:988,1,2,0 +BRDA:988,1,3,7469 +BRDA:988,2,4,3622 +BRDA:988,2,5,3847 +BRDA:992,0,0,776 +BRDA:992,0,1,2846 +BRDA:994,0,0,24 +BRDA:994,0,1,752 +BRDA:1000,0,0,4342 +BRDA:1000,0,1,3170 +BRDA:1002,0,0,290 +BRDA:1002,0,1,4052 +BRF:182 +BRH:181 +LF:589 +LH:588 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone/instructions_calls.cpp +FN:66,_ZN6evmone5instr4core9call_implILNS_6OpcodeE241EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:66,_ZN6evmone5instr4core9call_implILNS_6OpcodeE250EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:66,_ZN6evmone5instr4core9call_implILNS_6OpcodeE244EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:66,_ZN6evmone5instr4core9call_implILNS_6OpcodeE242EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:198,_ZN6evmone5instr4core11create_implILNS_6OpcodeE240EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:198,_ZN6evmone5instr4core11create_implILNS_6OpcodeE245EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FN:22,instructions_calls.cpp:_ZN6evmone5instr4core12_GLOBAL__N_118get_target_addressERKN4evmc7addressERlRNS_14ExecutionStateE +FNDA:814575,_ZN6evmone5instr4core9call_implILNS_6OpcodeE241EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:2996687,_ZN6evmone5instr4core9call_implILNS_6OpcodeE250EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:73142,_ZN6evmone5instr4core9call_implILNS_6OpcodeE244EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:77562,_ZN6evmone5instr4core9call_implILNS_6OpcodeE242EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:23188,_ZN6evmone5instr4core11create_implILNS_6OpcodeE240EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:13584,_ZN6evmone5instr4core11create_implILNS_6OpcodeE245EEENS_6ResultENS_8StackTopElRNS_14ExecutionStateE +FNDA:3961044,instructions_calls.cpp:_ZN6evmone5instr4core12_GLOBAL__N_118get_target_addressERKN4evmc7addressERlRNS_14ExecutionStateE +FNF:3 +FNH:3 +DA:22,3961044 +DA:23,3961044 +DA:24,1717135 +DA:26,2243909 +DA:27,2243909 +DA:28,2241071 +DA:30,2838 +DA:31,2838 +DA:32,330 +DA:33,2838 +DA:35,2838 +DA:36,18 +DA:38,2820 +DA:39,2838 +DA:66,3961966 +DA:67,3961966 +DA:68,3961966 +DA:70,3961966 +DA:72,3961966 +DA:73,3961966 +DA:74,3961966 +DA:75,3961966 +DA:76,3961966 +DA:77,3961966 +DA:78,3961966 +DA:79,3961966 +DA:81,3961966 +DA:82,3961966 +DA:84,3961966 +DA:85,185751 +DA:86,185751 +DA:87,922 +DA:88,185751 +DA:90,3961044 +DA:91,3961044 +DA:92,18 +DA:94,3961026 +DA:96,3961026 +DA:97,604 +DA:99,3960422 +DA:100,276 +DA:102,3960146 +DA:103,3960146 +DA:104,3960146 +DA:105,3960146 +DA:107,3960146 +DA:108,3960146 +DA:109,3960146 +DA:110,2796 +DA:111,3957350 +DA:112,3957350 +DA:113,3960146 +DA:114,3960146 +DA:115,3960146 +DA:116,3960146 +DA:117,3960146 +DA:118,3960146 +DA:120,3960146 +DA:121,3051774 +DA:123,3051774 +DA:124,3051774 +DA:125,3051774 +DA:128,891101 +DA:129,891101 +DA:132,814137 +DA:133,814137 +DA:134,180 +DA:136,813957 +DA:137,1227 +DA:138,813957 +DA:140,891101 +DA:141,146 +DA:142,891101 +DA:144,890955 +DA:145,3960146 +DA:146,3954352 +DA:149,2996293 +DA:150,2996293 +DA:153,963853 +DA:154,963853 +DA:155,951738 +DA:156,12115 +DA:157,80 +DA:158,963853 +DA:161,891101 +DA:162,891101 +DA:163,53358 +DA:164,53358 +DA:165,53358 +DA:166,53358 +DA:167,483 +DA:168,53358 +DA:169,891101 +DA:171,3960146 +DA:172,0 +DA:174,3960146 +DA:175,3960146 +DA:176,3960146 +DA:178,3960146 +DA:179,132450 +DA:181,3960146 +DA:182,3960146 +DA:183,3960146 +DA:184,3960146 +DA:185,3960146 +DA:198,36772 +DA:199,36772 +DA:201,36772 +DA:202,54 +DA:204,36718 +DA:205,36718 +DA:206,36718 +DA:207,36718 +DA:209,36718 +DA:210,36718 +DA:212,36718 +DA:213,246 +DA:215,36472 +DA:216,36472 +DA:218,36472 +DA:219,56 +DA:221,36416 +DA:222,36416 +DA:223,36416 +DA:224,60 +DA:226,36356 +DA:227,0 +DA:229,36356 +DA:230,36356 +DA:231,114 +DA:233,36242 +DA:234,36242 +DA:235,36242 +DA:236,34960 +DA:238,36242 +DA:239,35578 +DA:241,35578 +DA:242,35578 +DA:243,35578 +DA:244,36242 +DA:245,36242 +DA:246,36242 +DA:247,36242 +DA:249,36242 +DA:250,36242 +DA:251,36242 +DA:253,36242 +DA:254,36242 +DA:255,34170 +DA:257,36242 +DA:258,36356 +BRDA:23,0,0,1717135 +BRDA:23,0,1,2243909 +BRDA:27,0,0,2241071 +BRDA:27,0,1,2838 +BRDA:31,0,0,330 +BRDA:31,0,1,2508 +BRDA:35,0,0,18 +BRDA:35,0,1,2820 +BRDA:70,0,0,814575 +BRDA:70,0,1,0 +BRDA:70,1,2,- +BRDA:70,1,3,- +BRDA:70,2,4,- +BRDA:70,2,5,- +BRDA:70,3,6,- +BRDA:70,3,7,- +BRDA:70,4,8,- +BRDA:70,4,9,- +BRDA:70,5,10,- +BRDA:70,5,11,- +BRDA:70,6,12,- +BRDA:70,6,13,- +BRDA:70,7,14,- +BRDA:70,7,15,- +BRDA:74,0,0,0 +BRDA:74,0,1,77562 +BRDA:74,1,2,0 +BRDA:74,1,3,814575 +BRDA:74,2,4,73142 +BRDA:74,2,5,0 +BRDA:74,3,6,2996687 +BRDA:74,3,7,0 +BRDA:84,0,0,759164 +BRDA:84,0,1,55411 +BRDA:84,1,2,74854 +BRDA:84,1,3,2708 +BRDA:84,2,4,2995193 +BRDA:84,2,5,1494 +BRDA:84,3,6,71366 +BRDA:84,3,7,1776 +BRDA:84,4,8,30996 +BRDA:84,4,9,40370 +BRDA:84,5,10,31496 +BRDA:84,5,11,43358 +BRDA:84,6,12,20040 +BRDA:84,6,13,2975153 +BRDA:84,7,14,103219 +BRDA:84,7,15,655945 +BRDA:86,0,0,182 +BRDA:86,0,1,30814 +BRDA:86,1,2,182 +BRDA:86,1,3,19858 +BRDA:86,2,4,360 +BRDA:86,2,5,31136 +BRDA:86,3,6,198 +BRDA:86,3,7,103021 +BRDA:91,0,0,6 +BRDA:91,0,1,814371 +BRDA:91,1,2,4 +BRDA:91,1,3,2996501 +BRDA:91,2,4,4 +BRDA:91,2,5,77198 +BRDA:91,3,6,4 +BRDA:91,3,7,72956 +BRDA:96,0,0,168 +BRDA:96,0,1,77030 +BRDA:96,1,2,132 +BRDA:96,1,3,72824 +BRDA:96,2,4,142 +BRDA:96,2,5,2996359 +BRDA:96,3,6,162 +BRDA:96,3,7,814209 +BRDA:99,0,0,72 +BRDA:99,0,1,814137 +BRDA:99,1,2,66 +BRDA:99,1,3,76964 +BRDA:99,2,4,72 +BRDA:99,2,5,72752 +BRDA:99,3,6,66 +BRDA:99,3,7,2996293 +BRDA:108,0,0,0 +BRDA:108,0,1,814137 +BRDA:108,1,2,0 +BRDA:108,1,3,72752 +BRDA:108,2,4,0 +BRDA:108,2,5,76964 +BRDA:108,3,6,2996293 +BRDA:108,3,7,0 +BRDA:109,0,0,102 +BRDA:109,0,1,2996191 +BRDA:109,1,2,110 +BRDA:109,1,3,76854 +BRDA:109,2,4,150 +BRDA:109,2,5,72602 +BRDA:109,3,6,2434 +BRDA:109,3,7,811703 +BRDA:114,0,0,0 +BRDA:114,0,1,2996293 +BRDA:114,1,2,0 +BRDA:114,1,3,76964 +BRDA:114,2,4,814137 +BRDA:114,2,5,0 +BRDA:114,3,6,0 +BRDA:114,3,7,72752 +BRDA:114,4,8,0 +BRDA:114,4,9,72752 +BRDA:114,5,10,2996293 +BRDA:114,5,11,0 +BRDA:114,6,12,0 +BRDA:114,6,13,76964 +BRDA:114,7,14,- +BRDA:114,7,15,- +BRDA:116,0,0,72752 +BRDA:116,0,1,0 +BRDA:116,1,2,0 +BRDA:116,1,3,76964 +BRDA:116,2,4,0 +BRDA:116,2,5,814137 +BRDA:116,3,6,0 +BRDA:116,3,7,2996293 +BRDA:118,0,0,0 +BRDA:118,0,1,814137 +BRDA:118,1,2,0 +BRDA:118,1,3,76964 +BRDA:118,2,4,0 +BRDA:118,2,5,2996293 +BRDA:118,3,6,72752 +BRDA:118,3,7,0 +BRDA:120,0,0,41790 +BRDA:120,0,1,30962 +BRDA:120,1,2,47918 +BRDA:120,1,3,29046 +BRDA:120,2,4,628709 +BRDA:120,2,5,185428 +BRDA:120,3,6,2333357 +BRDA:120,3,7,662936 +BRDA:129,0,0,6520 +BRDA:129,0,1,70444 +BRDA:129,1,2,47168 +BRDA:129,1,3,766969 +BRDA:133,0,0,47168 +BRDA:133,0,1,766969 +BRDA:133,1,2,180 +BRDA:133,1,3,46988 +BRDA:136,0,0,46988 +BRDA:136,0,1,766969 +BRDA:136,1,2,9795 +BRDA:136,1,3,757174 +BRDA:136,2,4,1227 +BRDA:136,2,5,55556 +BRDA:140,0,0,36 +BRDA:140,0,1,76928 +BRDA:140,1,2,110 +BRDA:140,1,3,814027 +BRDA:145,0,0,2993239 +BRDA:145,0,1,3054 +BRDA:145,1,2,76694 +BRDA:145,1,3,270 +BRDA:145,2,4,72626 +BRDA:145,2,5,126 +BRDA:145,3,6,811793 +BRDA:145,3,7,2344 +BRDA:154,0,0,76308 +BRDA:154,0,1,656 +BRDA:154,1,2,802956 +BRDA:154,1,3,11181 +BRDA:154,2,4,72474 +BRDA:154,2,5,278 +BRDA:156,0,0,76 +BRDA:156,0,1,11105 +BRDA:156,1,2,2 +BRDA:156,1,3,654 +BRDA:156,2,4,2 +BRDA:156,2,5,276 +BRDA:162,0,0,46876 +BRDA:162,0,1,767261 +BRDA:162,1,2,6482 +BRDA:162,1,3,70482 +BRDA:166,0,0,136 +BRDA:166,0,1,6346 +BRDA:166,1,2,347 +BRDA:166,1,3,46529 +BRDA:171,0,0,0 +BRDA:171,0,1,814137 +BRDA:171,1,2,0 +BRDA:171,1,3,2996293 +BRDA:171,2,4,0 +BRDA:171,2,5,72752 +BRDA:171,3,6,0 +BRDA:171,3,7,76964 +BRDA:178,0,0,9679 +BRDA:178,0,1,67285 +BRDA:178,1,2,22692 +BRDA:178,1,3,2973601 +BRDA:178,2,4,4485 +BRDA:178,2,5,68267 +BRDA:178,3,6,95594 +BRDA:178,3,7,718543 +BRDA:201,0,0,36 +BRDA:201,0,1,23152 +BRDA:201,1,2,18 +BRDA:201,1,3,13566 +BRDA:207,0,0,0 +BRDA:207,0,1,23152 +BRDA:207,1,2,13566 +BRDA:207,1,3,0 +BRDA:212,0,0,138 +BRDA:212,0,1,23014 +BRDA:212,1,2,108 +BRDA:212,1,3,13458 +BRDA:218,0,0,16338 +BRDA:218,0,1,6676 +BRDA:218,1,2,9090 +BRDA:218,1,3,4368 +BRDA:218,2,4,34 +BRDA:218,2,5,16304 +BRDA:218,3,6,22 +BRDA:218,3,7,9068 +BRDA:223,0,0,36 +BRDA:223,0,1,13400 +BRDA:223,1,2,24 +BRDA:223,1,3,22956 +BRDA:226,0,0,0 +BRDA:226,0,1,22956 +BRDA:226,1,2,0 +BRDA:226,1,3,13400 +BRDA:229,0,0,54 +BRDA:229,0,1,13346 +BRDA:229,1,2,2288 +BRDA:229,1,3,11112 +BRDA:229,2,4,2664 +BRDA:229,2,5,20292 +BRDA:229,3,6,60 +BRDA:229,3,7,22896 +BRDA:230,0,0,54 +BRDA:230,0,1,2234 +BRDA:230,1,2,60 +BRDA:230,1,3,2604 +BRDA:235,0,0,13346 +BRDA:235,0,1,0 +BRDA:235,1,2,21614 +BRDA:235,1,3,1282 +BRDA:238,0,0,22634 +BRDA:238,0,1,262 +BRDA:238,1,2,12944 +BRDA:238,1,3,402 +BRDA:254,0,0,21847 +BRDA:254,0,1,1049 +BRDA:254,1,2,12323 +BRDA:254,1,3,1023 +BRF:85 +BRH:81 +LF:149 +LH:147 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone/instructions_storage.cpp +FN:98,_ZN6evmone5instr4core5sloadENS_8StackTopElRNS_14ExecutionStateE +FN:119,_ZN6evmone5instr4core6sstoreENS_8StackTopElRNS_14ExecutionStateE +FNDA:943693,_ZN6evmone5instr4core5sloadENS_8StackTopElRNS_14ExecutionStateE +FNDA:4583305,_ZN6evmone5instr4core6sstoreENS_8StackTopElRNS_14ExecutionStateE +FNF:2 +FNH:2 +DA:98,943693 +DA:99,943693 +DA:100,943693 +DA:102,943693 +DA:103,943693 +DA:104,626549 +DA:107,626549 +DA:108,626549 +DA:109,626549 +DA:110,23 +DA:111,626549 +DA:113,943670 +DA:115,943670 +DA:116,943693 +DA:119,4583305 +DA:120,4583305 +DA:121,219435 +DA:123,4363870 +DA:124,33408 +DA:126,4330462 +DA:127,4330462 +DA:129,4330462 +DA:130,4330462 +DA:131,4330462 +DA:132,1471179 +DA:133,4330462 +DA:134,4330462 +DA:136,4330462 +DA:137,4330462 +DA:138,4330462 +DA:139,33896 +DA:140,4296566 +DA:141,4296566 +DA:142,4330462 +BRDA:102,0,0,626549 +BRDA:102,0,1,317144 +BRDA:102,1,2,943033 +BRDA:102,1,3,660 +BRDA:103,0,0,626549 +BRDA:103,0,1,316484 +BRDA:109,0,0,23 +BRDA:109,0,1,626526 +BRDA:120,0,0,219435 +BRDA:120,0,1,4363870 +BRDA:123,0,0,4325018 +BRDA:123,0,1,38852 +BRDA:123,1,2,33408 +BRDA:123,1,3,4291610 +BRDA:130,0,0,4279253 +BRDA:130,0,1,51209 +BRDA:131,0,0,1471179 +BRDA:131,0,1,2808074 +BRDA:138,0,0,33896 +BRDA:138,0,1,4296566 +BRF:20 +BRH:20 +LF:34 +LH:34 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone/instructions_xmacro.hpp +FNF:0 +FNH:0 +DA:7,647385938 +DA:35,2650828 +DA:36,18439911 +DA:37,15789083 +DA:38,5947743 +DA:39,3296915 +DA:40,2654927 +DA:41,2809746 +DA:42,2654468 +DA:43,2652954 +DA:44,2653228 +DA:45,2688020 +DA:46,2653478 +DA:47,2650828 +DA:48,2650828 +DA:49,2650828 +DA:50,2650828 +DA:51,2650 +DA:52,5558118 +DA:53,3055201 +DA:54,2657466 +DA:55,2657106 +DA:56,3469067 +DA:57,7921270 +DA:58,5270442 +DA:59,2701951 +DA:60,2652570 +DA:61,2718676 +DA:62,2726348 +DA:63,6118537 +DA:64,3467709 +DA:65,2659916 +DA:66,2653648 +DA:67,2650828 +DA:68,2820 +DA:69,2663842 +DA:70,2650828 +DA:71,2650828 +DA:72,2650828 +DA:73,2650828 +DA:74,2650828 +DA:75,2650828 +DA:76,2650828 +DA:77,2650828 +DA:78,2650828 +DA:79,2650828 +DA:80,2650828 +DA:81,2650828 +DA:82,2650828 +DA:83,2650828 +DA:84,2650828 +DA:85,13014 +DA:86,2697775 +DA:87,2663982 +DA:88,2674551 +DA:89,2927524 +DA:90,2675626 +DA:91,4445010 +DA:92,2836213 +DA:93,2778555 +DA:94,2672859 +DA:95,2662108 +DA:96,2664341 +DA:97,3121975 +DA:98,2664041 +DA:99,2711870 +DA:100,2659918 +DA:101,2654244 +DA:102,3416 +DA:103,2720822 +DA:104,2665857 +DA:105,2802582 +DA:106,2785886 +DA:107,2664756 +DA:108,2666179 +DA:109,2651300 +DA:110,2652441 +DA:111,2651392 +DA:112,2653704 +DA:113,2663686 +DA:114,2650828 +DA:115,2650828 +DA:116,2650828 +DA:117,2650828 +DA:118,2650828 +DA:119,12858 +DA:120,7147450 +DA:121,14898508 +DA:122,12247680 +DA:123,8639406 +DA:124,3594498 +DA:125,6947394 +DA:126,8151544 +DA:127,9715755 +DA:128,8335445 +DA:129,5684617 +DA:130,19191934 +DA:131,26710601 +DA:132,24059773 +DA:133,11728014 +DA:134,9077186 +DA:135,3835348 +DA:136,1184520 +DA:137,82357360 +DA:138,79706532 +DA:139,9932039 +DA:140,2771035 +DA:141,2700472 +DA:142,2700678 +DA:143,2697553 +DA:144,2698031 +DA:145,2692813 +DA:146,2681767 +DA:147,2679761 +DA:148,2691409 +DA:149,2689724 +DA:150,2685017 +DA:151,2679973 +DA:152,29145 +DA:153,2699593 +DA:154,2672189 +DA:155,2717148 +DA:156,2682557 +DA:157,4757075 +DA:158,2695929 +DA:159,2688291 +DA:160,2689231 +DA:161,2682749 +DA:162,2681075 +DA:163,2691897 +DA:164,2693011 +DA:165,2679651 +DA:166,2685273 +DA:167,2675885 +DA:168,2742828 +DA:169,2963354 +DA:170,312526 +DA:171,8513908 +DA:172,5863080 +DA:173,3270687 +DA:174,2933820 +DA:175,2774292 +DA:176,2714214 +DA:177,2703259 +DA:178,3094517 +DA:179,2677470 +DA:180,2703335 +DA:181,2675436 +DA:182,2667408 +DA:183,2680967 +DA:184,2665862 +DA:185,2675864 +DA:186,2668105 +DA:187,17277 +DA:188,3367906 +DA:189,3046019 +DA:190,2919368 +DA:191,2735715 +DA:192,2686650 +DA:193,2658961 +DA:194,2654723 +DA:195,2658639 +DA:196,2656769 +DA:197,2653155 +DA:198,2653585 +DA:199,2657641 +DA:200,2655097 +DA:201,2654422 +DA:202,2653267 +DA:203,2653273 +DA:204,2445 +DA:205,2660226 +DA:206,2659081 +DA:207,2655572 +DA:208,2657762 +DA:209,2651726 +DA:210,2650828 +DA:211,2650828 +DA:212,2650828 +DA:213,2650828 +DA:214,2650828 +DA:215,2650828 +DA:216,2650828 +DA:217,2650828 +DA:218,2650828 +DA:219,2650828 +DA:220,2650828 +DA:221,898 +DA:222,2650828 +DA:223,2650828 +DA:224,2650828 +DA:225,2650828 +DA:226,2650828 +DA:227,2650828 +DA:228,2650828 +DA:229,2650828 +DA:230,2650828 +DA:231,2650828 +DA:232,2650828 +DA:233,2650828 +DA:234,2650828 +DA:235,2650828 +DA:236,2650828 +DA:237,2650828 +DA:238,898 +DA:239,2650828 +DA:240,2650828 +DA:241,2650828 +DA:242,2650828 +DA:243,2650828 +DA:244,2650828 +DA:245,2650828 +DA:246,2650828 +DA:247,2650828 +DA:248,2650828 +DA:249,2650828 +DA:250,2650828 +DA:251,2650828 +DA:252,2650828 +DA:253,2650828 +DA:254,2650828 +DA:255,898 +DA:256,2650828 +DA:257,2650828 +DA:258,2650828 +DA:259,2650828 +DA:260,2650828 +DA:261,2650828 +DA:262,2650828 +DA:263,2650828 +DA:264,2650828 +DA:265,2650828 +DA:266,2650828 +DA:267,2650828 +DA:268,2650828 +DA:269,2650828 +DA:270,2650828 +DA:271,2650828 +DA:272,898 +DA:273,2650828 +DA:274,2650828 +DA:275,2650828 +DA:276,2650828 +DA:277,2650828 +DA:278,2650828 +DA:279,2650828 +DA:280,2650828 +DA:281,2650828 +DA:282,2650828 +DA:283,2650828 +DA:284,2650828 +DA:285,2650828 +DA:286,2650828 +DA:287,2650828 +DA:288,2650828 +DA:289,898 +DA:290,2673784 +DA:291,3464599 +DA:292,2727754 +DA:293,2650828 +DA:294,2723578 +DA:295,2664228 +DA:296,2650828 +DA:297,2650828 +DA:298,2650828 +DA:299,2650828 +DA:300,5647121 +DA:301,2996293 +DA:302,2996293 +DA:303,2996293 +DA:304,2650828 +DA:305,2650828 +BRF:0 +BRH:0 +LF:0 +LH:0 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/blake2b.cpp +FN:40,_ZN6evmone6crypto16blake2b_compressEjPmPKmS3_b +FN:25,blake2b.cpp:_ZN6evmone6crypto12_GLOBAL__N_11gEPmmmmmmm +FN:14,blake2b.cpp:_ZN6evmone6crypto12_GLOBAL__N_14rotrEmj +FNDA:1024,_ZN6evmone6crypto16blake2b_compressEjPmPKmS3_b +FNDA:26164864,blake2b.cpp:_ZN6evmone6crypto12_GLOBAL__N_11gEPmmmmmmm +FNDA:104659456,blake2b.cpp:_ZN6evmone6crypto12_GLOBAL__N_14rotrEmj +FNF:3 +FNH:3 +DA:14,104659456 +DA:15,104659456 +DA:16,104659456 +DA:25,26164864 +DA:26,26164864 +DA:27,26164864 +DA:28,26164864 +DA:29,26164864 +DA:30,26164864 +DA:31,26164864 +DA:32,26164864 +DA:33,26164864 +DA:34,26164864 +DA:40,1024 +DA:43,1024 +DA:44,1024 +DA:45,1024 +DA:46,1024 +DA:47,1024 +DA:48,1024 +DA:49,1024 +DA:50,1024 +DA:51,1024 +DA:52,1024 +DA:53,1024 +DA:54,1024 +DA:58,1024 +DA:59,1024 +DA:60,1024 +DA:61,1024 +DA:62,1024 +DA:63,1024 +DA:64,1024 +DA:67,3271632 +DA:68,3270608 +DA:70,3270608 +DA:72,3270608 +DA:73,3270608 +DA:74,3270608 +DA:75,3270608 +DA:76,3270608 +DA:77,3270608 +DA:78,3270608 +DA:79,3270608 +DA:80,3270608 +DA:82,9216 +DA:83,8192 +DA:84,1024 +BRDA:67,0,0,3270608 +BRDA:67,0,1,1024 +BRDA:82,0,0,8192 +BRDA:82,0,1,1024 +BRF:4 +BRH:4 +LF:48 +LH:48 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/bls.cpp +FN:96,_ZN6evmone6crypto3bls6g1_addEPhS2_PKhS4_S4_S4_ +FN:119,_ZN6evmone6crypto3bls6g1_mulEPhS2_PKhS4_S4_ +FN:146,_ZN6evmone6crypto3bls6g2_addEPhS2_PKhS4_S4_S4_ +FN:169,_ZN6evmone6crypto3bls6g2_mulEPhS2_PKhS4_S4_ +FN:196,_ZN6evmone6crypto3bls6g1_msmEPhS2_PKhm +FN:258,_ZN6evmone6crypto3bls6g2_msmEPhS2_PKhm +FN:319,_ZN6evmone6crypto3bls12map_fp_to_g1EPhS2_PKh +FN:337,_ZN6evmone6crypto3bls13map_fp2_to_g2EPhS2_PKh +FN:354,_ZN6evmone6crypto3bls13pairing_checkEPhPKhm +FN:30,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_111validate_p1EPKhS4_ +FN:80,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_15storeEPhRK7blst_fp +FN:62,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_111validate_p2EPKhS4_ +FN:87,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_15storeEPhRK8blst_fp2 +FN:17,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_111validate_fpEPKh +FN:47,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_112validate_fp2EPKh +FNDA:326,_ZN6evmone6crypto3bls6g1_addEPhS2_PKhS4_S4_S4_ +FNDA:364,_ZN6evmone6crypto3bls6g1_mulEPhS2_PKhS4_S4_ +FNDA:350,_ZN6evmone6crypto3bls6g2_addEPhS2_PKhS4_S4_S4_ +FNDA:376,_ZN6evmone6crypto3bls6g2_mulEPhS2_PKhS4_S4_ +FNDA:1222,_ZN6evmone6crypto3bls6g1_msmEPhS2_PKhm +FNDA:1234,_ZN6evmone6crypto3bls6g2_msmEPhS2_PKhm +FNDA:118,_ZN6evmone6crypto3bls12map_fp_to_g1EPhS2_PKh +FNDA:106,_ZN6evmone6crypto3bls13map_fp2_to_g2EPhS2_PKh +FNDA:414,_ZN6evmone6crypto3bls13pairing_checkEPhPKhm +FNDA:95304,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_111validate_p1EPKhS4_ +FNDA:3012,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_15storeEPhRK7blst_fp +FNDA:93796,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_111validate_p2EPKhS4_ +FNDA:980,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_15storeEPhRK8blst_fp2 +FNDA:565470,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_111validate_fpEPKh +FNDA:187530,bls.cpp:_ZN6evmone6crypto3bls12_GLOBAL__N_112validate_fp2EPKh +FNF:15 +FNH:15 +DA:17,565470 +DA:18,565470 +DA:19,540 +DA:21,564930 +DA:22,564930 +DA:23,564930 +DA:24,565470 +DA:30,95304 +DA:31,95304 +DA:32,95304 +DA:33,124 +DA:34,95180 +DA:35,95180 +DA:36,60 +DA:38,95120 +DA:39,95120 +DA:40,172 +DA:42,94948 +DA:43,95120 +DA:47,187530 +DA:48,187530 +DA:49,187530 +DA:50,192 +DA:51,187338 +DA:52,187338 +DA:53,128 +DA:55,187210 +DA:56,187338 +DA:62,93796 +DA:63,93796 +DA:64,93796 +DA:65,168 +DA:67,93628 +DA:68,93628 +DA:69,96 +DA:71,93532 +DA:72,93532 +DA:73,164 +DA:75,93368 +DA:76,93532 +DA:80,3012 +DA:81,3012 +DA:82,3012 +DA:83,3012 +DA:87,980 +DA:88,980 +DA:89,980 +DA:90,980 +DA:96,326 +DA:97,326 +DA:98,326 +DA:100,326 +DA:101,144 +DA:103,182 +DA:104,182 +DA:106,182 +DA:107,182 +DA:109,182 +DA:110,182 +DA:111,182 +DA:112,182 +DA:114,182 +DA:115,326 +DA:119,364 +DA:120,364 +DA:121,364 +DA:123,364 +DA:124,364 +DA:125,108 +DA:127,256 +DA:128,256 +DA:130,256 +DA:131,64 +DA:133,192 +DA:134,192 +DA:136,192 +DA:137,192 +DA:138,192 +DA:139,192 +DA:141,192 +DA:142,256 +DA:146,350 +DA:147,350 +DA:148,350 +DA:150,350 +DA:151,176 +DA:153,174 +DA:154,174 +DA:156,174 +DA:157,174 +DA:159,174 +DA:160,174 +DA:161,174 +DA:162,174 +DA:164,174 +DA:165,350 +DA:169,376 +DA:170,376 +DA:171,376 +DA:173,376 +DA:174,376 +DA:175,128 +DA:177,248 +DA:178,248 +DA:180,248 +DA:181,56 +DA:183,192 +DA:184,192 +DA:186,192 +DA:187,192 +DA:188,192 +DA:189,192 +DA:191,192 +DA:192,248 +DA:196,1222 +DA:197,1222 +DA:198,1222 +DA:199,1222 +DA:201,1222 +DA:202,1222 +DA:203,1222 +DA:204,1222 +DA:206,1222 +DA:207,1222 +DA:208,1222 +DA:209,1222 +DA:211,1222 +DA:212,82206 +DA:213,81032 +DA:214,81032 +DA:215,81032 +DA:216,28 +DA:218,81004 +DA:219,20 +DA:222,80984 +DA:223,78254 +DA:225,2730 +DA:226,2730 +DA:228,2730 +DA:229,2730 +DA:230,2730 +DA:231,2730 +DA:232,2730 +DA:234,1174 +DA:235,1104 +DA:236,1104 +DA:237,1104 +DA:238,1104 +DA:239,1104 +DA:241,70 +DA:242,70 +DA:243,70 +DA:244,70 +DA:245,70 +DA:246,70 +DA:248,70 +DA:249,70 +DA:250,70 +DA:251,70 +DA:253,70 +DA:254,1174 +DA:258,1234 +DA:259,1234 +DA:260,1234 +DA:261,1234 +DA:263,1234 +DA:264,1234 +DA:265,1234 +DA:266,1234 +DA:268,1234 +DA:269,1234 +DA:270,1234 +DA:271,1234 +DA:273,1234 +DA:274,80714 +DA:275,79536 +DA:276,79536 +DA:277,79536 +DA:278,36 +DA:280,79500 +DA:281,20 +DA:284,79480 +DA:285,78274 +DA:287,1206 +DA:288,1206 +DA:290,1206 +DA:291,1206 +DA:292,1206 +DA:293,1206 +DA:294,1206 +DA:296,1178 +DA:297,1104 +DA:298,1104 +DA:299,1104 +DA:300,1104 +DA:301,1104 +DA:303,74 +DA:304,74 +DA:305,74 +DA:306,74 +DA:307,74 +DA:308,74 +DA:310,74 +DA:311,74 +DA:312,74 +DA:313,74 +DA:315,74 +DA:316,1178 +DA:319,118 +DA:320,118 +DA:321,118 +DA:322,36 +DA:324,82 +DA:325,82 +DA:327,82 +DA:328,82 +DA:329,82 +DA:330,82 +DA:332,82 +DA:333,118 +DA:337,106 +DA:338,106 +DA:339,106 +DA:340,56 +DA:342,50 +DA:343,50 +DA:345,50 +DA:346,50 +DA:347,50 +DA:348,50 +DA:350,50 +DA:351,106 +DA:354,414 +DA:355,414 +DA:356,414 +DA:357,414 +DA:358,414 +DA:359,414 +DA:360,414 +DA:362,414 +DA:363,414 +DA:364,13466 +DA:365,13256 +DA:366,13256 +DA:367,13256 +DA:368,72 +DA:370,13184 +DA:371,13184 +DA:372,84 +DA:374,13100 +DA:375,24 +DA:377,13076 +DA:378,24 +DA:381,13052 +DA:382,12912 +DA:384,140 +DA:385,140 +DA:386,140 +DA:387,140 +DA:389,210 +DA:390,210 +DA:391,210 +DA:392,210 +DA:393,210 +DA:394,414 +BRDA:18,0,0,540 +BRDA:18,0,1,564930 +BRDA:32,0,0,124 +BRDA:32,0,1,95180 +BRDA:35,0,0,60 +BRDA:35,0,1,95120 +BRDA:39,0,0,172 +BRDA:39,0,1,94948 +BRDA:49,0,0,192 +BRDA:49,0,1,187338 +BRDA:52,0,0,128 +BRDA:52,0,1,187210 +BRDA:64,0,0,168 +BRDA:64,0,1,93628 +BRDA:68,0,0,96 +BRDA:68,0,1,93532 +BRDA:72,0,0,164 +BRDA:72,0,1,93368 +BRDA:100,0,0,92 +BRDA:100,0,1,234 +BRDA:100,1,2,52 +BRDA:100,1,3,182 +BRDA:124,0,0,108 +BRDA:124,0,1,256 +BRDA:130,0,0,64 +BRDA:130,0,1,192 +BRDA:150,0,0,108 +BRDA:150,0,1,242 +BRDA:150,1,2,68 +BRDA:150,1,3,174 +BRDA:174,0,0,128 +BRDA:174,0,1,248 +BRDA:180,0,0,56 +BRDA:180,0,1,192 +BRDA:212,0,0,81032 +BRDA:212,0,1,1174 +BRDA:215,0,0,28 +BRDA:215,0,1,81004 +BRDA:218,0,0,20 +BRDA:218,0,1,80984 +BRDA:222,0,0,78254 +BRDA:222,0,1,2730 +BRDA:234,0,0,1104 +BRDA:234,0,1,70 +BRDA:274,0,0,79536 +BRDA:274,0,1,1178 +BRDA:277,0,0,36 +BRDA:277,0,1,79500 +BRDA:280,0,0,20 +BRDA:280,0,1,79480 +BRDA:284,0,0,78274 +BRDA:284,0,1,1206 +BRDA:296,0,0,1104 +BRDA:296,0,1,74 +BRDA:321,0,0,36 +BRDA:321,0,1,82 +BRDA:339,0,0,56 +BRDA:339,0,1,50 +BRDA:364,0,0,13256 +BRDA:364,0,1,210 +BRDA:367,0,0,72 +BRDA:367,0,1,13184 +BRDA:371,0,0,84 +BRDA:371,0,1,13100 +BRDA:374,0,0,24 +BRDA:374,0,1,13076 +BRDA:377,0,0,24 +BRDA:377,0,1,13052 +BRDA:381,0,0,12894 +BRDA:381,0,1,158 +BRDA:381,1,2,18 +BRDA:381,1,3,140 +BRDA:392,0,0,170 +BRDA:392,0,1,40 +BRF:74 +BRH:74 +LF:265 +LH:265 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/bn254.cpp +FN:12,_ZN6evmmax5bn2548validateERKNS_3ecc11AffinePointINS0_5CurveEEE +FN:20,_ZN6evmmax5bn2543mulERKNS_3ecc11AffinePointINS0_5CurveEEERKN4intx4uintILj256EEE +FNDA:12104,_ZN6evmmax5bn2548validateERKNS_3ecc11AffinePointINS0_5CurveEEE +FNDA:4626,_ZN6evmmax5bn2543mulERKNS_3ecc11AffinePointINS0_5CurveEEERKN4intx4uintILj256EEE +FNF:2 +FNH:2 +DA:12,12104 +DA:13,12104 +DA:14,12104 +DA:15,12104 +DA:16,12104 +DA:17,12104 +DA:20,4626 +DA:21,4626 +DA:22,4626 +DA:23,4626 +BRDA:16,0,0,5580 +BRDA:16,0,1,6524 +BRDA:16,1,2,4354 +BRDA:16,1,3,2170 +BRF:4 +BRH:4 +LF:10 +LH:10 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/ecc.hpp +FN:135,_ZN6evmmax3ecc11AffinePointINS_5bn2545CurveEE10from_bytesESt4spanIKhLm64EE +FN:42,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEE10from_bytesESt4spanIKhLm32EE +FN:37,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEEC2EN4intx4uintILj256EEE +FN:120,_ZN6evmmax3ecc11AffinePointINS_5bn2545CurveEEC2ERKNS0_12FieldElementIS3_EES8_ +FN:142,_ZNK6evmmax3ecc11AffinePointINS_5bn2545CurveEE8to_bytesESt4spanIhLm64EE +FN:48,_ZNK6evmmax3ecc12FieldElementINS_5bn2545CurveEE8to_bytesESt4spanIhLm32EE +FN:39,_ZNK6evmmax3ecc12FieldElementINS_5bn2545CurveEE5valueEv +FN:227,_ZN6evmmax3ecc3addINS_5bn2545CurveEEENS0_11AffinePointIT_EERKS6_S8_ +FN:130,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_5bn2545CurveEEENS0_8ConstantILi0EEE +FN:127,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_5bn2545CurveEEES6_ +FN:56,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FN:71,_ZN6evmmax3eccmiERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FN:93,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEE4wrapERKN4intx4uintILj256EEE +FN:35,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEEC2Ev +FN:58,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_5bn2545CurveEEENS0_8ConstantILi0EEE +FN:119,_ZN6evmmax3ecc11AffinePointINS_5bn2545CurveEEC2Ev +FN:61,_ZN6evmmax3eccmlERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FN:66,_ZN6evmmax3eccplERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FN:86,_ZN6evmmax3eccdvERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FN:425,_ZN6evmmax3ecc3mulINS_5bn2545CurveEEENS0_9ProjPointIT_EERKNS0_11AffinePointIS5_EENS5_9uint_typeE +FN:159,_ZN6evmmax3ecc9ProjPointINS_5bn2545CurveEEC2Ev +FN:361,_ZN6evmmax3ecc3dblINS_5bn2545CurveEEENS0_9ProjPointIT_EERKS6_ +FN:160,_ZN6evmmax3ecc9ProjPointINS_5bn2545CurveEEC2ERKNS0_12FieldElementIS3_EES8_S8_ +FN:318,_ZN6evmmax3ecc3addINS_5bn2545CurveEEENS0_9ProjPointIT_EERKS6_RKNS0_11AffinePointIS5_EE +FN:163,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_5bn2545CurveEEENS0_8ConstantILi0EEE +FN:161,_ZN6evmmax3ecc9ProjPointINS_5bn2545CurveEEC2ERKNS0_11AffinePointIS3_EE +FN:214,_ZN6evmmax3ecc9to_affineINS_5bn2545CurveEEENS0_11AffinePointIT_EERKNS0_9ProjPointIS5_EE +FN:81,_ZN6evmmax3eccdvENS0_8ConstantILi1EEERKNS0_12FieldElementINS_5bn2545CurveEEE +FN:203,_ZN6evmmax3ecc8JacPointINS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEEE4fromERKNS0_5PointIS5_EE +FN:189,_ZN6evmmax3ecceqERKNS0_8JacPointINS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEEEES8_ +FN:107,_ZN6evmmax3eccngERKNS0_5PointINS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEEEE +FN:142,_ZNK6evmmax3ecc11AffinePointINS_9secp256k15CurveEE8to_bytesESt4spanIhLm64EE +FN:48,_ZNK6evmmax3ecc12FieldElementINS_9secp256k15CurveEE8to_bytesESt4spanIhLm32EE +FN:39,_ZNK6evmmax3ecc12FieldElementINS_9secp256k15CurveEE5valueEv +FN:93,_ZN6evmmax3ecc12FieldElementINS_9secp256k15CurveEE4wrapERKN4intx4uintILj256EEE +FN:35,_ZN6evmmax3ecc12FieldElementINS_9secp256k15CurveEEC2Ev +FN:120,_ZN6evmmax3ecc11AffinePointINS_9secp256k15CurveEEC2ERKNS0_12FieldElementIS3_EES8_ +FN:130,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256k15CurveEEENS0_8ConstantILi0EEE +FN:127,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256k15CurveEEES6_ +FN:56,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FN:119,_ZN6evmmax3ecc11AffinePointINS_9secp256k15CurveEEC2Ev +FN:425,_ZN6evmmax3ecc3mulINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKNS0_11AffinePointIS5_EENS5_9uint_typeE +FN:159,_ZN6evmmax3ecc9ProjPointINS_9secp256k15CurveEEC2Ev +FN:37,_ZN6evmmax3ecc12FieldElementINS_9secp256k15CurveEEC2EN4intx4uintILj256EEE +FN:361,_ZN6evmmax3ecc3dblINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKS6_ +FN:61,_ZN6evmmax3eccmlERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FN:66,_ZN6evmmax3eccplERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FN:71,_ZN6evmmax3eccmiERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FN:160,_ZN6evmmax3ecc9ProjPointINS_9secp256k15CurveEEC2ERKNS0_12FieldElementIS3_EES8_S8_ +FN:318,_ZN6evmmax3ecc3addINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKS6_RKNS0_11AffinePointIS5_EE +FN:163,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256k15CurveEEENS0_8ConstantILi0EEE +FN:58,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256k15CurveEEENS0_8ConstantILi0EEE +FN:161,_ZN6evmmax3ecc9ProjPointINS_9secp256k15CurveEEC2ERKNS0_11AffinePointIS3_EE +FN:264,_ZN6evmmax3ecc3addINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKS6_S8_ +FN:166,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256k15CurveEEES6_ +FN:214,_ZN6evmmax3ecc9to_affineINS_9secp256k15CurveEEENS0_11AffinePointIT_EERKNS0_9ProjPointIS5_EE +FN:81,_ZN6evmmax3eccdvENS0_8ConstantILi1EEERKNS0_12FieldElementINS_9secp256k15CurveEEE +FN:37,_ZN6evmmax3ecc12FieldElementINS_9secp256r15CurveEEC2EN4intx4uintILj256EEE +FN:120,_ZN6evmmax3ecc11AffinePointINS_9secp256r15CurveEEC2ERKNS0_12FieldElementIS3_EES8_ +FN:130,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256r15CurveEEENS0_8ConstantILi0EEE +FN:127,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256r15CurveEEES6_ +FN:56,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FN:119,_ZN6evmmax3ecc11AffinePointINS_9secp256r15CurveEEC2Ev +FN:35,_ZN6evmmax3ecc12FieldElementINS_9secp256r15CurveEEC2Ev +FN:61,_ZN6evmmax3eccmlERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FN:93,_ZN6evmmax3ecc12FieldElementINS_9secp256r15CurveEE4wrapERKN4intx4uintILj256EEE +FN:66,_ZN6evmmax3eccplERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FN:39,_ZNK6evmmax3ecc12FieldElementINS_9secp256r15CurveEE5valueEv +FN:425,_ZN6evmmax3ecc3mulINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKNS0_11AffinePointIS5_EENS5_9uint_typeE +FN:159,_ZN6evmmax3ecc9ProjPointINS_9secp256r15CurveEEC2Ev +FN:361,_ZN6evmmax3ecc3dblINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKS6_ +FN:71,_ZN6evmmax3eccmiERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FN:160,_ZN6evmmax3ecc9ProjPointINS_9secp256r15CurveEEC2ERKNS0_12FieldElementIS3_EES8_S8_ +FN:318,_ZN6evmmax3ecc3addINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKS6_RKNS0_11AffinePointIS5_EE +FN:163,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256r15CurveEEENS0_8ConstantILi0EEE +FN:58,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256r15CurveEEENS0_8ConstantILi0EEE +FN:161,_ZN6evmmax3ecc9ProjPointINS_9secp256r15CurveEEC2ERKNS0_11AffinePointIS3_EE +FN:264,_ZN6evmmax3ecc3addINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKS6_S8_ +FN:166,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256r15CurveEEES6_ +FN:214,_ZN6evmmax3ecc9to_affineINS_9secp256r15CurveEEENS0_11AffinePointIT_EERKNS0_9ProjPointIS5_EE +FN:81,_ZN6evmmax3eccdvENS0_8ConstantILi1EEERKNS0_12FieldElementINS_9secp256r15CurveEEE +FNDA:12364,_ZN6evmmax3ecc11AffinePointINS_5bn2545CurveEE10from_bytesESt4spanIKhLm64EE +FNDA:24728,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEE10from_bytesESt4spanIKhLm32EE +FNDA:31406,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEEC2EN4intx4uintILj256EEE +FNDA:17878,_ZN6evmmax3ecc11AffinePointINS_5bn2545CurveEEC2ERKNS0_12FieldElementIS3_EES8_ +FNDA:7244,_ZNK6evmmax3ecc11AffinePointINS_5bn2545CurveEE8to_bytesESt4spanIhLm64EE +FNDA:14488,_ZNK6evmmax3ecc12FieldElementINS_5bn2545CurveEE8to_bytesESt4spanIhLm32EE +FNDA:14488,_ZNK6evmmax3ecc12FieldElementINS_5bn2545CurveEE5valueEv +FNDA:2618,_ZN6evmmax3ecc3addINS_5bn2545CurveEEENS0_11AffinePointIT_EERKS6_S8_ +FNDA:138820,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_5bn2545CurveEEENS0_8ConstantILi0EEE +FNDA:231142,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_5bn2545CurveEEES6_ +FNDA:197562,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FNDA:2100138,_ZN6evmmax3eccmiERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FNDA:9864212,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEE4wrapERKN4intx4uintILj256EEE +FNDA:10151392,_ZN6evmmax3ecc12FieldElementINS_5bn2545CurveEEC2Ev +FNDA:90048,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_5bn2545CurveEEENS0_8ConstantILi0EEE +FNDA:138964,_ZN6evmmax3ecc11AffinePointINS_5bn2545CurveEEC2Ev +FNDA:3213810,_ZN6evmmax3eccmlERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FNDA:4544750,_ZN6evmmax3eccplERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FNDA:888,_ZN6evmmax3eccdvERKNS0_12FieldElementINS_5bn2545CurveEEES6_ +FNDA:4626,_ZN6evmmax3ecc3mulINS_5bn2545CurveEEENS0_9ProjPointIT_EERKNS0_11AffinePointIS5_EENS5_9uint_typeE +FNDA:4626,_ZN6evmmax3ecc9ProjPointINS_5bn2545CurveEEC2Ev +FNDA:315354,_ZN6evmmax3ecc3dblINS_5bn2545CurveEEENS0_9ProjPointIT_EERKS6_ +FNDA:401646,_ZN6evmmax3ecc9ProjPointINS_5bn2545CurveEEC2ERKNS0_12FieldElementIS3_EES8_S8_ +FNDA:128088,_ZN6evmmax3ecc3addINS_5bn2545CurveEEENS0_9ProjPointIT_EERKS6_RKNS0_11AffinePointIS5_EE +FNDA:88344,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_5bn2545CurveEEENS0_8ConstantILi0EEE +FNDA:2052,_ZN6evmmax3ecc9ProjPointINS_5bn2545CurveEEC2ERKNS0_11AffinePointIS3_EE +FNDA:4626,_ZN6evmmax3ecc9to_affineINS_5bn2545CurveEEENS0_11AffinePointIT_EERKNS0_9ProjPointIS5_EE +FNDA:4626,_ZN6evmmax3eccdvENS0_8ConstantILi1EEERKNS0_12FieldElementINS_5bn2545CurveEEE +FNDA:2520,_ZN6evmmax3ecc8JacPointINS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEEE4fromERKNS0_5PointIS5_EE +FNDA:1518,_ZN6evmmax3ecceqERKNS0_8JacPointINS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEEEES8_ +FNDA:2004,_ZN6evmmax3eccngERKNS0_5PointINS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEEEE +FNDA:832,_ZNK6evmmax3ecc11AffinePointINS_9secp256k15CurveEE8to_bytesESt4spanIhLm64EE +FNDA:1664,_ZNK6evmmax3ecc12FieldElementINS_9secp256k15CurveEE8to_bytesESt4spanIhLm32EE +FNDA:1664,_ZNK6evmmax3ecc12FieldElementINS_9secp256k15CurveEE5valueEv +FNDA:12400894,_ZN6evmmax3ecc12FieldElementINS_9secp256k15CurveEE4wrapERKN4intx4uintILj256EEE +FNDA:12739230,_ZN6evmmax3ecc12FieldElementINS_9secp256k15CurveEEC2Ev +FNDA:1780,_ZN6evmmax3ecc11AffinePointINS_9secp256k15CurveEEC2ERKNS0_12FieldElementIS3_EES8_ +FNDA:167388,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256k15CurveEEENS0_8ConstantILi0EEE +FNDA:167504,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256k15CurveEEES6_ +FNDA:168062,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FNDA:167388,_ZN6evmmax3ecc11AffinePointINS_9secp256k15CurveEEC2Ev +FNDA:1780,_ZN6evmmax3ecc3mulINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKNS0_11AffinePointIS5_EENS5_9uint_typeE +FNDA:1780,_ZN6evmmax3ecc9ProjPointINS_9secp256k15CurveEEC2Ev +FNDA:3150,_ZN6evmmax3ecc12FieldElementINS_9secp256k15CurveEEC2EN4intx4uintILj256EEE +FNDA:349978,_ZN6evmmax3ecc3dblINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKS6_ +FNDA:4279398,_ZN6evmmax3eccmlERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FNDA:5375756,_ZN6evmmax3eccplERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FNDA:2743070,_ZN6evmmax3eccmiERKNS0_12FieldElementINS_9secp256k15CurveEEES6_ +FNDA:515508,_ZN6evmmax3ecc9ProjPointINS_9secp256k15CurveEEC2ERKNS0_12FieldElementIS3_EES8_S8_ +FNDA:166498,_ZN6evmmax3ecc3addINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKS6_RKNS0_11AffinePointIS5_EE +FNDA:167868,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256k15CurveEEENS0_8ConstantILi0EEE +FNDA:167868,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256k15CurveEEENS0_8ConstantILi0EEE +FNDA:1370,_ZN6evmmax3ecc9ProjPointINS_9secp256k15CurveEEC2ERKNS0_11AffinePointIS3_EE +FNDA:890,_ZN6evmmax3ecc3addINS_9secp256k15CurveEEENS0_9ProjPointIT_EERKS6_S8_ +FNDA:480,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256k15CurveEEES6_ +FNDA:890,_ZN6evmmax3ecc9to_affineINS_9secp256k15CurveEEENS0_11AffinePointIT_EERKNS0_9ProjPointIS5_EE +FNDA:890,_ZN6evmmax3eccdvENS0_8ConstantILi1EEERKNS0_12FieldElementINS_9secp256k15CurveEEE +FNDA:3444,_ZN6evmmax3ecc12FieldElementINS_9secp256r15CurveEEC2EN4intx4uintILj256EEE +FNDA:1170,_ZN6evmmax3ecc11AffinePointINS_9secp256r15CurveEEC2ERKNS0_12FieldElementIS3_EES8_ +FNDA:137656,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256r15CurveEEENS0_8ConstantILi0EEE +FNDA:138072,_ZN6evmmax3ecceqERKNS0_11AffinePointINS_9secp256r15CurveEEES6_ +FNDA:139260,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FNDA:137656,_ZN6evmmax3ecc11AffinePointINS_9secp256r15CurveEEC2Ev +FNDA:12595416,_ZN6evmmax3ecc12FieldElementINS_9secp256r15CurveEEC2Ev +FNDA:3638778,_ZN6evmmax3eccmlERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FNDA:12317880,_ZN6evmmax3ecc12FieldElementINS_9secp256r15CurveEE4wrapERKN4intx4uintILj256EEE +FNDA:6264542,_ZN6evmmax3eccplERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FNDA:556,_ZNK6evmmax3ecc12FieldElementINS_9secp256r15CurveEE5valueEv +FNDA:1112,_ZN6evmmax3ecc3mulINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKNS0_11AffinePointIS5_EENS5_9uint_typeE +FNDA:1112,_ZN6evmmax3ecc9ProjPointINS_9secp256r15CurveEEC2Ev +FNDA:265862,_ZN6evmmax3ecc3dblINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKS6_ +FNDA:2414004,_ZN6evmmax3eccmiERKNS0_12FieldElementINS_9secp256r15CurveEEES6_ +FNDA:402334,_ZN6evmmax3ecc9ProjPointINS_9secp256r15CurveEEC2ERKNS0_12FieldElementIS3_EES8_S8_ +FNDA:137042,_ZN6evmmax3ecc3addINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKS6_RKNS0_11AffinePointIS5_EE +FNDA:138146,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256r15CurveEEENS0_8ConstantILi0EEE +FNDA:138146,_ZN6evmmax3ecceqERKNS0_12FieldElementINS_9secp256r15CurveEEENS0_8ConstantILi0EEE +FNDA:1104,_ZN6evmmax3ecc9ProjPointINS_9secp256r15CurveEEC2ERKNS0_11AffinePointIS3_EE +FNDA:556,_ZN6evmmax3ecc3addINS_9secp256r15CurveEEENS0_9ProjPointIT_EERKS6_S8_ +FNDA:548,_ZN6evmmax3ecceqERKNS0_9ProjPointINS_9secp256r15CurveEEES6_ +FNDA:556,_ZN6evmmax3ecc9to_affineINS_9secp256r15CurveEEENS0_11AffinePointIT_EERKNS0_9ProjPointIS5_EE +FNDA:556,_ZN6evmmax3eccdvENS0_8ConstantILi1EEERKNS0_12FieldElementINS_9secp256r15CurveEEE +FNF:33 +FNH:33 +DA:35,35486038 +DA:37,38000 +DA:39,16708 +DA:42,24728 +DA:44,24728 +DA:45,24728 +DA:48,16152 +DA:50,16152 +DA:51,16152 +DA:56,504884 +DA:58,396062 +DA:61,11131986 +DA:62,11131986 +DA:63,11131986 +DA:66,16185048 +DA:67,16185048 +DA:68,16185048 +DA:71,7257212 +DA:72,7257212 +DA:73,7257212 +DA:81,6072 +DA:82,6072 +DA:83,6072 +DA:86,888 +DA:87,888 +DA:88,888 +DA:93,34582986 +DA:94,34582986 +DA:95,34582986 +DA:96,34582986 +DA:97,34582986 +DA:107,2004 +DA:119,444008 +DA:120,20828 +DA:127,1610154 +DA:130,443864 +DA:131,443864 +DA:132,443864 +DA:135,12364 +DA:136,12364 +DA:137,12364 +DA:138,12364 +DA:139,12364 +DA:142,8076 +DA:143,8076 +DA:144,8076 +DA:145,8076 +DA:159,7518 +DA:160,1319488 +DA:161,4526 +DA:163,394358 +DA:166,1028 +DA:167,1028 +DA:168,1028 +DA:169,1028 +DA:170,1028 +DA:171,1028 +DA:172,1028 +DA:173,1028 +DA:174,1028 +DA:189,1518 +DA:190,1518 +DA:191,1518 +DA:193,1518 +DA:194,1518 +DA:196,1518 +DA:197,1518 +DA:203,2520 +DA:204,2520 +DA:205,2520 +DA:214,6072 +DA:216,6072 +DA:217,6072 +DA:218,6072 +DA:219,6072 +DA:220,6072 +DA:227,2618 +DA:228,2618 +DA:229,1028 +DA:230,1590 +DA:231,558 +DA:233,1032 +DA:234,1032 +DA:239,1032 +DA:240,1032 +DA:241,1032 +DA:242,672 +DA:243,672 +DA:244,144 +DA:247,528 +DA:248,528 +DA:249,528 +DA:250,528 +DA:251,888 +DA:253,888 +DA:254,888 +DA:255,888 +DA:256,1032 +DA:264,1446 +DA:265,1446 +DA:266,418 +DA:267,1028 +DA:269,0 +DA:271,1028 +DA:272,92 +DA:281,936 +DA:282,936 +DA:284,936 +DA:285,936 +DA:286,936 +DA:287,936 +DA:288,936 +DA:289,936 +DA:290,936 +DA:291,936 +DA:292,936 +DA:293,936 +DA:294,936 +DA:295,936 +DA:296,936 +DA:297,936 +DA:298,936 +DA:299,936 +DA:300,936 +DA:301,936 +DA:302,936 +DA:303,936 +DA:304,936 +DA:305,936 +DA:306,936 +DA:307,936 +DA:309,936 +DA:310,1028 +DA:318,431628 +DA:319,431628 +DA:321,431628 +DA:323,39744 +DA:324,391884 +DA:325,4526 +DA:330,387358 +DA:331,387358 +DA:333,387358 +DA:334,387358 +DA:335,387358 +DA:336,387358 +DA:337,387358 +DA:338,387358 +DA:339,387358 +DA:340,387358 +DA:341,387358 +DA:342,387358 +DA:343,387358 +DA:344,387358 +DA:345,387358 +DA:346,387358 +DA:347,387358 +DA:348,387358 +DA:349,387358 +DA:350,387358 +DA:351,387358 +DA:352,387358 +DA:353,387358 +DA:354,387358 +DA:356,387358 +DA:357,391884 +DA:361,931194 +DA:362,931194 +DA:365,665332 +DA:369,665332 +DA:370,665332 +DA:371,665332 +DA:372,665332 +DA:373,665332 +DA:374,665332 +DA:375,665332 +DA:376,665332 +DA:377,665332 +DA:378,665332 +DA:379,665332 +DA:380,665332 +DA:381,665332 +DA:382,665332 +DA:383,665332 +DA:384,665332 +DA:385,665332 +DA:386,665332 +DA:387,665332 +DA:390,265862 +DA:394,265862 +DA:395,265862 +DA:396,265862 +DA:397,265862 +DA:398,265862 +DA:399,265862 +DA:400,265862 +DA:401,265862 +DA:402,265862 +DA:403,265862 +DA:404,265862 +DA:405,265862 +DA:406,265862 +DA:407,265862 +DA:408,265862 +DA:409,265862 +DA:410,265862 +DA:411,265862 +DA:412,265862 +DA:413,265862 +DA:414,265862 +DA:421,931194 +DA:425,7518 +DA:426,7518 +DA:430,10104 +DA:431,10104 +DA:432,10104 +DA:433,10104 +DA:434,7518 +DA:436,2586 +DA:437,2586 +DA:439,7518 +DA:440,7518 +DA:441,938620 +DA:442,931102 +DA:443,931102 +DA:444,931102 +DA:445,431628 +DA:446,931102 +DA:447,7518 +DA:448,7518 +BRDA:127,0,0,231142 +BRDA:127,0,1,0 +BRDA:127,1,2,231142 +BRDA:127,1,3,0 +BRDA:127,2,4,138072 +BRDA:127,2,5,0 +BRDA:127,3,6,138072 +BRDA:127,3,7,0 +BRDA:127,4,8,167504 +BRDA:127,4,9,0 +BRDA:127,5,10,167504 +BRDA:127,5,11,0 +BRDA:173,0,0,38 +BRDA:173,0,1,510 +BRDA:173,1,2,136 +BRDA:173,1,3,344 +BRDA:173,2,4,14 +BRDA:173,2,5,24 +BRDA:173,3,6,78 +BRDA:173,3,7,58 +BRDA:196,0,0,1044 +BRDA:196,0,1,474 +BRDA:196,1,2,1044 +BRDA:196,1,3,0 +BRDA:228,0,0,1028 +BRDA:228,0,1,1590 +BRDA:230,0,0,558 +BRDA:230,0,1,1032 +BRDA:241,0,0,672 +BRDA:241,0,1,360 +BRDA:243,0,0,144 +BRDA:243,0,1,528 +BRDA:265,0,0,8 +BRDA:265,0,1,548 +BRDA:265,1,2,410 +BRDA:265,1,3,480 +BRDA:267,0,0,0 +BRDA:267,0,1,548 +BRDA:267,1,2,0 +BRDA:267,1,3,480 +BRDA:271,0,0,14 +BRDA:271,0,1,534 +BRDA:271,1,2,78 +BRDA:271,1,3,402 +BRDA:321,0,0,39744 +BRDA:321,0,1,88344 +BRDA:321,1,2,0 +BRDA:321,1,3,137042 +BRDA:321,2,4,0 +BRDA:321,2,5,166498 +BRDA:324,0,0,1370 +BRDA:324,0,1,165128 +BRDA:324,1,2,1104 +BRDA:324,1,3,135938 +BRDA:324,2,4,2052 +BRDA:324,2,5,86292 +BRDA:430,0,0,7212 +BRDA:430,0,1,0 +BRDA:430,1,2,1112 +BRDA:430,1,3,0 +BRDA:430,2,4,1780 +BRDA:430,2,5,0 +BRDA:433,0,0,4626 +BRDA:433,0,1,2586 +BRDA:433,1,2,1112 +BRDA:433,1,3,0 +BRDA:433,2,4,1780 +BRDA:433,2,5,0 +BRDA:441,0,0,315354 +BRDA:441,0,1,4626 +BRDA:441,1,2,265848 +BRDA:441,1,3,1112 +BRDA:441,2,4,349900 +BRDA:441,2,5,1780 +BRDA:444,0,0,128088 +BRDA:444,0,1,187266 +BRDA:444,1,2,137042 +BRDA:444,1,3,128806 +BRDA:444,2,4,166498 +BRDA:444,2,5,183402 +BRF:35 +BRH:33 +LF:209 +LH:208 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/keccak.c +FN:306,keccak.c:select_keccakf1600_implementation +FN:375,ethash_keccak256 +FN:301,keccak.c:keccakf1600_bmi +FN:77,keccak.c:keccakf1600_implementation +FN:53,keccak.c:rol +FN:290,keccak.c:keccakf1600_generic +FN:321,keccak.c:keccak +FN:39,keccak.c:load_le +FNDA:4,keccak.c:select_keccakf1600_implementation +FNDA:44054883,ethash_keccak256 +FNDA:64450400,keccak.c:keccakf1600_bmi +FNDA:64450400,keccak.c:keccakf1600_implementation +FNDA:44857478400,keccak.c:rol +FNDA:0,keccak.c:keccakf1600_generic +FNDA:44054883,keccak.c:keccak +FNDA:613383105,keccak.c:load_le +FNF:8 +FNH:7 +DA:34,833657520 +DA:39,613383105 +DA:45,613383105 +DA:46,613383105 +DA:47,613383105 +DA:48,613383105 +DA:53,44857478400 +DA:54,44857478400 +DA:55,44857478400 +DA:77,64450400 +DA:78,64450400 +DA:79,64450400 +DA:80,64450400 +DA:81,64450400 +DA:82,64450400 +DA:84,64450400 +DA:85,64450400 +DA:86,64450400 +DA:87,64450400 +DA:88,64450400 +DA:90,64450400 +DA:92,64450400 +DA:94,64450400 +DA:95,64450400 +DA:96,64450400 +DA:97,64450400 +DA:98,64450400 +DA:99,64450400 +DA:100,64450400 +DA:101,64450400 +DA:102,64450400 +DA:103,64450400 +DA:104,64450400 +DA:105,64450400 +DA:106,64450400 +DA:107,64450400 +DA:108,64450400 +DA:109,64450400 +DA:110,64450400 +DA:111,64450400 +DA:112,64450400 +DA:113,64450400 +DA:114,64450400 +DA:115,64450400 +DA:116,64450400 +DA:117,64450400 +DA:118,64450400 +DA:120,837855200 +DA:121,773404800 +DA:124,773404800 +DA:125,773404800 +DA:126,773404800 +DA:127,773404800 +DA:128,773404800 +DA:130,773404800 +DA:131,773404800 +DA:132,773404800 +DA:133,773404800 +DA:134,773404800 +DA:136,773404800 +DA:137,773404800 +DA:138,773404800 +DA:139,773404800 +DA:140,773404800 +DA:141,773404800 +DA:142,773404800 +DA:143,773404800 +DA:144,773404800 +DA:145,773404800 +DA:147,773404800 +DA:148,773404800 +DA:149,773404800 +DA:150,773404800 +DA:151,773404800 +DA:152,773404800 +DA:153,773404800 +DA:154,773404800 +DA:155,773404800 +DA:156,773404800 +DA:158,773404800 +DA:159,773404800 +DA:160,773404800 +DA:161,773404800 +DA:162,773404800 +DA:163,773404800 +DA:164,773404800 +DA:165,773404800 +DA:166,773404800 +DA:167,773404800 +DA:169,773404800 +DA:170,773404800 +DA:171,773404800 +DA:172,773404800 +DA:173,773404800 +DA:174,773404800 +DA:175,773404800 +DA:176,773404800 +DA:177,773404800 +DA:178,773404800 +DA:180,773404800 +DA:181,773404800 +DA:182,773404800 +DA:183,773404800 +DA:184,773404800 +DA:185,773404800 +DA:186,773404800 +DA:187,773404800 +DA:188,773404800 +DA:189,773404800 +DA:194,773404800 +DA:195,773404800 +DA:196,773404800 +DA:197,773404800 +DA:198,773404800 +DA:200,773404800 +DA:201,773404800 +DA:202,773404800 +DA:203,773404800 +DA:204,773404800 +DA:206,773404800 +DA:207,773404800 +DA:208,773404800 +DA:209,773404800 +DA:210,773404800 +DA:211,773404800 +DA:212,773404800 +DA:213,773404800 +DA:214,773404800 +DA:215,773404800 +DA:217,773404800 +DA:218,773404800 +DA:219,773404800 +DA:220,773404800 +DA:221,773404800 +DA:222,773404800 +DA:223,773404800 +DA:224,773404800 +DA:225,773404800 +DA:226,773404800 +DA:228,773404800 +DA:229,773404800 +DA:230,773404800 +DA:231,773404800 +DA:232,773404800 +DA:233,773404800 +DA:234,773404800 +DA:235,773404800 +DA:236,773404800 +DA:237,773404800 +DA:239,773404800 +DA:240,773404800 +DA:241,773404800 +DA:242,773404800 +DA:243,773404800 +DA:244,773404800 +DA:245,773404800 +DA:246,773404800 +DA:247,773404800 +DA:248,773404800 +DA:250,773404800 +DA:251,773404800 +DA:252,773404800 +DA:253,773404800 +DA:254,773404800 +DA:255,773404800 +DA:256,773404800 +DA:257,773404800 +DA:258,773404800 +DA:259,773404800 +DA:260,773404800 +DA:262,64450400 +DA:263,64450400 +DA:264,64450400 +DA:265,64450400 +DA:266,64450400 +DA:267,64450400 +DA:268,64450400 +DA:269,64450400 +DA:270,64450400 +DA:271,64450400 +DA:272,64450400 +DA:273,64450400 +DA:274,64450400 +DA:275,64450400 +DA:276,64450400 +DA:277,64450400 +DA:278,64450400 +DA:279,64450400 +DA:280,64450400 +DA:281,64450400 +DA:282,64450400 +DA:283,64450400 +DA:284,64450400 +DA:285,64450400 +DA:286,64450400 +DA:287,64450400 +DA:290,0 +DA:291,0 +DA:292,0 +DA:301,64450400 +DA:302,64450400 +DA:303,64450400 +DA:306,4 +DA:309,4 +DA:313,4 +DA:314,4 +DA:315,4 +DA:321,44054883 +DA:322,44054883 +DA:323,44054883 +DA:324,44054883 +DA:326,44054883 +DA:327,44054883 +DA:328,44054883 +DA:329,44054883 +DA:331,44054883 +DA:333,64450400 +DA:334,20395517 +DA:335,367119306 +DA:336,346723789 +DA:337,346723789 +DA:338,346723789 +DA:339,346723789 +DA:341,20395517 +DA:343,20395517 +DA:344,20395517 +DA:346,44054883 +DA:348,310714199 +DA:349,266659316 +DA:350,266659316 +DA:351,266659316 +DA:352,266659316 +DA:353,266659316 +DA:354,266659316 +DA:356,157544128 +DA:357,113489245 +DA:358,113489245 +DA:359,113489245 +DA:360,113489245 +DA:361,113489245 +DA:362,113489245 +DA:363,44054883 +DA:364,44054883 +DA:366,44054883 +DA:368,44054883 +DA:370,220274415 +DA:371,176219532 +DA:372,44054883 +DA:375,44054883 +DA:376,44054883 +DA:377,44054883 +DA:378,44054883 +DA:379,44054883 +BRDA:120,0,0,773404800 +BRDA:120,0,1,64450400 +BRDA:313,0,0,4 +BRDA:313,0,1,0 +BRDA:313,1,2,4 +BRDA:313,1,3,0 +BRDA:333,0,0,20395517 +BRDA:333,0,1,44054883 +BRDA:335,0,0,346723789 +BRDA:335,0,1,20395517 +BRDA:348,0,0,266659316 +BRDA:348,0,1,44054883 +BRDA:356,0,0,113489245 +BRDA:356,0,1,44054883 +BRDA:370,0,0,176219532 +BRDA:370,0,1,44054883 +BRF:16 +BRH:14 +LF:252 +LH:249 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/keccak.hpp +FN:12,_ZN6ethash9keccak256EPKhm +FNDA:44054883,_ZN6ethash9keccak256EPKhm +FNF:1 +FNH:1 +DA:12,44054883 +DA:13,44054883 +DA:14,44054883 +BRF:0 +BRH:0 +LF:3 +LH:3 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/kzg.cpp +FN:126,_ZN6evmone6crypto16kzg_verify_proofEPKSt4byteS3_S3_S3_S3_ +FN:57,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_115validate_scalarESt4spanIKSt4byteLm32EE +FN:65,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_111validate_G1ESt4spanIKSt4byteLm48EE +FN:89,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_14multERK7blst_p1RK11blst_scalar +FN:80,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_113add_or_doubleERK14blst_p1_affineRK7blst_p1 +FN:107,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_14multERK7blst_p2RK11blst_scalar +FN:98,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_113add_or_doubleERK14blst_p2_affineRK7blst_p2 +FN:115,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_115pairings_verifyERK14blst_p1_affineS4_RK14blst_p2_affine +FNDA:906,_ZN6evmone6crypto16kzg_verify_proofEPKSt4byteS3_S3_S3_S3_ +FNDA:1734,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_115validate_scalarESt4spanIKSt4byteLm32EE +FNDA:1626,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_111validate_G1ESt4spanIKSt4byteLm48EE +FNDA:792,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_14multERK7blst_p1RK11blst_scalar +FNDA:792,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_113add_or_doubleERK14blst_p1_affineRK7blst_p1 +FNDA:792,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_14multERK7blst_p2RK11blst_scalar +FNDA:792,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_113add_or_doubleERK14blst_p2_affineRK7blst_p2 +FNDA:792,kzg.cpp:_ZN6evmone6crypto12_GLOBAL__N_115pairings_verifyERK14blst_p1_affineS4_RK14blst_p2_affine +FNF:8 +FNH:8 +DA:57,1734 +DA:58,1734 +DA:59,1734 +DA:60,1734 +DA:61,1734 +DA:65,1626 +DA:66,1626 +DA:67,1626 +DA:68,18 +DA:72,1608 +DA:73,12 +DA:74,1596 +DA:75,1608 +DA:80,792 +DA:81,792 +DA:82,792 +DA:83,792 +DA:84,792 +DA:85,792 +DA:86,792 +DA:89,792 +DA:90,792 +DA:91,792 +DA:92,792 +DA:93,792 +DA:98,792 +DA:99,792 +DA:100,792 +DA:101,792 +DA:102,792 +DA:103,792 +DA:104,792 +DA:107,792 +DA:108,792 +DA:109,792 +DA:110,792 +DA:111,792 +DA:115,792 +DA:116,792 +DA:117,792 +DA:118,792 +DA:119,792 +DA:120,792 +DA:121,792 +DA:126,906 +DA:127,906 +DA:128,906 +DA:129,906 +DA:130,906 +DA:131,24 +DA:135,882 +DA:136,882 +DA:137,30 +DA:138,852 +DA:139,852 +DA:140,30 +DA:146,822 +DA:147,822 +DA:148,18 +DA:149,804 +DA:150,804 +DA:151,12 +DA:154,792 +DA:157,792 +DA:160,792 +DA:163,792 +DA:166,792 +DA:167,804 +BRDA:60,0,0,1674 +BRDA:60,0,1,60 +BRDA:67,0,0,18 +BRDA:67,0,1,1608 +BRDA:72,0,0,12 +BRDA:72,0,1,1596 +BRDA:130,0,0,24 +BRDA:130,0,1,882 +BRDA:136,0,0,30 +BRDA:136,0,1,852 +BRDA:139,0,0,30 +BRDA:139,0,1,822 +BRDA:147,0,0,18 +BRDA:147,0,1,804 +BRDA:150,0,0,12 +BRDA:150,0,1,792 +BRF:16 +BRH:16 +LF:68 +LH:68 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/modexp.cpp +FN:152,_ZN6evmone6crypto6modexpESt4spanIKhLm18446744073709551615EES3_S3_Ph +FN:31,modexp.cpp:_ZN12_GLOBAL__N_18ExponentC2ESt4spanIKhLm18446744073709551615EE +FN:32,modexp.cpp:_ZZN12_GLOBAL__N_18ExponentC1ESt4spanIKhLm18446744073709551615EEENKUlT_E_clIhEEDaS4_ +FN:119,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm16EEEvSt4spanIKhLm18446744073709551615EENS_8ExponentES3_Ph +FN:108,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj128EEEEET_St4spanIKhLm18446744073709551615EE +FN:59,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj128EEEEET_RKS4_NS_8ExponentES6_ +FN:41,modexp.cpp:_ZNK12_GLOBAL__N_18Exponent9bit_widthEv +FN:46,modexp.cpp:_ZNK12_GLOBAL__N_18ExponentixEm +FN:76,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj128EEEEET_RKS4_NS_8ExponentEj +FN:94,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj128EEEEET_RKS4_j +FN:15,modexp.cpp:_ZN12_GLOBAL__N_15truncILj128EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FN:119,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm32EEEvSt4spanIKhLm18446744073709551615EENS_8ExponentES3_Ph +FN:108,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj256EEEEET_St4spanIKhLm18446744073709551615EE +FN:59,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj256EEEEET_RKS4_NS_8ExponentES6_ +FN:76,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj256EEEEET_RKS4_NS_8ExponentEj +FN:94,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj256EEEEET_RKS4_j +FN:15,modexp.cpp:_ZN12_GLOBAL__N_15truncILj256EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FN:119,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm64EEEvSt4spanIKhLm18446744073709551615EENS_8ExponentES3_Ph +FN:108,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj512EEEEET_St4spanIKhLm18446744073709551615EE +FN:59,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj512EEEEET_RKS4_NS_8ExponentES6_ +FN:76,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj512EEEEET_RKS4_NS_8ExponentEj +FN:94,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj512EEEEET_RKS4_j +FN:15,modexp.cpp:_ZN12_GLOBAL__N_15truncILj512EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FN:119,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm128EEEvSt4spanIKhLm18446744073709551615EENS_8ExponentES3_Ph +FN:108,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj1024EEEEET_St4spanIKhLm18446744073709551615EE +FN:59,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj1024EEEEET_RKS4_NS_8ExponentES6_ +FN:76,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj1024EEEEET_RKS4_NS_8ExponentEj +FN:94,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj1024EEEEET_RKS4_j +FN:15,modexp.cpp:_ZN12_GLOBAL__N_15truncILj1024EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FN:119,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm256EEEvSt4spanIKhLm18446744073709551615EENS_8ExponentES3_Ph +FN:108,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj2048EEEEET_St4spanIKhLm18446744073709551615EE +FN:59,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj2048EEEEET_RKS4_NS_8ExponentES6_ +FN:76,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj2048EEEEET_RKS4_NS_8ExponentEj +FN:94,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj2048EEEEET_RKS4_j +FN:15,modexp.cpp:_ZN12_GLOBAL__N_15truncILj2048EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FN:119,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm1024EEEvSt4spanIKhLm18446744073709551615EENS_8ExponentES3_Ph +FN:108,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj8192EEEEET_St4spanIKhLm18446744073709551615EE +FN:59,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj8192EEEEET_RKS4_NS_8ExponentES6_ +FN:76,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj8192EEEEET_RKS4_NS_8ExponentEj +FN:94,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj8192EEEEET_RKS4_j +FN:15,modexp.cpp:_ZN12_GLOBAL__N_15truncILj8192EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNDA:3253,_ZN6evmone6crypto6modexpESt4spanIKhLm18446744073709551615EES3_S3_Ph +FNDA:3253,modexp.cpp:_ZN12_GLOBAL__N_18ExponentC2ESt4spanIKhLm18446744073709551615EE +FNDA:67157,modexp.cpp:_ZZN12_GLOBAL__N_18ExponentC1ESt4spanIKhLm18446744073709551615EEENKUlT_E_clIhEEDaS4_ +FNDA:896,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm16EEEvSt4spanIKhLm18446744073709551615EENS_8ExponentES3_Ph +FNDA:1792,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj128EEEEET_St4spanIKhLm18446744073709551615EE +FNDA:620,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj128EEEEET_RKS4_NS_8ExponentES6_ +FNDA:4271,modexp.cpp:_ZNK12_GLOBAL__N_18Exponent9bit_widthEv +FNDA:520075,modexp.cpp:_ZNK12_GLOBAL__N_18ExponentixEm +FNDA:642,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj128EEEEET_RKS4_NS_8ExponentEj +FNDA:366,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj128EEEEET_RKS4_j +FNDA:896,modexp.cpp:_ZN12_GLOBAL__N_15truncILj128EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNDA:1226,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm32EEEvSt4spanIKhLm18446744073709551615EENS_8ExponentES3_Ph +FNDA:2452,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj256EEEEET_St4spanIKhLm18446744073709551615EE +FNDA:874,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj256EEEEET_RKS4_NS_8ExponentES6_ +FNDA:628,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj256EEEEET_RKS4_NS_8ExponentEj +FNDA:276,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj256EEEEET_RKS4_j +FNDA:1226,modexp.cpp:_ZN12_GLOBAL__N_15truncILj256EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNDA:663,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm64EEEvSt4spanIKhLm18446744073709551615EENS_8ExponentES3_Ph +FNDA:1326,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj512EEEEET_St4spanIKhLm18446744073709551615EE +FNDA:599,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj512EEEEET_RKS4_NS_8ExponentES6_ +FNDA:276,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj512EEEEET_RKS4_NS_8ExponentEj +FNDA:212,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj512EEEEET_RKS4_j +FNDA:663,modexp.cpp:_ZN12_GLOBAL__N_15truncILj512EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNDA:108,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm128EEEvSt4spanIKhLm18446744073709551615EENS_8ExponentES3_Ph +FNDA:216,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj1024EEEEET_St4spanIKhLm18446744073709551615EE +FNDA:86,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj1024EEEEET_RKS4_NS_8ExponentES6_ +FNDA:66,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj1024EEEEET_RKS4_NS_8ExponentEj +FNDA:44,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj1024EEEEET_RKS4_j +FNDA:108,modexp.cpp:_ZN12_GLOBAL__N_15truncILj1024EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNDA:136,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm256EEEvSt4spanIKhLm18446744073709551615EENS_8ExponentES3_Ph +FNDA:272,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj2048EEEEET_St4spanIKhLm18446744073709551615EE +FNDA:114,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj2048EEEEET_RKS4_NS_8ExponentES6_ +FNDA:80,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj2048EEEEET_RKS4_NS_8ExponentEj +FNDA:58,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj2048EEEEET_RKS4_j +FNDA:136,modexp.cpp:_ZN12_GLOBAL__N_15truncILj2048EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNDA:224,modexp.cpp:_ZN12_GLOBAL__N_111modexp_implILm1024EEEvSt4spanIKhLm18446744073709551615EENS_8ExponentES3_Ph +FNDA:448,modexp.cpp:_ZN12_GLOBAL__N_14loadIN4intx4uintILj8192EEEEET_St4spanIKhLm18446744073709551615EE +FNDA:200,modexp.cpp:_ZN12_GLOBAL__N_110modexp_oddIN4intx4uintILj8192EEEEET_RKS4_NS_8ExponentES6_ +FNDA:86,modexp.cpp:_ZN12_GLOBAL__N_111modexp_pow2IN4intx4uintILj8192EEEEET_RKS4_NS_8ExponentEj +FNDA:62,modexp.cpp:_ZN12_GLOBAL__N_111modinv_pow2IN4intx4uintILj8192EEEEET_RKS4_j +FNDA:224,modexp.cpp:_ZN12_GLOBAL__N_15truncILj8192EEEvSt4spanIhLm18446744073709551615EERKN4intx4uintIXT_EEE +FNF:11 +FNH:11 +DA:15,3253 +DA:16,3253 +DA:17,3253 +DA:18,3253 +DA:19,3253 +DA:31,3253 +DA:32,67157 +DA:33,3253 +DA:34,3253 +DA:35,3253 +DA:36,2611 +DA:37,3253 +DA:38,3253 +DA:41,4271 +DA:46,520075 +DA:48,520075 +DA:49,520075 +DA:50,520075 +DA:51,520075 +DA:52,520075 +DA:53,520075 +DA:54,520075 +DA:59,2493 +DA:60,2493 +DA:61,2493 +DA:63,2493 +DA:64,337744 +DA:65,335251 +DA:66,335251 +DA:67,335251 +DA:68,247055 +DA:69,335251 +DA:71,2493 +DA:72,2493 +DA:76,1778 +DA:77,1778 +DA:78,1778 +DA:79,186602 +DA:80,184824 +DA:81,184824 +DA:82,184824 +DA:83,120426 +DA:84,184824 +DA:86,1778 +DA:87,1778 +DA:88,1778 +DA:89,1778 +DA:94,1018 +DA:95,1018 +DA:96,1018 +DA:97,254722 +DA:98,253704 +DA:99,253704 +DA:100,253704 +DA:101,253704 +DA:102,253704 +DA:103,1018 +DA:104,1018 +DA:108,6506 +DA:109,6506 +DA:110,6506 +DA:111,6506 +DA:112,6506 +DA:113,6506 +DA:114,6506 +DA:119,3253 +DA:120,3253 +DA:121,3253 +DA:122,3253 +DA:124,3253 +DA:125,3253 +DA:126,1475 +DA:127,1475 +DA:128,1475 +DA:129,1778 +DA:130,760 +DA:131,760 +DA:132,760 +DA:133,1018 +DA:134,1018 +DA:135,1018 +DA:136,1018 +DA:138,1018 +DA:140,1018 +DA:141,1018 +DA:142,1018 +DA:144,3253 +DA:145,3253 +DA:152,3253 +DA:153,3253 +DA:154,3253 +DA:155,3253 +DA:157,3253 +DA:159,3253 +DA:160,896 +DA:161,2357 +DA:162,1226 +DA:163,1131 +DA:164,663 +DA:165,468 +DA:166,108 +DA:167,360 +DA:168,136 +DA:169,224 +DA:170,224 +DA:171,3253 +BRDA:34,0,0,642 +BRDA:34,0,1,2611 +BRDA:64,0,0,29434 +BRDA:64,0,1,114 +BRDA:64,1,2,734 +BRDA:64,1,3,86 +BRDA:64,2,4,39847 +BRDA:64,2,5,599 +BRDA:64,3,6,117676 +BRDA:64,3,7,874 +BRDA:64,4,8,146426 +BRDA:64,4,9,620 +BRDA:64,5,10,1134 +BRDA:64,5,11,200 +BRDA:67,0,0,180 +BRDA:67,0,1,554 +BRDA:67,1,2,109962 +BRDA:67,1,3,36464 +BRDA:67,2,4,15042 +BRDA:67,2,5,14392 +BRDA:67,3,6,328 +BRDA:67,3,7,806 +BRDA:67,4,8,90592 +BRDA:67,4,9,27084 +BRDA:67,5,10,30951 +BRDA:67,5,11,8896 +BRDA:79,0,0,123198 +BRDA:79,0,1,642 +BRDA:79,1,2,29332 +BRDA:79,1,3,80 +BRDA:79,2,4,8086 +BRDA:79,2,5,276 +BRDA:79,3,6,22824 +BRDA:79,3,7,628 +BRDA:79,4,8,724 +BRDA:79,4,9,86 +BRDA:79,5,10,660 +BRDA:79,5,11,66 +BRDA:82,0,0,234 +BRDA:82,0,1,490 +BRDA:82,1,2,5574 +BRDA:82,1,3,2512 +BRDA:82,2,4,198 +BRDA:82,2,5,462 +BRDA:82,3,6,11126 +BRDA:82,3,7,11698 +BRDA:82,4,8,88262 +BRDA:82,4,9,34936 +BRDA:82,5,10,15032 +BRDA:82,5,11,14300 +BRDA:97,0,0,27896 +BRDA:97,0,1,44 +BRDA:97,1,2,150716 +BRDA:97,1,3,62 +BRDA:97,2,4,51874 +BRDA:97,2,5,58 +BRDA:97,3,6,15420 +BRDA:97,3,7,212 +BRDA:97,4,8,3910 +BRDA:97,4,9,366 +BRDA:97,5,10,3888 +BRDA:97,5,11,276 +BRDA:125,0,0,42 +BRDA:125,0,1,66 +BRDA:125,1,2,138 +BRDA:125,1,3,86 +BRDA:125,2,4,254 +BRDA:125,2,5,642 +BRDA:125,3,6,598 +BRDA:125,3,7,628 +BRDA:125,4,8,56 +BRDA:125,4,9,80 +BRDA:125,5,10,387 +BRDA:125,5,11,276 +BRDA:129,0,0,22 +BRDA:129,0,1,58 +BRDA:129,1,2,352 +BRDA:129,1,3,276 +BRDA:129,2,4,276 +BRDA:129,2,5,366 +BRDA:129,3,6,64 +BRDA:129,3,7,212 +BRDA:129,4,8,22 +BRDA:129,4,9,44 +BRDA:129,5,10,24 +BRDA:129,5,11,62 +BRDA:159,0,0,896 +BRDA:159,0,1,2357 +BRDA:161,0,0,1226 +BRDA:161,0,1,1131 +BRDA:163,0,0,663 +BRDA:163,0,1,468 +BRDA:165,0,0,108 +BRDA:165,0,1,360 +BRDA:167,0,0,136 +BRDA:167,0,1,224 +BRF:26 +BRH:26 +LF:105 +LH:105 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/fields.hpp +FN:64,_ZN6evmmax5bn2548multiplyERKNS_3ecc12ExtFieldElemINS0_9Fq2ConfigEEES6_ +FN:96,_ZN6evmmax5bn2548multiplyERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEES6_ +FN:73,_ZN6evmmax5bn2548multiplyERKNS_3ecc12ExtFieldElemINS0_9Fq6ConfigEEES6_ +FN:165,_ZN6evmmax5bn2547inverseERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FN:138,_ZN6evmmax5bn2547inverseERKNS_3ecc12ExtFieldElemINS0_9Fq6ConfigEEE +FN:121,_ZN6evmmax5bn2547inverseERKNS_3ecc12ExtFieldElemINS0_9Fq2ConfigEEE +FN:115,_ZN6evmmax5bn2547inverseERKNS_3ecc13BaseFieldElemINS0_15BaseFieldConfigEEE +FNDA:7542774,_ZN6evmmax5bn2548multiplyERKNS_3ecc12ExtFieldElemINS0_9Fq2ConfigEEES6_ +FNDA:35058,_ZN6evmmax5bn2548multiplyERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEES6_ +FNDA:235494,_ZN6evmmax5bn2548multiplyERKNS_3ecc12ExtFieldElemINS0_9Fq6ConfigEEES6_ +FNDA:516,_ZN6evmmax5bn2547inverseERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FNDA:516,_ZN6evmmax5bn2547inverseERKNS_3ecc12ExtFieldElemINS0_9Fq6ConfigEEE +FNDA:516,_ZN6evmmax5bn2547inverseERKNS_3ecc12ExtFieldElemINS0_9Fq2ConfigEEE +FNDA:516,_ZN6evmmax5bn2547inverseERKNS_3ecc13BaseFieldElemINS0_15BaseFieldConfigEEE +FNF:7 +FNH:7 +DA:64,7542774 +DA:65,7542774 +DA:66,7542774 +DA:67,7542774 +DA:68,7542774 +DA:69,7542774 +DA:73,235494 +DA:74,235494 +DA:75,235494 +DA:76,235494 +DA:77,235494 +DA:78,235494 +DA:79,235494 +DA:81,235494 +DA:83,235494 +DA:84,235494 +DA:85,235494 +DA:87,235494 +DA:88,235494 +DA:89,235494 +DA:91,235494 +DA:92,235494 +DA:96,35058 +DA:97,35058 +DA:98,35058 +DA:99,35058 +DA:100,35058 +DA:102,35058 +DA:103,35058 +DA:105,35058 +DA:107,35058 +DA:108,35058 +DA:110,35058 +DA:111,35058 +DA:115,516 +DA:116,516 +DA:117,516 +DA:121,516 +DA:122,516 +DA:123,516 +DA:124,516 +DA:125,516 +DA:127,516 +DA:128,516 +DA:130,516 +DA:131,516 +DA:133,516 +DA:134,516 +DA:138,516 +DA:139,516 +DA:140,516 +DA:141,516 +DA:143,516 +DA:145,516 +DA:146,516 +DA:147,516 +DA:149,516 +DA:150,516 +DA:151,516 +DA:153,516 +DA:154,516 +DA:155,516 +DA:157,516 +DA:158,516 +DA:160,516 +DA:161,516 +DA:165,516 +DA:166,516 +DA:167,516 +DA:169,516 +DA:170,516 +DA:172,516 +DA:174,516 +DA:175,516 +DA:177,516 +DA:178,516 +DA:180,516 +DA:181,516 +BRF:0 +BRH:0 +LF:78 +LH:78 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/pairing.cpp +FN:132,_ZN6evmmax5bn25413pairing_checkESt4spanIKSt4pairINS_3ecc5PointIN4intx4uintILj256EEEEENS4_IS2_IS7_S7_EEEELm18446744073709551615EE +FN:49,pairing.cpp:_ZN6evmmax5bn25412_GLOBAL__N_111miller_loopERKNS_3ecc5PointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKNS3_INS2_13BaseFieldElemINS0_15BaseFieldConfigEEEEE +FN:18,pairing.cpp:_ZN6evmmax5bn25412_GLOBAL__N_126multiply_by_lin_func_valueERNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEESt5arrayINS3_INS0_9Fq2ConfigEEELm3EERKNS2_13BaseFieldElemINS0_15BaseFieldConfigEEESF_ +FN:96,pairing.cpp:_ZN6evmmax5bn25412_GLOBAL__N_19final_expERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FNDA:1620,_ZN6evmmax5bn25413pairing_checkESt4spanIKSt4pairINS_3ecc5PointIN4intx4uintILj256EEEEENS4_IS2_IS7_S7_EEEELm18446744073709551615EE +FNDA:1002,pairing.cpp:_ZN6evmmax5bn25412_GLOBAL__N_111miller_loopERKNS_3ecc5PointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKNS3_INS2_13BaseFieldElemINS0_15BaseFieldConfigEEEEE +FNDA:87174,pairing.cpp:_ZN6evmmax5bn25412_GLOBAL__N_126multiply_by_lin_func_valueERNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEESt5arrayINS3_INS0_9Fq2ConfigEEELm3EERKNS2_13BaseFieldElemINS0_15BaseFieldConfigEEESF_ +FNDA:516,pairing.cpp:_ZN6evmmax5bn25412_GLOBAL__N_19final_expERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FNF:4 +FNH:4 +DA:18,87174 +DA:19,87174 +DA:20,87174 +DA:22,87174 +DA:23,87174 +DA:24,87174 +DA:26,87174 +DA:27,87174 +DA:28,87174 +DA:29,87174 +DA:30,87174 +DA:31,87174 +DA:32,87174 +DA:33,87174 +DA:34,87174 +DA:35,87174 +DA:36,87174 +DA:37,87174 +DA:38,87174 +DA:49,1002 +DA:50,1002 +DA:51,1002 +DA:52,1002 +DA:53,1002 +DA:54,1002 +DA:55,1002 +DA:57,65130 +DA:58,64128 +DA:59,64128 +DA:60,64128 +DA:61,64128 +DA:63,64128 +DA:64,9018 +DA:65,9018 +DA:66,9018 +DA:67,9018 +DA:68,55110 +DA:69,12024 +DA:70,12024 +DA:71,12024 +DA:72,12024 +DA:73,64128 +DA:74,64128 +DA:78,1002 +DA:82,1002 +DA:84,1002 +DA:85,1002 +DA:87,1002 +DA:88,1002 +DA:90,1002 +DA:91,1002 +DA:96,516 +DA:97,516 +DA:98,516 +DA:100,516 +DA:101,516 +DA:103,516 +DA:105,516 +DA:106,516 +DA:107,516 +DA:108,516 +DA:109,516 +DA:110,516 +DA:111,516 +DA:112,516 +DA:113,516 +DA:114,516 +DA:115,516 +DA:116,516 +DA:117,516 +DA:119,516 +DA:120,516 +DA:121,516 +DA:122,516 +DA:123,516 +DA:124,516 +DA:125,516 +DA:126,516 +DA:127,516 +DA:128,516 +DA:132,1620 +DA:133,1620 +DA:134,306 +DA:136,1314 +DA:138,1314 +DA:139,2052 +DA:140,2052 +DA:141,2052 +DA:142,2052 +DA:143,132 +DA:144,132 +DA:145,132 +DA:148,1920 +DA:149,1920 +DA:150,1920 +DA:152,1920 +DA:153,1920 +DA:156,1920 +DA:157,108 +DA:161,1812 +DA:162,558 +DA:165,1254 +DA:166,1002 +DA:167,1254 +DA:170,516 +DA:171,1314 +BRDA:57,0,0,64128 +BRDA:57,0,1,1002 +BRDA:63,0,0,9018 +BRDA:63,0,1,55110 +BRDA:68,0,0,12024 +BRDA:68,0,1,43086 +BRDA:133,0,0,306 +BRDA:133,0,1,1314 +BRDA:138,0,0,2052 +BRDA:138,0,1,516 +BRDA:140,0,0,36 +BRDA:140,0,1,2016 +BRDA:140,1,2,6 +BRDA:140,1,3,2010 +BRDA:140,2,4,30 +BRDA:140,2,5,1980 +BRDA:141,0,0,6 +BRDA:141,0,1,1974 +BRDA:141,1,2,30 +BRDA:141,1,3,1944 +BRDA:142,0,0,24 +BRDA:142,0,1,1920 +BRDA:156,0,0,1584 +BRDA:156,0,1,336 +BRDA:156,1,2,108 +BRDA:156,1,3,1476 +BRDA:161,0,0,1602 +BRDA:161,0,1,210 +BRDA:161,1,2,84 +BRDA:161,1,3,1518 +BRDA:161,2,4,474 +BRDA:161,2,5,1044 +BRDA:165,0,0,1146 +BRDA:165,0,1,108 +BRDA:165,1,2,1002 +BRDA:165,1,3,144 +BRF:36 +BRH:36 +LF:106 +LH:106 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/utils.hpp +FN:72,_ZN6evmmax5bn25416is_field_elementERKN4intx4uintILj256EEE +FN:98,_ZN6evmmax5bn25411is_infinityERKNS_3ecc5PointINS1_13BaseFieldElemINS0_15BaseFieldConfigEEEEE +FN:104,_ZN6evmmax5bn25414g2_is_infinityERKNS_3ecc5PointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FN:78,_ZN6evmmax5bn25411is_on_curveERKNS_3ecc5PointINS1_13BaseFieldElemINS0_15BaseFieldConfigEEEEE +FN:89,_ZN6evmmax5bn25419is_on_twisted_curveERKNS_3ecc5PointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FN:326,_ZN6evmmax5bn25417g2_subgroup_checkERKNS_3ecc5PointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FN:288,_ZN6evmmax5bn2548mul_by_XERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FN:277,_ZN6evmmax5bn2545n_dblILi6EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FN:277,_ZN6evmmax5bn2545n_dblILi7EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FN:277,_ZN6evmmax5bn2545n_dblILi8EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FN:277,_ZN6evmmax5bn2545n_dblILi10EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FN:212,_ZN6evmmax5bn2543addERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEES8_ +FN:249,_ZN6evmmax5bn2543dblERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FN:120,_ZN6evmmax5bn25412endomorphismILi1EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QooeqT_Li1EeqT_Li3E +FN:134,_ZN6evmmax5bn25412endomorphismILi2EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QeqT_Li2E +FN:348,_ZN6evmmax5bn25416lin_func_and_dblERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEERSt5arrayIS5_Lm3EE +FN:441,_ZN6evmmax5bn2546squareERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FN:382,_ZN6evmmax5bn25416lin_func_and_addERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEERKNS1_5PointIS5_EERSt5arrayIS5_Lm3EE +FN:148,_ZN6evmmax5bn25412endomorphismILi1EEENS_3ecc5PointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QooeqT_Li1EeqT_Li3E +FN:161,_ZN6evmmax5bn25412endomorphismILi2EEENS_3ecc5PointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QeqT_Li2E +FN:420,_ZN6evmmax5bn2548lin_funcERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEERKNS1_5PointIS5_EERSt5arrayIS5_Lm3EE +FN:193,_ZN6evmmax5bn25412endomorphismILi2EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_QeqT_Li2E +FN:520,_ZN6evmmax5bn25419cyclotomic_pow_to_XERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FN:509,_ZN6evmmax5bn25419n_cyclotomic_squareILi6EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FN:509,_ZN6evmmax5bn25419n_cyclotomic_squareILi7EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FN:509,_ZN6evmmax5bn25419n_cyclotomic_squareILi8EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FN:509,_ZN6evmmax5bn25419n_cyclotomic_squareILi10EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FN:173,_ZN6evmmax5bn25412endomorphismILi1EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_QooeqT_Li1EeqT_Li3E +FN:173,_ZN6evmmax5bn25412endomorphismILi3EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_QooeqT_Li1EeqT_Li3E +FN:477,_ZN6evmmax5bn25417cyclotomic_squareERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FN:460,_ZN6evmmax5bn25410fq4_squareERKSt4pairINS_3ecc12ExtFieldElemINS0_9Fq2ConfigEEES5_E +FNDA:11976,_ZN6evmmax5bn25416is_field_elementERKN4intx4uintILj256EEE +FNDA:1920,_ZN6evmmax5bn25411is_infinityERKNS_3ecc5PointINS1_13BaseFieldElemINS0_15BaseFieldConfigEEEEE +FNDA:1920,_ZN6evmmax5bn25414g2_is_infinityERKNS_3ecc5PointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FNDA:1584,_ZN6evmmax5bn25411is_on_curveERKNS_3ecc5PointINS1_13BaseFieldElemINS0_15BaseFieldConfigEEEEE +FNDA:1602,_ZN6evmmax5bn25419is_on_twisted_curveERKNS_3ecc5PointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FNDA:1518,_ZN6evmmax5bn25417g2_subgroup_checkERKNS_3ecc5PointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FNDA:1518,_ZN6evmmax5bn2548mul_by_XERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FNDA:6072,_ZN6evmmax5bn2545n_dblILi6EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FNDA:1518,_ZN6evmmax5bn2545n_dblILi7EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FNDA:3036,_ZN6evmmax5bn2545n_dblILi8EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FNDA:1518,_ZN6evmmax5bn2545n_dblILi10EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_ +FNDA:30360,_ZN6evmmax5bn2543addERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEES8_ +FNDA:95634,_ZN6evmmax5bn2543dblERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEE +FNDA:4554,_ZN6evmmax5bn25412endomorphismILi1EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QooeqT_Li1EeqT_Li3E +FNDA:1518,_ZN6evmmax5bn25412endomorphismILi2EEENS_3ecc8JacPointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QeqT_Li2E +FNDA:64128,_ZN6evmmax5bn25416lin_func_and_dblERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEERSt5arrayIS5_Lm3EE +FNDA:64128,_ZN6evmmax5bn2546squareERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FNDA:22044,_ZN6evmmax5bn25416lin_func_and_addERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEERKNS1_5PointIS5_EERSt5arrayIS5_Lm3EE +FNDA:1002,_ZN6evmmax5bn25412endomorphismILi1EEENS_3ecc5PointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QooeqT_Li1EeqT_Li3E +FNDA:1002,_ZN6evmmax5bn25412endomorphismILi2EEENS_3ecc5PointINS2_12ExtFieldElemINS0_9Fq2ConfigEEEEERKS7_QeqT_Li2E +FNDA:1002,_ZN6evmmax5bn2548lin_funcERKNS_3ecc8JacPointINS1_12ExtFieldElemINS0_9Fq2ConfigEEEEERKNS1_5PointIS5_EERSt5arrayIS5_Lm3EE +FNDA:1548,_ZN6evmmax5bn25412endomorphismILi2EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_QeqT_Li2E +FNDA:1548,_ZN6evmmax5bn25419cyclotomic_pow_to_XERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FNDA:6192,_ZN6evmmax5bn25419n_cyclotomic_squareILi6EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FNDA:1548,_ZN6evmmax5bn25419n_cyclotomic_squareILi7EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FNDA:3096,_ZN6evmmax5bn25419n_cyclotomic_squareILi8EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FNDA:1548,_ZN6evmmax5bn25419n_cyclotomic_squareILi10EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_ +FNDA:2064,_ZN6evmmax5bn25412endomorphismILi1EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_QooeqT_Li1EeqT_Li3E +FNDA:516,_ZN6evmmax5bn25412endomorphismILi3EEENS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEERKS5_QooeqT_Li1EeqT_Li3E +FNDA:98040,_ZN6evmmax5bn25417cyclotomic_squareERKNS_3ecc12ExtFieldElemINS0_10Fq12ConfigEEE +FNDA:294120,_ZN6evmmax5bn25410fq4_squareERKSt4pairINS_3ecc12ExtFieldElemINS0_9Fq2ConfigEEES5_E +FNF:24 +FNH:24 +DA:72,11976 +DA:73,11976 +DA:74,11976 +DA:78,1584 +DA:80,1584 +DA:82,1584 +DA:83,1584 +DA:84,1584 +DA:85,1584 +DA:89,1602 +DA:90,1602 +DA:91,1602 +DA:93,1602 +DA:94,1602 +DA:98,1920 +DA:99,1920 +DA:100,1920 +DA:104,1920 +DA:105,1920 +DA:106,1920 +DA:120,4554 +DA:121,4554 +DA:122,4554 +DA:123,4554 +DA:124,4554 +DA:125,4554 +DA:126,4554 +DA:134,1518 +DA:135,1518 +DA:136,1518 +DA:137,1518 +DA:138,1518 +DA:139,1518 +DA:140,1518 +DA:148,1002 +DA:149,1002 +DA:150,1002 +DA:151,1002 +DA:152,1002 +DA:153,1002 +DA:161,1002 +DA:162,1002 +DA:163,1002 +DA:164,1002 +DA:165,1002 +DA:166,1002 +DA:173,2580 +DA:174,2580 +DA:175,2580 +DA:176,2580 +DA:177,2580 +DA:178,2580 +DA:179,2580 +DA:180,2580 +DA:181,2580 +DA:182,2580 +DA:183,2580 +DA:184,2580 +DA:185,2580 +DA:186,2580 +DA:193,1548 +DA:194,1548 +DA:195,1548 +DA:196,1548 +DA:197,1548 +DA:198,1548 +DA:199,1548 +DA:200,1548 +DA:201,1548 +DA:202,1548 +DA:203,1548 +DA:204,1548 +DA:205,1548 +DA:206,1548 +DA:212,30360 +DA:213,30360 +DA:214,30360 +DA:215,30360 +DA:217,30360 +DA:218,30360 +DA:219,30360 +DA:221,30360 +DA:222,30360 +DA:224,30360 +DA:225,30360 +DA:227,30360 +DA:228,30360 +DA:229,30360 +DA:230,30360 +DA:231,30360 +DA:232,30360 +DA:234,30360 +DA:235,30360 +DA:236,30360 +DA:238,30360 +DA:240,30360 +DA:241,30360 +DA:242,30360 +DA:244,30360 +DA:245,30360 +DA:249,95634 +DA:250,95634 +DA:251,95634 +DA:252,95634 +DA:254,95634 +DA:255,95634 +DA:256,95634 +DA:257,95634 +DA:258,95634 +DA:260,95634 +DA:261,95634 +DA:262,95634 +DA:263,95634 +DA:265,95634 +DA:267,95634 +DA:268,95634 +DA:269,95634 +DA:271,95634 +DA:272,95634 +DA:277,12144 +DA:278,12144 +DA:279,86526 +DA:280,74382 +DA:282,12144 +DA:283,12144 +DA:288,1518 +DA:289,1518 +DA:290,1518 +DA:291,1518 +DA:292,1518 +DA:293,1518 +DA:294,1518 +DA:295,1518 +DA:296,1518 +DA:297,1518 +DA:298,1518 +DA:299,1518 +DA:300,1518 +DA:301,1518 +DA:302,1518 +DA:303,1518 +DA:304,1518 +DA:305,1518 +DA:306,1518 +DA:307,1518 +DA:308,1518 +DA:309,1518 +DA:310,1518 +DA:311,1518 +DA:312,1518 +DA:313,1518 +DA:314,1518 +DA:315,1518 +DA:316,1518 +DA:317,1518 +DA:318,1518 +DA:320,1518 +DA:321,1518 +DA:326,1518 +DA:327,1518 +DA:329,1518 +DA:330,1518 +DA:331,1518 +DA:333,1518 +DA:334,1518 +DA:335,1518 +DA:337,1518 +DA:339,1518 +DA:340,1518 +DA:348,64128 +DA:349,64128 +DA:350,64128 +DA:351,64128 +DA:353,64128 +DA:354,64128 +DA:355,64128 +DA:356,64128 +DA:357,64128 +DA:359,64128 +DA:360,64128 +DA:361,64128 +DA:362,64128 +DA:364,64128 +DA:366,64128 +DA:367,64128 +DA:368,64128 +DA:370,64128 +DA:371,64128 +DA:372,64128 +DA:374,64128 +DA:375,64128 +DA:382,22044 +DA:383,22044 +DA:384,22044 +DA:385,22044 +DA:387,22044 +DA:388,22044 +DA:390,22044 +DA:391,22044 +DA:393,22044 +DA:394,22044 +DA:395,22044 +DA:396,22044 +DA:398,22044 +DA:399,22044 +DA:400,22044 +DA:402,22044 +DA:404,22044 +DA:405,22044 +DA:406,22044 +DA:408,22044 +DA:409,22044 +DA:410,22044 +DA:412,22044 +DA:413,22044 +DA:420,1002 +DA:421,1002 +DA:422,1002 +DA:423,1002 +DA:425,1002 +DA:426,1002 +DA:428,1002 +DA:429,1002 +DA:431,1002 +DA:432,1002 +DA:434,1002 +DA:435,1002 +DA:436,1002 +DA:437,1002 +DA:441,64128 +DA:442,64128 +DA:444,64128 +DA:445,64128 +DA:446,64128 +DA:447,64128 +DA:448,64128 +DA:449,64128 +DA:450,64128 +DA:451,64128 +DA:452,64128 +DA:454,64128 +DA:455,64128 +DA:460,294120 +DA:461,294120 +DA:462,294120 +DA:464,294120 +DA:465,294120 +DA:467,294120 +DA:468,294120 +DA:469,294120 +DA:471,294120 +DA:472,294120 +DA:477,98040 +DA:478,98040 +DA:479,98040 +DA:481,98040 +DA:482,98040 +DA:483,98040 +DA:485,98040 +DA:486,98040 +DA:487,98040 +DA:489,98040 +DA:490,98040 +DA:491,98040 +DA:493,98040 +DA:495,98040 +DA:496,98040 +DA:497,98040 +DA:499,98040 +DA:500,98040 +DA:501,98040 +DA:503,98040 +DA:504,98040 +DA:509,12384 +DA:510,12384 +DA:511,100620 +DA:512,88236 +DA:514,12384 +DA:515,12384 +DA:520,1548 +DA:521,1548 +DA:522,1548 +DA:523,1548 +DA:524,1548 +DA:525,1548 +DA:526,1548 +DA:527,1548 +DA:528,1548 +DA:529,1548 +DA:530,1548 +DA:531,1548 +DA:532,1548 +DA:533,1548 +DA:534,1548 +DA:535,1548 +DA:536,1548 +DA:537,1548 +DA:538,1548 +DA:539,1548 +DA:540,1548 +DA:541,1548 +DA:542,1548 +DA:543,1548 +DA:544,1548 +DA:545,1548 +DA:546,1548 +DA:547,1548 +DA:548,1548 +DA:549,1548 +DA:550,1548 +DA:552,1548 +DA:553,1548 +BRDA:99,0,0,360 +BRDA:99,0,1,1560 +BRDA:99,1,2,336 +BRDA:99,1,3,24 +BRDA:105,0,0,276 +BRDA:105,0,1,1644 +BRDA:105,1,2,264 +BRDA:105,1,3,12 +BRDA:279,0,0,30360 +BRDA:279,0,1,6072 +BRDA:279,1,2,9108 +BRDA:279,1,3,1518 +BRDA:279,2,4,21252 +BRDA:279,2,5,3036 +BRDA:279,3,6,13662 +BRDA:279,3,7,1518 +BRDA:511,0,0,37152 +BRDA:511,0,1,6192 +BRDA:511,1,2,10836 +BRDA:511,1,3,1548 +BRDA:511,2,4,24768 +BRDA:511,2,5,3096 +BRDA:511,3,6,15480 +BRDA:511,3,7,1548 +BRF:12 +BRH:12 +LF:312 +LH:312 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/field_template.hpp +FN:97,_ZN6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEE3oneEv +FN:82,_ZN6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEEC2Ev +FN:82,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEEC2Ev +FN:82,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEEC2Ev +FN:23,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEEC2Ev +FN:97,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEE3oneEv +FN:97,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE3oneEv +FN:38,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE3oneEv +FN:25,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEEC2ERKN4intx4uintILj256EEE +FN:28,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE8from_intERKN4intx4uintILj256EEE +FN:86,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEEC2ERKSt5arrayINS0_13BaseFieldElemINS2_15BaseFieldConfigEEELm2EE +FN:36,_ZNK6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE7is_zeroEv +FN:137,_ZN6evmmax3ecceqERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FN:66,_ZN6evmmax3ecceqERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FN:103,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE4zeroEv +FN:56,_ZN6evmmax3eccmlERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FN:44,_ZN6evmmax3eccplERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FN:132,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FN:50,_ZN6evmmax3eccmiERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FN:108,_ZN6evmmax3eccplERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FN:116,_ZN6evmmax3eccmiERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FN:89,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE9conjugateEv +FN:61,_ZN6evmmax3eccngERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEE +FN:132,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn25410Fq12ConfigEEES6_ +FN:132,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FN:108,_ZN6evmmax3eccplERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FN:86,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEEC2ERKSt5arrayINS1_INS2_9Fq2ConfigEEELm3EE +FN:116,_ZN6evmmax3eccmiERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FN:86,_ZN6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEEC2ERKSt5arrayINS1_INS2_9Fq6ConfigEEELm2EE +FN:124,_ZN6evmmax3eccngERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEE +FN:140,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEERKNS0_13BaseFieldElemINS2_15BaseFieldConfigEEE +FN:137,_ZN6evmmax3ecceqERKNS0_12ExtFieldElemINS_5bn25410Fq12ConfigEEES6_ +FN:137,_ZN6evmmax3ecceqERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FN:89,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEE9conjugateEv +FN:124,_ZN6evmmax3eccngERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEE +FN:105,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEE3invEv +FN:105,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEE3invEv +FN:105,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE3invEv +FN:34,_ZNK6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE3invEv +FN:32,_ZNK6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE5valueEv +FNDA:2832,_ZN6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEE3oneEv +FNDA:2832,_ZN6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEEC2Ev +FNDA:8496,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEEC2Ev +FNDA:46878,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEEC2Ev +FNDA:119436,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEEC2Ev +FNDA:2832,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEE3oneEv +FNDA:5352,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE3oneEv +FNDA:5352,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE3oneEv +FNDA:71325000,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEEC2ERKN4intx4uintILj256EEE +FNDA:11520,_ZN6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE8from_intERKN4intx4uintILj256EEE +FNDA:20408622,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEEC2ERKSt5arrayINS0_13BaseFieldElemINS2_15BaseFieldConfigEEELm2EE +FNDA:2280,_ZNK6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE7is_zeroEv +FNDA:9066,_ZN6evmmax3ecceqERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FNDA:17544,_ZN6evmmax3ecceqERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FNDA:2196,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE4zeroEv +FNDA:30526608,_ZN6evmmax3eccmlERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FNDA:24260766,_ZN6evmmax3eccplERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FNDA:7542774,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FNDA:16461894,_ZN6evmmax3eccmiERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEES6_ +FNDA:8357946,_ZN6evmmax3eccplERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FNDA:4459560,_ZN6evmmax3eccmiERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEES6_ +FNDA:31146,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE9conjugateEv +FNDA:58344,_ZN6evmmax3eccngERKNS0_13BaseFieldElemINS_5bn25415BaseFieldConfigEEE +FNDA:35058,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn25410Fq12ConfigEEES6_ +FNDA:235494,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FNDA:297558,_ZN6evmmax3eccplERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FNDA:1104234,_ZN6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEEC2ERKSt5arrayINS1_INS2_9Fq2ConfigEEELm3EE +FNDA:198888,_ZN6evmmax3eccmiERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FNDA:204966,_ZN6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEEC2ERKSt5arrayINS1_INS2_9Fq6ConfigEEELm2EE +FNDA:12840,_ZN6evmmax3eccngERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEE +FNDA:174348,_ZN6evmmax3eccmlERKNS0_12ExtFieldElemINS_5bn2549Fq2ConfigEEERKNS0_13BaseFieldElemINS2_15BaseFieldConfigEEE +FNDA:516,_ZN6evmmax3ecceqERKNS0_12ExtFieldElemINS_5bn25410Fq12ConfigEEES6_ +FNDA:954,_ZN6evmmax3ecceqERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEES6_ +FNDA:3096,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEE9conjugateEv +FNDA:3612,_ZN6evmmax3eccngERKNS0_12ExtFieldElemINS_5bn2549Fq6ConfigEEE +FNDA:516,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn25410Fq12ConfigEE3invEv +FNDA:516,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn2549Fq6ConfigEE3invEv +FNDA:516,_ZNK6evmmax3ecc12ExtFieldElemINS_5bn2549Fq2ConfigEE3invEv +FNDA:516,_ZNK6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE3invEv +FNDA:516,_ZNK6evmmax3ecc13BaseFieldElemINS_5bn25415BaseFieldConfigEE5valueEv +FNF:24 +FNH:24 +DA:23,119436 +DA:25,71325000 +DA:28,11520 +DA:29,11520 +DA:30,11520 +DA:32,516 +DA:34,516 +DA:36,2280 +DA:38,5352 +DA:44,24260766 +DA:45,24260766 +DA:46,24260766 +DA:50,16461894 +DA:51,16461894 +DA:52,16461894 +DA:56,30526608 +DA:57,30526608 +DA:58,30526608 +DA:61,58344 +DA:62,58344 +DA:63,58344 +DA:66,17544 +DA:82,58206 +DA:86,21717822 +DA:89,34242 +DA:90,34242 +DA:91,68484 +DA:92,34242 +DA:93,34242 +DA:94,34242 +DA:97,11016 +DA:98,11016 +DA:99,11016 +DA:100,11016 +DA:101,11016 +DA:103,2196 +DA:105,1548 +DA:108,8655504 +DA:109,8655504 +DA:110,26264070 +DA:111,17608566 +DA:112,8655504 +DA:113,8655504 +DA:116,4658448 +DA:117,4658448 +DA:118,14174232 +DA:119,9515784 +DA:120,4658448 +DA:121,4658448 +DA:124,16452 +DA:125,16452 +DA:126,52968 +DA:127,36516 +DA:128,16452 +DA:129,16452 +DA:132,7813326 +DA:133,7813326 +DA:134,7813326 +DA:137,10536 +DA:140,174348 +DA:141,174348 +DA:142,174348 +DA:143,348696 +DA:144,174348 +DA:145,174348 +BRDA:91,0,0,31146 +BRDA:91,0,1,31146 +BRDA:91,1,2,3096 +BRDA:91,1,3,3096 +BRDA:110,0,0,16715892 +BRDA:110,0,1,8357946 +BRDA:110,1,2,892674 +BRDA:110,1,3,297558 +BRDA:118,0,0,8919120 +BRDA:118,0,1,4459560 +BRDA:118,1,2,596664 +BRDA:118,1,3,198888 +BRDA:126,0,0,25680 +BRDA:126,0,1,12840 +BRDA:126,1,2,10836 +BRDA:126,1,3,3612 +BRDA:142,0,0,348696 +BRDA:142,0,1,174348 +BRF:10 +BRH:10 +LF:65 +LH:65 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/ripemd160.cpp +FN:193,_ZN6evmone6crypto9ripemd160EPSt4bytePKS1_m +FN:181,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_18compressERSt5arrayIjLm5EEPKSt4byte +FN:176,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_15stepsIJLm0ELm1ELm2ELm3ELm4ELm5ELm6ELm7ELm8ELm9ELm10ELm11ELm12ELm13ELm14ELm15ELm16ELm17ELm18ELm19ELm20ELm21ELm22ELm23ELm24ELm25ELm26ELm27ELm28ELm29ELm30ELm31ELm32ELm33ELm34ELm35ELm36ELm37ELm38ELm39ELm40ELm41ELm42ELm43ELm44ELm45ELm46ELm47ELm48ELm49ELm50ELm51ELm52ELm53ELm54ELm55ELm56ELm57ELm58ELm59ELm60ELm61ELm62ELm63ELm64ELm65ELm66ELm67ELm68ELm69ELm70ELm71ELm72ELm73ELm74ELm75ELm76ELm77ELm78ELm79EEEEvPSt5arrayIjLm5EEPKSt4byteSt16integer_sequenceImJXspT_EEE +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm0EEEvPSt5arrayIjLm5EEPKSt4byte +FN:52,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_0clEjjj +FN:64,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_1clEjjj +FN:132,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_17load_leIjEET_PKSt4byte +FN:124,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_15to_leITkSt8integraljEEDaT_ +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm1EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm2EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm3EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm4EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm5EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm6EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm7EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm8EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm9EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm10EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm11EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm12EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm13EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm14EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm15EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm16EEEvPSt5arrayIjLm5EEPKSt4byte +FN:55,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_2clEjjj +FN:61,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_3clEjjj +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm17EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm18EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm19EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm20EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm21EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm22EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm23EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm24EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm25EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm26EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm27EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm28EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm29EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm30EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm31EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm32EEEvPSt5arrayIjLm5EEPKSt4byte +FN:58,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_4clEjjj +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm33EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm34EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm35EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm36EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm37EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm38EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm39EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm40EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm41EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm42EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm43EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm44EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm45EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm46EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm47EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm48EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm49EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm50EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm51EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm52EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm53EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm54EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm55EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm56EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm57EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm58EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm59EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm60EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm61EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm62EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm63EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm64EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm65EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm66EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm67EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm68EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm69EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm70EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm71EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm72EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm73EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm74EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm75EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm76EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm77EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm78EEEvPSt5arrayIjLm5EEPKSt4byte +FN:145,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm79EEEvPSt5arrayIjLm5EEPKSt4byte +FN:139,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_18store_leITkSt8integralmEEPSt4byteS4_T_ +FN:124,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_15to_leITkSt8integralmEEDaT_ +FN:139,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_18store_leITkSt8integraljEEPSt4byteS4_T_ +FNDA:1166,_ZN6evmone6crypto9ripemd160EPSt4bytePKS1_m +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_18compressERSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_15stepsIJLm0ELm1ELm2ELm3ELm4ELm5ELm6ELm7ELm8ELm9ELm10ELm11ELm12ELm13ELm14ELm15ELm16ELm17ELm18ELm19ELm20ELm21ELm22ELm23ELm24ELm25ELm26ELm27ELm28ELm29ELm30ELm31ELm32ELm33ELm34ELm35ELm36ELm37ELm38ELm39ELm40ELm41ELm42ELm43ELm44ELm45ELm46ELm47ELm48ELm49ELm50ELm51ELm52ELm53ELm54ELm55ELm56ELm57ELm58ELm59ELm60ELm61ELm62ELm63ELm64ELm65ELm66ELm67ELm68ELm69ELm70ELm71ELm72ELm73ELm74ELm75ELm76ELm77ELm78ELm79EEEEvPSt5arrayIjLm5EEPKSt4byteSt16integer_sequenceImJXspT_EEE +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm0EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:184704,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_0clEjjj +FNDA:184704,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_1clEjjj +FNDA:923520,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_17load_leIjEET_PKSt4byte +FNDA:929350,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_15to_leITkSt8integraljEEDaT_ +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm1EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm2EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm3EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm4EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm5EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm6EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm7EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm8EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm9EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm10EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm11EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm12EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm13EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm14EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm15EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm16EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:184704,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_2clEjjj +FNDA:184704,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_3clEjjj +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm17EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm18EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm19EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm20EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm21EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm22EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm23EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm24EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm25EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm26EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm27EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm28EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm29EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm30EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm31EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm32EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:184704,ripemd160.cpp:_ZNK6evmone6crypto12_GLOBAL__N_13$_4clEjjj +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm33EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm34EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm35EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm36EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm37EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm38EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm39EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm40EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm41EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm42EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm43EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm44EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm45EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm46EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm47EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm48EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm49EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm50EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm51EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm52EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm53EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm54EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm55EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm56EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm57EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm58EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm59EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm60EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm61EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm62EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm63EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm64EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm65EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm66EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm67EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm68EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm69EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm70EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm71EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm72EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm73EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm74EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm75EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm76EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm77EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm78EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:5772,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_14stepILm79EEEvPSt5arrayIjLm5EEPKSt4byte +FNDA:1166,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_18store_leITkSt8integralmEEPSt4byteS4_T_ +FNDA:1166,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_15to_leITkSt8integralmEEDaT_ +FNDA:5830,ripemd160.cpp:_ZN6evmone6crypto12_GLOBAL__N_18store_leITkSt8integraljEEPSt4byteS4_T_ +FNF:12 +FNH:12 +DA:52,184704 +DA:55,184704 +DA:58,184704 +DA:61,184704 +DA:64,184704 +DA:124,930516 +DA:127,930516 +DA:128,930516 +DA:132,923520 +DA:133,923520 +DA:134,923520 +DA:135,923520 +DA:136,923520 +DA:139,6996 +DA:140,6996 +DA:141,6996 +DA:145,461760 +DA:146,461760 +DA:147,461760 +DA:149,1385280 +DA:150,923520 +DA:151,923520 +DA:152,923520 +DA:153,923520 +DA:154,923520 +DA:156,923520 +DA:157,923520 +DA:158,923520 +DA:159,923520 +DA:160,923520 +DA:162,923520 +DA:163,923520 +DA:164,923520 +DA:165,923520 +DA:166,923520 +DA:167,923520 +DA:168,461760 +DA:176,5772 +DA:177,5772 +DA:178,5772 +DA:181,5772 +DA:182,5772 +DA:183,5772 +DA:185,5772 +DA:186,34632 +DA:187,28860 +DA:188,5772 +DA:189,5772 +DA:193,1166 +DA:194,1166 +DA:195,1166 +DA:197,1166 +DA:198,5564 +DA:199,4398 +DA:201,1166 +DA:202,1166 +DA:203,1166 +DA:204,1166 +DA:207,1166 +DA:208,1166 +DA:209,1166 +DA:210,208 +DA:211,208 +DA:212,208 +DA:213,208 +DA:214,1166 +DA:215,1166 +DA:216,1166 +DA:218,1166 +DA:219,5830 +DA:220,1166 +BRDA:149,0,0,11544 +BRDA:149,0,1,5772 +BRDA:149,1,2,11544 +BRDA:149,1,3,5772 +BRDA:149,2,4,11544 +BRDA:149,2,5,5772 +BRDA:149,3,6,11544 +BRDA:149,3,7,5772 +BRDA:149,4,8,11544 +BRDA:149,4,9,5772 +BRDA:149,5,10,11544 +BRDA:149,5,11,5772 +BRDA:149,6,12,11544 +BRDA:149,6,13,5772 +BRDA:149,7,14,11544 +BRDA:149,7,15,5772 +BRDA:149,8,16,11544 +BRDA:149,8,17,5772 +BRDA:149,9,18,11544 +BRDA:149,9,19,5772 +BRDA:149,10,20,11544 +BRDA:149,10,21,5772 +BRDA:149,11,22,11544 +BRDA:149,11,23,5772 +BRDA:149,12,24,11544 +BRDA:149,12,25,5772 +BRDA:149,13,26,11544 +BRDA:149,13,27,5772 +BRDA:149,14,28,11544 +BRDA:149,14,29,5772 +BRDA:149,15,30,11544 +BRDA:149,15,31,5772 +BRDA:149,16,32,11544 +BRDA:149,16,33,5772 +BRDA:149,17,34,11544 +BRDA:149,17,35,5772 +BRDA:149,18,36,11544 +BRDA:149,18,37,5772 +BRDA:149,19,38,11544 +BRDA:149,19,39,5772 +BRDA:149,20,40,11544 +BRDA:149,20,41,5772 +BRDA:149,21,42,11544 +BRDA:149,21,43,5772 +BRDA:149,22,44,11544 +BRDA:149,22,45,5772 +BRDA:149,23,46,11544 +BRDA:149,23,47,5772 +BRDA:149,24,48,11544 +BRDA:149,24,49,5772 +BRDA:149,25,50,11544 +BRDA:149,25,51,5772 +BRDA:149,26,52,11544 +BRDA:149,26,53,5772 +BRDA:149,27,54,11544 +BRDA:149,27,55,5772 +BRDA:149,28,56,11544 +BRDA:149,28,57,5772 +BRDA:149,29,58,11544 +BRDA:149,29,59,5772 +BRDA:149,30,60,11544 +BRDA:149,30,61,5772 +BRDA:149,31,62,11544 +BRDA:149,31,63,5772 +BRDA:149,32,64,11544 +BRDA:149,32,65,5772 +BRDA:149,33,66,11544 +BRDA:149,33,67,5772 +BRDA:149,34,68,11544 +BRDA:149,34,69,5772 +BRDA:149,35,70,11544 +BRDA:149,35,71,5772 +BRDA:149,36,72,11544 +BRDA:149,36,73,5772 +BRDA:149,37,74,11544 +BRDA:149,37,75,5772 +BRDA:149,38,76,11544 +BRDA:149,38,77,5772 +BRDA:149,39,78,11544 +BRDA:149,39,79,5772 +BRDA:149,40,80,11544 +BRDA:149,40,81,5772 +BRDA:149,41,82,11544 +BRDA:149,41,83,5772 +BRDA:149,42,84,11544 +BRDA:149,42,85,5772 +BRDA:149,43,86,11544 +BRDA:149,43,87,5772 +BRDA:149,44,88,11544 +BRDA:149,44,89,5772 +BRDA:149,45,90,11544 +BRDA:149,45,91,5772 +BRDA:149,46,92,11544 +BRDA:149,46,93,5772 +BRDA:149,47,94,11544 +BRDA:149,47,95,5772 +BRDA:149,48,96,11544 +BRDA:149,48,97,5772 +BRDA:149,49,98,11544 +BRDA:149,49,99,5772 +BRDA:149,50,100,11544 +BRDA:149,50,101,5772 +BRDA:149,51,102,11544 +BRDA:149,51,103,5772 +BRDA:149,52,104,11544 +BRDA:149,52,105,5772 +BRDA:149,53,106,11544 +BRDA:149,53,107,5772 +BRDA:149,54,108,11544 +BRDA:149,54,109,5772 +BRDA:149,55,110,11544 +BRDA:149,55,111,5772 +BRDA:149,56,112,11544 +BRDA:149,56,113,5772 +BRDA:149,57,114,11544 +BRDA:149,57,115,5772 +BRDA:149,58,116,11544 +BRDA:149,58,117,5772 +BRDA:149,59,118,11544 +BRDA:149,59,119,5772 +BRDA:149,60,120,11544 +BRDA:149,60,121,5772 +BRDA:149,61,122,11544 +BRDA:149,61,123,5772 +BRDA:149,62,124,11544 +BRDA:149,62,125,5772 +BRDA:149,63,126,11544 +BRDA:149,63,127,5772 +BRDA:149,64,128,11544 +BRDA:149,64,129,5772 +BRDA:149,65,130,11544 +BRDA:149,65,131,5772 +BRDA:149,66,132,11544 +BRDA:149,66,133,5772 +BRDA:149,67,134,11544 +BRDA:149,67,135,5772 +BRDA:149,68,136,11544 +BRDA:149,68,137,5772 +BRDA:149,69,138,11544 +BRDA:149,69,139,5772 +BRDA:149,70,140,11544 +BRDA:149,70,141,5772 +BRDA:149,71,142,11544 +BRDA:149,71,143,5772 +BRDA:149,72,144,11544 +BRDA:149,72,145,5772 +BRDA:149,73,146,11544 +BRDA:149,73,147,5772 +BRDA:149,74,148,11544 +BRDA:149,74,149,5772 +BRDA:149,75,150,11544 +BRDA:149,75,151,5772 +BRDA:149,76,152,11544 +BRDA:149,76,153,5772 +BRDA:149,77,154,11544 +BRDA:149,77,155,5772 +BRDA:149,78,156,11544 +BRDA:149,78,157,5772 +BRDA:149,79,158,11544 +BRDA:149,79,159,5772 +BRDA:186,0,0,28860 +BRDA:186,0,1,5772 +BRDA:198,0,0,4398 +BRDA:198,0,1,1166 +BRDA:209,0,0,208 +BRDA:209,0,1,958 +BRDA:218,0,0,5830 +BRDA:218,0,1,1166 +BRF:10 +BRH:10 +LF:71 +LH:71 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/secp256k1.cpp +FN:20,_ZN6evmmax9secp256k111calculate_yERKNS_8ModArithIN4intx4uintILj256EEEEERKS4_b +FN:33,_ZN6evmmax9secp256k110to_addressERKNS_3ecc11AffinePointINS0_5CurveEEE +FN:47,_ZN6evmmax9secp256k123secp256k1_ecdsa_recoverERK14ethash_hash256RKN4intx4uintILj256EEES8_b +FN:105,_ZN6evmmax9secp256k19ecrecoverERK14ethash_hash256RKN4intx4uintILj256EEES8_b +FN:114,_ZN6evmmax9secp256k110field_sqrtERKNS_8ModArithIN4intx4uintILj256EEEEERKS4_ +FNDA:938,_ZN6evmmax9secp256k111calculate_yERKNS_8ModArithIN4intx4uintILj256EEEEERKS4_b +FNDA:832,_ZN6evmmax9secp256k110to_addressERKNS_3ecc11AffinePointINS0_5CurveEEE +FNDA:1264,_ZN6evmmax9secp256k123secp256k1_ecdsa_recoverERK14ethash_hash256RKN4intx4uintILj256EEES8_b +FNDA:1264,_ZN6evmmax9secp256k19ecrecoverERK14ethash_hash256RKN4intx4uintILj256EEES8_b +FNDA:938,_ZN6evmmax9secp256k110field_sqrtERKNS_8ModArithIN4intx4uintILj256EEEEERKS4_ +FNF:5 +FNH:5 +DA:20,938 +DA:22,938 +DA:23,938 +DA:24,938 +DA:25,48 +DA:28,890 +DA:29,890 +DA:30,938 +DA:33,832 +DA:35,832 +DA:36,832 +DA:38,832 +DA:39,832 +DA:40,832 +DA:42,832 +DA:43,832 +DA:47,1264 +DA:52,1264 +DA:53,326 +DA:59,938 +DA:60,938 +DA:61,938 +DA:62,26 +DA:64,938 +DA:67,938 +DA:68,938 +DA:70,938 +DA:71,938 +DA:72,938 +DA:73,938 +DA:75,938 +DA:76,938 +DA:77,938 +DA:78,938 +DA:81,938 +DA:82,938 +DA:83,938 +DA:84,938 +DA:85,48 +DA:88,890 +DA:90,890 +DA:91,890 +DA:92,890 +DA:93,890 +DA:95,890 +DA:97,890 +DA:98,58 +DA:100,832 +DA:101,890 +DA:105,1264 +DA:106,1264 +DA:107,1264 +DA:108,432 +DA:110,832 +DA:111,1264 +DA:114,938 +DA:144,938 +DA:145,938 +DA:146,938 +DA:147,938 +DA:148,938 +DA:152,938 +DA:155,938 +DA:158,938 +DA:159,1876 +DA:160,938 +DA:163,938 +DA:166,938 +DA:169,938 +DA:172,938 +DA:173,1876 +DA:174,938 +DA:177,938 +DA:180,938 +DA:181,3752 +DA:182,2814 +DA:185,938 +DA:188,938 +DA:189,10318 +DA:190,9380 +DA:193,938 +DA:196,938 +DA:197,4690 +DA:198,3752 +DA:201,938 +DA:204,938 +DA:205,25326 +DA:206,24388 +DA:209,938 +DA:212,938 +DA:213,50652 +DA:214,49714 +DA:217,938 +DA:220,938 +DA:221,101304 +DA:222,100366 +DA:225,938 +DA:228,7504 +DA:229,6566 +DA:232,938 +DA:235,22512 +DA:236,21574 +DA:239,938 +DA:242,6566 +DA:243,5628 +DA:246,938 +DA:249,2814 +DA:250,1876 +DA:252,938 +DA:253,48 +DA:255,890 +DA:256,938 +BRDA:24,0,0,48 +BRDA:24,0,1,890 +BRDA:29,0,0,360 +BRDA:29,0,1,530 +BRDA:52,0,0,326 +BRDA:52,0,1,938 +BRDA:52,1,2,32 +BRDA:52,1,3,1232 +BRDA:52,2,4,38 +BRDA:52,2,5,1194 +BRDA:52,3,6,218 +BRDA:52,3,7,976 +BRDA:52,4,8,38 +BRDA:52,4,9,938 +BRDA:61,0,0,26 +BRDA:61,0,1,912 +BRDA:84,0,0,48 +BRDA:84,0,1,890 +BRDA:97,0,0,58 +BRDA:97,0,1,832 +BRDA:107,0,0,432 +BRDA:107,0,1,832 +BRDA:159,0,0,938 +BRDA:159,0,1,938 +BRDA:173,0,0,938 +BRDA:173,0,1,938 +BRDA:181,0,0,2814 +BRDA:181,0,1,938 +BRDA:189,0,0,9380 +BRDA:189,0,1,938 +BRDA:197,0,0,3752 +BRDA:197,0,1,938 +BRDA:205,0,0,24388 +BRDA:205,0,1,938 +BRDA:213,0,0,49714 +BRDA:213,0,1,938 +BRDA:221,0,0,100366 +BRDA:221,0,1,938 +BRDA:228,0,0,6566 +BRDA:228,0,1,938 +BRDA:235,0,0,21574 +BRDA:235,0,1,938 +BRDA:242,0,0,5628 +BRDA:242,0,1,938 +BRDA:249,0,0,1876 +BRDA:249,0,1,938 +BRDA:252,0,0,48 +BRDA:252,0,1,890 +BRF:48 +BRH:48 +LF:112 +LH:112 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/secp256r1.cpp +FN:20,_ZN6evmmax9secp256r16verifyERK14ethash_hash256RKN4intx4uintILj256EEES8_S8_S8_ +FN:11,secp256r1.cpp:_ZN6evmmax9secp256r112_GLOBAL__N_111is_on_curveERKNS_3ecc11AffinePointINS0_5CurveEEE +FNDA:782,_ZN6evmmax9secp256r16verifyERK14ethash_hash256RKN4intx4uintILj256EEES8_S8_S8_ +FNDA:608,secp256r1.cpp:_ZN6evmmax9secp256r112_GLOBAL__N_111is_on_curveERKNS_3ecc11AffinePointINS0_5CurveEEE +FNF:2 +FNH:2 +DA:11,608 +DA:12,608 +DA:13,608 +DA:14,608 +DA:15,608 +DA:20,782 +DA:27,782 +DA:28,150 +DA:31,632 +DA:32,18 +DA:33,614 +DA:34,614 +DA:35,6 +DA:38,608 +DA:39,52 +DA:41,556 +DA:44,556 +DA:45,556 +DA:48,556 +DA:49,556 +DA:50,556 +DA:54,556 +DA:55,556 +DA:56,556 +DA:57,556 +DA:58,556 +DA:63,556 +DA:64,556 +DA:65,10 +DA:67,556 +DA:68,608 +BRDA:27,0,0,150 +BRDA:27,0,1,632 +BRDA:27,1,2,32 +BRDA:27,1,3,750 +BRDA:27,2,4,82 +BRDA:27,2,5,668 +BRDA:27,3,6,10 +BRDA:27,3,7,658 +BRDA:27,4,8,26 +BRDA:27,4,9,632 +BRDA:31,0,0,12 +BRDA:31,0,1,620 +BRDA:31,1,2,6 +BRDA:31,1,3,614 +BRDA:34,0,0,6 +BRDA:34,0,1,608 +BRDA:38,0,0,52 +BRDA:38,0,1,556 +BRDA:64,0,0,10 +BRDA:64,0,1,546 +BRF:20 +BRH:20 +LF:31 +LH:31 +end_of_record +SF:/home/user/sources/ethereum/evmone/lib/evmone_precompiles/sha256.cpp +FN:476,sha256.cpp:_ZN6evmone6cryptoL28select_sha256_implementationEv +FN:714,_ZN6evmone6crypto6sha256EPSt4bytePKS1_m +FN:471,sha256.cpp:_ZN6evmone6cryptoL5cpuidEPii +FN:268,sha256.cpp:_ZN6evmone6cryptoL15sha_256_x86_shaEPjPKSt4bytem +FN:255,sha256.cpp:_ZN6evmone6cryptoL3setEmm +FN:70,_ZN6evmone6crypto11BufferStateC2EPKSt4bytem +FN:75,sha256.cpp:_ZN6evmone6cryptoL10calc_chunkEPhPNS0_11BufferStateE +FN:240,sha256.cpp:_ZN6evmone6cryptoL15sha_256_genericEPjPKSt4bytem +FN:140,sha256.cpp:_ZN6evmone6cryptoL22sha_256_implementationEPjPKSt4bytem +FN:250,sha256.cpp:_ZN6evmone6cryptoL15sha_256_x86_bmiEPjPKSt4bytem +FNDA:2,sha256.cpp:_ZN6evmone6cryptoL28select_sha256_implementationEv +FNDA:66386,_ZN6evmone6crypto6sha256EPSt4bytePKS1_m +FNDA:6,sha256.cpp:_ZN6evmone6cryptoL5cpuidEPii +FNDA:66386,sha256.cpp:_ZN6evmone6cryptoL15sha_256_x86_shaEPjPKSt4bytem +FNDA:1521682,sha256.cpp:_ZN6evmone6cryptoL3setEmm +FNDA:66386,_ZN6evmone6crypto11BufferStateC2EPKSt4bytem +FNDA:157342,sha256.cpp:_ZN6evmone6cryptoL10calc_chunkEPhPNS0_11BufferStateE +FNDA:0,sha256.cpp:_ZN6evmone6cryptoL15sha_256_genericEPjPKSt4bytem +FNDA:0,sha256.cpp:_ZN6evmone6cryptoL22sha_256_implementationEPjPKSt4bytem +FNDA:0,sha256.cpp:_ZN6evmone6cryptoL15sha_256_x86_bmiEPjPKSt4bytem +FNF:10 +FNH:7 +DA:39,231040 +DA:40,132778 +DA:70,66386 +DA:71,66386 +DA:75,157342 +DA:76,157342 +DA:77,66386 +DA:78,66386 +DA:79,66386 +DA:81,90956 +DA:82,24564 +DA:83,24564 +DA:84,24564 +DA:85,24564 +DA:86,24564 +DA:87,24564 +DA:89,66392 +DA:90,66392 +DA:91,3713 +DA:92,3713 +DA:93,3713 +DA:94,3713 +DA:95,3713 +DA:96,66392 +DA:99,66392 +DA:100,66386 +DA:101,66386 +DA:102,66386 +DA:103,66386 +DA:104,66386 +DA:112,66392 +DA:113,66386 +DA:114,66386 +DA:115,66386 +DA:116,66386 +DA:117,66386 +DA:118,66386 +DA:121,66386 +DA:122,66386 +DA:123,531088 +DA:124,464702 +DA:125,464702 +DA:126,464702 +DA:127,464702 +DA:128,66386 +DA:129,66386 +DA:130,6 +DA:131,6 +DA:132,6 +DA:133,6 +DA:135,66392 +DA:136,90956 +DA:140,0 +DA:155,0 +DA:158,0 +DA:160,0 +DA:161,0 +DA:162,0 +DA:163,0 +DA:165,0 +DA:167,0 +DA:168,0 +DA:169,0 +DA:170,0 +DA:172,0 +DA:187,0 +DA:190,0 +DA:191,0 +DA:192,0 +DA:193,0 +DA:194,0 +DA:195,0 +DA:196,0 +DA:197,0 +DA:198,0 +DA:199,0 +DA:200,0 +DA:201,0 +DA:204,0 +DA:205,0 +DA:206,0 +DA:207,0 +DA:208,0 +DA:209,0 +DA:210,0 +DA:211,0 +DA:212,0 +DA:213,0 +DA:214,0 +DA:215,0 +DA:216,0 +DA:217,0 +DA:218,0 +DA:220,0 +DA:221,0 +DA:222,0 +DA:223,0 +DA:224,0 +DA:225,0 +DA:226,0 +DA:227,0 +DA:228,0 +DA:229,0 +DA:232,0 +DA:233,0 +DA:234,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:240,0 +DA:241,0 +DA:242,0 +DA:250,0 +DA:251,0 +DA:252,0 +DA:255,1521682 +DA:257,1521682 +DA:258,1521682 +DA:268,66386 +DA:270,66386 +DA:271,66386 +DA:272,66386 +DA:273,66386 +DA:276,66386 +DA:281,66386 +DA:282,66386 +DA:284,66386 +DA:285,66386 +DA:286,66386 +DA:287,66386 +DA:289,66386 +DA:292,66386 +DA:294,157342 +DA:295,90956 +DA:297,90956 +DA:298,90956 +DA:301,90956 +DA:302,90956 +DA:303,90956 +DA:304,90956 +DA:305,90956 +DA:306,90956 +DA:309,90956 +DA:310,90956 +DA:311,90956 +DA:312,90956 +DA:313,90956 +DA:314,90956 +DA:315,90956 +DA:318,90956 +DA:319,90956 +DA:320,90956 +DA:321,90956 +DA:322,90956 +DA:323,90956 +DA:324,90956 +DA:327,90956 +DA:328,90956 +DA:329,90956 +DA:330,90956 +DA:331,90956 +DA:332,90956 +DA:333,90956 +DA:334,90956 +DA:335,90956 +DA:336,90956 +DA:339,90956 +DA:340,90956 +DA:341,90956 +DA:342,90956 +DA:343,90956 +DA:344,90956 +DA:345,90956 +DA:346,90956 +DA:349,90956 +DA:350,90956 +DA:351,90956 +DA:352,90956 +DA:353,90956 +DA:354,90956 +DA:355,90956 +DA:356,90956 +DA:359,90956 +DA:360,90956 +DA:361,90956 +DA:362,90956 +DA:363,90956 +DA:364,90956 +DA:365,90956 +DA:366,90956 +DA:369,90956 +DA:370,90956 +DA:371,90956 +DA:372,90956 +DA:373,90956 +DA:374,90956 +DA:375,90956 +DA:376,90956 +DA:379,90956 +DA:380,90956 +DA:381,90956 +DA:382,90956 +DA:383,90956 +DA:384,90956 +DA:385,90956 +DA:386,90956 +DA:389,90956 +DA:390,90956 +DA:391,90956 +DA:392,90956 +DA:393,90956 +DA:394,90956 +DA:395,90956 +DA:396,90956 +DA:399,90956 +DA:400,90956 +DA:401,90956 +DA:402,90956 +DA:403,90956 +DA:404,90956 +DA:405,90956 +DA:406,90956 +DA:409,90956 +DA:410,90956 +DA:411,90956 +DA:412,90956 +DA:413,90956 +DA:414,90956 +DA:415,90956 +DA:416,90956 +DA:419,90956 +DA:420,90956 +DA:421,90956 +DA:422,90956 +DA:423,90956 +DA:424,90956 +DA:425,90956 +DA:426,90956 +DA:429,90956 +DA:430,90956 +DA:431,90956 +DA:432,90956 +DA:433,90956 +DA:434,90956 +DA:435,90956 +DA:438,90956 +DA:439,90956 +DA:440,90956 +DA:441,90956 +DA:442,90956 +DA:443,90956 +DA:444,90956 +DA:447,90956 +DA:448,90956 +DA:449,90956 +DA:450,90956 +DA:453,90956 +DA:454,90956 +DA:455,90956 +DA:457,66386 +DA:458,66386 +DA:459,66386 +DA:460,66386 +DA:463,66386 +DA:464,66386 +DA:467,66386 +DA:471,6 +DA:472,6 +DA:473,6 +DA:476,2 +DA:477,2 +DA:478,2 +DA:479,2 +DA:481,2 +DA:482,2 +DA:483,2 +DA:484,2 +DA:486,2 +DA:487,2 +DA:488,2 +DA:489,2 +DA:490,2 +DA:491,2 +DA:492,2 +DA:493,2 +DA:494,2 +DA:495,2 +DA:496,2 +DA:497,2 +DA:499,2 +DA:500,2 +DA:501,2 +DA:502,2 +DA:503,0 +DA:504,0 +DA:505,0 +DA:506,0 +DA:507,2 +DA:714,66386 +DA:719,66386 +DA:720,66386 +DA:722,66386 +DA:725,597474 +DA:726,531088 +DA:727,531088 +DA:728,531088 +DA:729,531088 +DA:730,531088 +DA:731,531088 +DA:732,66386 +BRDA:76,0,0,66386 +BRDA:76,0,1,90956 +BRDA:81,0,0,24564 +BRDA:81,0,1,66392 +BRDA:90,0,0,3713 +BRDA:90,0,1,62679 +BRDA:99,0,0,66386 +BRDA:99,0,1,6 +BRDA:112,0,0,66386 +BRDA:112,0,1,6 +BRDA:123,0,0,464702 +BRDA:123,0,1,66386 +BRDA:160,0,0,- +BRDA:160,0,1,- +BRDA:167,0,0,- +BRDA:167,0,1,- +BRDA:190,0,0,- +BRDA:190,0,1,- +BRDA:192,0,0,- +BRDA:192,0,1,- +BRDA:194,0,0,- +BRDA:194,0,1,- +BRDA:232,0,0,- +BRDA:232,0,1,- +BRDA:294,0,0,90956 +BRDA:294,0,1,66386 +BRDA:486,0,0,2 +BRDA:486,0,1,0 +BRDA:491,0,0,2 +BRDA:491,0,1,0 +BRDA:499,0,0,2 +BRDA:499,0,1,0 +BRDA:499,1,2,2 +BRDA:499,1,3,0 +BRDA:503,0,0,- +BRDA:503,0,1,- +BRDA:503,1,2,- +BRDA:503,1,3,- +BRDA:725,0,0,531088 +BRDA:725,0,1,66386 +BRF:40 +BRH:20 +LF:307 +LH:240 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/blockchaintest/blockchaintest.cpp +FN:110,main +FN:76,blockchaintest.cpp:_ZN12_GLOBAL__N_119register_test_filesERKNSt10filesystem7__cxx114pathERN4evmc2VME +FN:81,blockchaintest.cpp:_ZZN12_GLOBAL__N_119register_test_filesERKNSt10filesystem7__cxx114pathERN4evmc2VMEENK3$_0clERKNS1_15directory_entryE +FN:42,blockchaintest.cpp:_ZN12_GLOBAL__N_119BlockchainGTestFile12register_oneERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNSt10filesystem7__cxx114pathERN4evmc2VME +FN:45,blockchaintest.cpp:_ZZN12_GLOBAL__N_119BlockchainGTestFile12register_oneERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNSt10filesystem7__cxx114pathERN4evmc2VMEENKUlvE_clEv +FN:24,blockchaintest.cpp:_ZN12_GLOBAL__N_119BlockchainGTestFileC2ENSt10filesystem7__cxx114pathERN4evmc2VME +FN:28,blockchaintest.cpp:_ZN12_GLOBAL__N_119BlockchainGTestFile8TestBodyEv +FN:68,blockchaintest.cpp:_ZN12_GLOBAL__N_115BlockchainGTest12register_oneERKN6evmone4test14BlockchainTestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESD_RKNSt10filesystem7__cxx114pathERN4evmc2VME +FN:71,blockchaintest.cpp:_ZZN12_GLOBAL__N_115BlockchainGTest12register_oneERKN6evmone4test14BlockchainTestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESD_RKNSt10filesystem7__cxx114pathERN4evmc2VMEENKUlvE_clEv +FN:57,blockchaintest.cpp:_ZN12_GLOBAL__N_115BlockchainGTestC2EN6evmone4test14BlockchainTestERN4evmc2VME +FN:61,blockchaintest.cpp:_ZN12_GLOBAL__N_115BlockchainGTest8TestBodyEv +FNDA:1,main +FNDA:1,blockchaintest.cpp:_ZN12_GLOBAL__N_119register_test_filesERKNSt10filesystem7__cxx114pathERN4evmc2VME +FNDA:2951,blockchaintest.cpp:_ZZN12_GLOBAL__N_119register_test_filesERKNSt10filesystem7__cxx114pathERN4evmc2VMEENK3$_0clERKNS1_15directory_entryE +FNDA:2819,blockchaintest.cpp:_ZN12_GLOBAL__N_119BlockchainGTestFile12register_oneERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNSt10filesystem7__cxx114pathERN4evmc2VME +FNDA:2819,blockchaintest.cpp:_ZZN12_GLOBAL__N_119BlockchainGTestFile12register_oneERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNSt10filesystem7__cxx114pathERN4evmc2VMEENKUlvE_clEv +FNDA:2819,blockchaintest.cpp:_ZN12_GLOBAL__N_119BlockchainGTestFileC2ENSt10filesystem7__cxx114pathERN4evmc2VME +FNDA:2819,blockchaintest.cpp:_ZN12_GLOBAL__N_119BlockchainGTestFile8TestBodyEv +FNDA:0,blockchaintest.cpp:_ZN12_GLOBAL__N_115BlockchainGTest12register_oneERKN6evmone4test14BlockchainTestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESD_RKNSt10filesystem7__cxx114pathERN4evmc2VME +FNDA:0,blockchaintest.cpp:_ZZN12_GLOBAL__N_115BlockchainGTest12register_oneERKN6evmone4test14BlockchainTestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESD_RKNSt10filesystem7__cxx114pathERN4evmc2VMEENKUlvE_clEv +FNDA:0,blockchaintest.cpp:_ZN12_GLOBAL__N_115BlockchainGTestC2EN6evmone4test14BlockchainTestERN4evmc2VME +FNDA:0,blockchaintest.cpp:_ZN12_GLOBAL__N_115BlockchainGTest8TestBodyEv +FNF:11 +FNH:7 +DA:24,2819 +DA:25,2819 +DA:28,2819 +DA:29,2819 +DA:31,2819 +DA:32,2819 +DA:33,2819 +DA:34,2819 +DA:35,2819 +DA:36,2819 +DA:37,2 +DA:38,2 +DA:39,2819 +DA:42,2819 +DA:43,2819 +DA:44,2819 +DA:45,2819 +DA:46,2819 +DA:57,0 +DA:58,0 +DA:61,0 +DA:62,0 +DA:63,0 +DA:68,0 +DA:69,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:76,1 +DA:77,1 +DA:78,1 +DA:79,1 +DA:80,1 +DA:81,2951 +DA:83,2951 +DA:84,2951 +DA:85,2951 +DA:86,1 +DA:88,1 +DA:89,2819 +DA:90,1 +DA:91,0 +DA:92,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,1 +DA:110,1 +DA:111,1 +DA:112,1 +DA:113,1 +DA:115,1 +DA:117,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:122,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:127,1 +DA:128,1 +DA:130,1 +DA:132,1 +DA:134,1 +DA:135,0 +DA:137,1 +DA:138,1 +DA:140,1 +DA:141,1 +DA:142,1 +DA:143,1 +DA:144,0 +DA:145,0 +DA:146,0 +DA:147,1 +BRDA:77,0,0,1 +BRDA:77,0,1,0 +BRDA:83,0,0,2819 +BRDA:83,0,1,132 +BRDA:83,1,2,2819 +BRDA:83,1,3,0 +BRDA:84,0,0,2819 +BRDA:84,0,1,0 +BRDA:88,0,0,2819 +BRDA:88,0,1,1 +BRDA:97,0,0,- +BRDA:97,0,1,- +BRDA:134,0,0,0 +BRDA:134,0,1,1 +BRDA:137,0,0,1 +BRDA:137,0,1,1 +BRF:16 +BRH:10 +LF:90 +LH:61 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/blockchaintest/blockchaintest_runner.cpp +FN:258,_ZN6evmone4test20run_blockchain_testsESt4spanIKNS0_14BlockchainTestELm18446744073709551615EERN4evmc2VME +FN:120,blockchaintest_runner.cpp:_ZN6evmone4test12_GLOBAL__N_114validate_blockE13evmc_revisionNS_5state10BlobParamsERKNS0_9TestBlockEPKNS0_11BlockHeaderEb +FN:47,blockchaintest_runner.cpp:_ZN6evmone4test12_GLOBAL__N_111apply_blockERKNS0_9TestStateERN4evmc2VMERKNS_5state9BlockInfoERKNS8_11BlockHashesERKSt6vectorINS8_11TransactionESaISG_EE13evmc_revisionSt8optionalIlE +FN:91,blockchaintest_runner.cpp:_ZZN6evmone4test12_GLOBAL__N_111apply_blockERKNS0_9TestStateERN4evmc2VMERKNS_5state9BlockInfoERKNS8_11BlockHashesERKSt6vectorINS8_11TransactionESaISG_EE13evmc_revisionSt8optionalIlEENK3$_0clEv +FN:221,blockchaintest_runner.cpp:_ZN6evmone4test12_GLOBAL__N_113mining_rewardE13evmc_revision +FN:232,blockchaintest_runner.cpp:_ZN6evmone4test12_GLOBAL__N_111print_stateB5cxx11ERKNS0_9TestStateE +FNDA:2817,_ZN6evmone4test20run_blockchain_testsESt4spanIKNS0_14BlockchainTestELm18446744073709551615EERN4evmc2VME +FNDA:91148,blockchaintest_runner.cpp:_ZN6evmone4test12_GLOBAL__N_114validate_blockE13evmc_revisionNS_5state10BlobParamsERKNS0_9TestBlockEPKNS0_11BlockHeaderEb +FNDA:89819,blockchaintest_runner.cpp:_ZN6evmone4test12_GLOBAL__N_111apply_blockERKNS0_9TestStateERN4evmc2VMERKNS_5state9BlockInfoERKNS8_11BlockHashesERKSt6vectorINS8_11TransactionESaISG_EE13evmc_revisionSt8optionalIlE +FNDA:89819,blockchaintest_runner.cpp:_ZZN6evmone4test12_GLOBAL__N_111apply_blockERKNS0_9TestStateERN4evmc2VMERKNS_5state9BlockInfoERKNS8_11BlockHashesERKSt6vectorINS8_11TransactionESaISG_EE13evmc_revisionSt8optionalIlEENK3$_0clEv +FNDA:89819,blockchaintest_runner.cpp:_ZN6evmone4test12_GLOBAL__N_113mining_rewardE13evmc_revision +FNDA:0,blockchaintest_runner.cpp:_ZN6evmone4test12_GLOBAL__N_111print_stateB5cxx11ERKNS0_9TestStateE +FNF:6 +FNH:5 +DA:47,89819 +DA:48,89819 +DA:49,89819 +DA:51,89819 +DA:52,89819 +DA:53,89819 +DA:55,89819 +DA:56,89819 +DA:58,89819 +DA:60,181348 +DA:61,91529 +DA:62,91529 +DA:64,91529 +DA:65,91529 +DA:66,91529 +DA:68,91529 +DA:69,3575 +DA:70,3575 +DA:71,3575 +DA:72,3575 +DA:73,87954 +DA:74,87954 +DA:75,87954 +DA:77,87954 +DA:79,87954 +DA:80,87954 +DA:81,87954 +DA:82,87954 +DA:83,1942 +DA:85,87954 +DA:86,87954 +DA:87,87954 +DA:88,87954 +DA:89,91529 +DA:91,89819 +DA:92,89819 +DA:94,89819 +DA:95,47063 +DA:96,47063 +DA:97,47063 +DA:98,44 +DA:99,47019 +DA:100,47019 +DA:102,89775 +DA:103,89775 +DA:104,16 +DA:105,89759 +DA:107,89759 +DA:108,89775 +DA:110,89819 +DA:112,89819 +DA:114,89819 +DA:115,89819 +DA:116,89819 +DA:120,91148 +DA:124,91148 +DA:125,0 +DA:127,91148 +DA:128,13 +DA:130,91135 +DA:131,13 +DA:134,91122 +DA:135,91122 +DA:136,91122 +DA:137,91122 +DA:138,13 +DA:139,91109 +DA:140,91109 +DA:141,39 +DA:144,91070 +DA:145,13 +DA:148,91057 +DA:149,91057 +DA:150,13 +DA:152,91044 +DA:153,91044 +DA:154,91044 +DA:155,91044 +DA:156,0 +DA:158,91044 +DA:159,0 +DA:162,91044 +DA:163,0 +DA:166,0 +DA:167,0 +DA:168,0 +DA:170,91044 +DA:171,0 +DA:173,91044 +DA:174,77887 +DA:175,77887 +DA:176,77887 +DA:177,77887 +DA:178,6 +DA:179,77887 +DA:181,91038 +DA:182,68106 +DA:184,68106 +DA:185,68106 +DA:186,3 +DA:191,68103 +DA:192,68103 +DA:193,68103 +DA:194,68103 +DA:195,68103 +DA:196,68103 +DA:197,1002 +DA:200,67101 +DA:201,209 +DA:202,67101 +DA:203,22932 +DA:204,22932 +DA:205,22932 +DA:206,22932 +DA:207,3 +DA:208,22932 +DA:211,89821 +DA:212,0 +DA:214,89821 +DA:215,2 +DA:217,89819 +DA:218,89821 +DA:221,89819 +DA:222,89819 +DA:223,2462 +DA:224,87357 +DA:225,1805 +DA:226,85552 +DA:227,11921 +DA:228,73631 +DA:229,85552 +DA:232,0 +DA:233,0 +DA:235,0 +DA:236,0 +DA:237,0 +DA:238,0 +DA:239,0 +DA:240,0 +DA:242,0 +DA:243,0 +DA:244,0 +DA:245,0 +DA:246,0 +DA:247,0 +DA:248,0 +DA:249,0 +DA:250,0 +DA:251,0 +DA:253,0 +DA:254,0 +DA:258,2817 +DA:259,72330 +DA:260,69513 +DA:261,69513 +DA:262,69513 +DA:263,69513 +DA:264,69513 +DA:267,69513 +DA:268,69513 +DA:269,69513 +DA:270,69513 +DA:271,69513 +DA:272,69513 +DA:273,69513 +DA:274,69513 +DA:275,69513 +DA:277,69513 +DA:278,69513 +DA:280,69513 +DA:281,69513 +DA:282,69513 +DA:283,69513 +DA:284,69513 +DA:285,69513 +DA:286,69513 +DA:287,69513 +DA:288,69513 +DA:289,69513 +DA:290,69513 +DA:292,160661 +DA:293,91148 +DA:294,91148 +DA:295,91148 +DA:297,91148 +DA:298,91148 +DA:299,91148 +DA:300,91148 +DA:301,91148 +DA:303,91148 +DA:304,91148 +DA:306,91148 +DA:307,91148 +DA:309,91148 +DA:310,85993 +DA:311,171986 +DA:312,171986 +DA:313,171986 +DA:316,85993 +DA:317,85993 +DA:319,85993 +DA:320,85993 +DA:322,85993 +DA:324,85993 +DA:325,85993 +DA:326,85993 +DA:327,85993 +DA:328,85993 +DA:329,85993 +DA:330,85993 +DA:331,85993 +DA:332,85993 +DA:333,85993 +DA:334,85993 +DA:335,85993 +DA:336,85993 +DA:337,85993 +DA:338,85993 +DA:340,171986 +DA:341,171986 +DA:342,171986 +DA:343,171986 +DA:345,85993 +DA:346,85993 +DA:348,85993 +DA:349,67346 +DA:350,67346 +DA:351,67346 +DA:352,67346 +DA:354,85993 +DA:355,85993 +DA:356,85993 +DA:357,85993 +DA:358,85993 +DA:359,44853 +DA:360,44853 +DA:361,44853 +DA:362,44853 +DA:363,85993 +DA:364,85993 +DA:365,85993 +DA:366,85993 +DA:367,5155 +DA:368,5155 +DA:369,5155 +DA:370,1329 +DA:373,5155 +DA:374,3826 +DA:376,3826 +DA:377,3826 +DA:378,3826 +DA:379,60 +DA:380,3766 +DA:381,3557 +DA:382,209 +DA:383,111 +DA:385,98 +DA:386,0 +DA:388,98 +DA:389,98 +DA:390,12 +DA:391,86 +DA:392,86 +DA:393,0 +DA:394,86 +DA:395,0 +DA:396,86 +DA:397,86 +DA:398,86 +DA:399,0 +DA:400,0 +DA:401,0 +DA:402,0 +DA:403,0 +DA:405,0 +DA:406,0 +DA:407,91148 +DA:408,69513 +DA:409,69513 +DA:410,69513 +DA:411,69513 +DA:412,139026 +DA:413,139026 +DA:414,139026 +DA:415,139026 +DA:416,0 +DA:417,0 +DA:418,139026 +DA:419,69513 +DA:420,2817 +BRDA:60,0,0,91529 +BRDA:60,0,1,89819 +BRDA:68,0,0,3575 +BRDA:68,0,1,87954 +BRDA:82,0,0,1942 +BRDA:82,0,1,86012 +BRDA:94,0,0,47063 +BRDA:94,0,1,42756 +BRDA:97,0,0,44 +BRDA:97,0,1,47019 +BRDA:103,0,0,16 +BRDA:103,0,1,89759 +BRDA:124,0,0,0 +BRDA:124,0,1,91148 +BRDA:127,0,0,13 +BRDA:127,0,1,91135 +BRDA:130,0,0,13 +BRDA:130,0,1,91122 +BRDA:136,0,0,13 +BRDA:136,0,1,91109 +BRDA:139,0,0,39 +BRDA:139,0,1,91070 +BRDA:144,0,0,13 +BRDA:144,0,1,91057 +BRDA:148,0,0,13 +BRDA:148,0,1,91044 +BRDA:152,0,0,0 +BRDA:152,0,1,91044 +BRDA:158,0,0,74855 +BRDA:158,0,1,16189 +BRDA:158,1,2,0 +BRDA:158,1,3,74855 +BRDA:162,0,0,0 +BRDA:162,0,1,91044 +BRDA:166,0,0,- +BRDA:166,0,1,- +BRDA:166,1,2,- +BRDA:166,1,3,- +BRDA:170,0,0,0 +BRDA:170,0,1,91044 +BRDA:173,0,0,77887 +BRDA:173,0,1,13157 +BRDA:177,0,0,6 +BRDA:177,0,1,77881 +BRDA:181,0,0,68106 +BRDA:181,0,1,22932 +BRDA:184,0,0,2 +BRDA:184,0,1,68104 +BRDA:185,0,0,1 +BRDA:185,0,1,68103 +BRDA:193,0,0,1002 +BRDA:193,0,1,67101 +BRDA:200,0,0,209 +BRDA:200,0,1,66892 +BRDA:205,0,0,2 +BRDA:205,0,1,22930 +BRDA:206,0,0,1 +BRDA:206,0,1,22929 +BRDA:211,0,0,0 +BRDA:211,0,1,89821 +BRDA:214,0,0,23601 +BRDA:214,0,1,66220 +BRDA:214,1,2,2 +BRDA:214,1,3,23599 +BRDA:222,0,0,2462 +BRDA:222,0,1,87357 +BRDA:224,0,0,1805 +BRDA:224,0,1,85552 +BRDA:226,0,0,11921 +BRDA:226,0,1,73631 +BRDA:235,0,0,- +BRDA:235,0,1,- +BRDA:242,0,0,- +BRDA:242,0,1,- +BRDA:245,0,0,- +BRDA:245,0,1,- +BRDA:247,0,0,- +BRDA:247,0,1,- +BRDA:259,0,0,69513 +BRDA:259,0,1,2817 +BRDA:267,0,0,69513 +BRDA:267,0,1,0 +BRDA:267,1,2,0 +BRDA:267,1,3,69513 +BRDA:267,2,4,69513 +BRDA:267,2,5,0 +BRDA:268,0,0,69513 +BRDA:268,0,1,0 +BRDA:268,1,2,0 +BRDA:268,1,3,69513 +BRDA:268,2,4,69513 +BRDA:268,2,5,0 +BRDA:269,0,0,69513 +BRDA:269,0,1,0 +BRDA:269,1,2,0 +BRDA:269,1,3,69513 +BRDA:269,2,4,69513 +BRDA:269,2,5,0 +BRDA:270,0,0,0 +BRDA:270,0,1,69513 +BRDA:270,1,2,69513 +BRDA:270,1,3,0 +BRDA:270,2,4,69513 +BRDA:270,2,5,0 +BRDA:271,0,0,69513 +BRDA:271,0,1,0 +BRDA:271,1,2,0 +BRDA:271,1,3,69513 +BRDA:271,2,4,69513 +BRDA:271,2,5,0 +BRDA:275,0,0,69513 +BRDA:275,0,1,0 +BRDA:275,1,2,0 +BRDA:275,1,3,69513 +BRDA:275,2,4,69513 +BRDA:275,2,5,0 +BRDA:292,0,0,91148 +BRDA:292,0,1,69513 +BRDA:299,0,0,91148 +BRDA:299,0,1,0 +BRDA:301,0,0,91148 +BRDA:301,0,1,0 +BRDA:301,1,2,0 +BRDA:301,1,3,91148 +BRDA:309,0,0,85993 +BRDA:309,0,1,5155 +BRDA:311,0,0,85993 +BRDA:311,0,1,0 +BRDA:311,1,2,0 +BRDA:311,1,3,85993 +BRDA:311,2,4,85993 +BRDA:311,2,5,0 +BRDA:322,0,0,85993 +BRDA:322,0,1,0 +BRDA:322,1,2,0 +BRDA:322,1,3,85993 +BRDA:322,2,4,85993 +BRDA:322,2,5,0 +BRDA:334,0,0,85993 +BRDA:334,0,1,0 +BRDA:340,0,0,85993 +BRDA:340,0,1,0 +BRDA:340,1,2,85993 +BRDA:340,1,3,0 +BRDA:340,2,4,0 +BRDA:340,2,5,85993 +BRDA:342,0,0,85993 +BRDA:342,0,1,0 +BRDA:342,1,2,0 +BRDA:342,1,3,85993 +BRDA:342,2,4,85993 +BRDA:342,2,5,0 +BRDA:345,0,0,85993 +BRDA:345,0,1,0 +BRDA:345,1,2,0 +BRDA:345,1,3,85993 +BRDA:345,2,4,85993 +BRDA:345,2,5,0 +BRDA:348,0,0,67346 +BRDA:348,0,1,18647 +BRDA:350,0,0,0 +BRDA:350,0,1,67346 +BRDA:350,1,2,67346 +BRDA:350,1,3,0 +BRDA:350,2,4,67346 +BRDA:350,2,5,0 +BRDA:354,0,0,85993 +BRDA:354,0,1,0 +BRDA:354,1,2,0 +BRDA:354,1,3,85993 +BRDA:354,2,4,85993 +BRDA:354,2,5,0 +BRDA:356,0,0,85993 +BRDA:356,0,1,0 +BRDA:356,1,2,0 +BRDA:356,1,3,85993 +BRDA:356,2,4,85993 +BRDA:356,2,5,0 +BRDA:358,0,0,44853 +BRDA:358,0,1,41140 +BRDA:360,0,0,44853 +BRDA:360,0,1,0 +BRDA:360,1,2,44853 +BRDA:360,1,3,0 +BRDA:360,2,4,0 +BRDA:360,2,5,44853 +BRDA:363,0,0,85993 +BRDA:363,0,1,0 +BRDA:363,1,2,0 +BRDA:363,1,3,85993 +BRDA:363,2,4,85993 +BRDA:363,2,5,0 +BRDA:364,0,0,85993 +BRDA:364,0,1,0 +BRDA:364,1,2,0 +BRDA:364,1,3,85993 +BRDA:364,2,4,85993 +BRDA:364,2,5,0 +BRDA:369,0,0,1329 +BRDA:369,0,1,3826 +BRDA:378,0,0,60 +BRDA:378,0,1,3766 +BRDA:380,0,0,3557 +BRDA:380,0,1,209 +BRDA:382,0,0,111 +BRDA:382,0,1,98 +BRDA:385,0,0,0 +BRDA:385,0,1,98 +BRDA:388,0,0,12 +BRDA:388,0,1,86 +BRDA:388,1,2,98 +BRDA:388,1,3,0 +BRDA:388,2,4,12 +BRDA:388,2,5,86 +BRDA:391,0,0,0 +BRDA:391,0,1,86 +BRDA:394,0,0,0 +BRDA:394,0,1,86 +BRDA:396,0,0,86 +BRDA:396,0,1,0 +BRDA:396,1,2,86 +BRDA:396,1,3,0 +BRDA:396,2,4,86 +BRDA:396,2,5,0 +BRDA:399,0,0,- +BRDA:399,0,1,- +BRDA:401,0,0,- +BRDA:401,0,1,- +BRDA:405,0,0,- +BRDA:405,0,1,- +BRDA:405,1,2,- +BRDA:405,1,3,- +BRDA:405,2,4,- +BRDA:405,2,5,- +BRDA:409,0,0,69513 +BRDA:409,0,1,0 +BRDA:412,0,0,69513 +BRDA:412,0,1,0 +BRDA:412,1,2,69513 +BRDA:412,1,3,0 +BRDA:412,2,4,0 +BRDA:412,2,5,69513 +BRDA:415,0,0,- +BRDA:415,0,1,- +BRF:244 +BRH:148 +LF:305 +LH:264 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/account.hpp +FN:82,_ZNK6evmone5state7Account8is_emptyEv +FNDA:2326235,_ZNK6evmone5state7Account8is_emptyEv +FNF:1 +FNH:1 +DA:82,2326235 +DA:83,2326235 +DA:84,2326235 +BRDA:83,0,0,1980367 +BRDA:83,0,1,345868 +BRDA:83,1,2,1037658 +BRDA:83,1,3,942709 +BRDA:83,2,4,306984 +BRDA:83,2,5,730674 +BRF:6 +BRH:6 +LF:3 +LH:3 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/block.cpp +FN:15,_ZN6evmone5state13calc_base_feeEllm +FN:42,_ZN6evmone5state22max_blob_gas_per_blockERKNS0_10BlobParamsE +FN:49,_ZN6evmone5state22compute_blob_gas_priceERKNS0_10BlobParamsEm +FN:80,_ZN6evmone5state20calc_excess_blob_gasE13evmc_revisionRKNS0_10BlobParamsEmmmRKN4intx4uintILj256EEE +FN:53,block.cpp:_ZZN6evmone5state22compute_blob_gas_priceERKNS0_10BlobParamsEmENK3$_0clEmmm +FNDA:77887,_ZN6evmone5state13calc_base_feeEllm +FNDA:130906,_ZN6evmone5state22max_blob_gas_per_blockERKNS0_10BlobParamsE +FNDA:200041,_ZN6evmone5state22compute_blob_gas_priceERKNS0_10BlobParamsEm +FNDA:68103,_ZN6evmone5state20calc_excess_blob_gasE13evmc_revisionRKNS0_10BlobParamsEmmmRKN4intx4uintILj256EEE +FNDA:200041,block.cpp:_ZZN6evmone5state22compute_blob_gas_priceERKNS0_10BlobParamsEmENK3$_0clEmmm +FNF:5 +FNH:5 +DA:15,77887 +DA:16,77887 +DA:19,77887 +DA:20,672 +DA:21,672 +DA:22,672 +DA:23,77215 +DA:24,15 +DA:25,15 +DA:26,15 +DA:27,15 +DA:28,15 +DA:29,15 +DA:30,15 +DA:31,15 +DA:32,77200 +DA:33,77200 +DA:34,77200 +DA:35,77200 +DA:36,77200 +DA:37,77200 +DA:38,77200 +DA:39,77887 +DA:42,130906 +DA:43,130906 +DA:44,130906 +DA:49,200041 +DA:52,200041 +DA:53,200041 +DA:54,200041 +DA:55,200041 +DA:56,200041 +DA:57,200041 +DA:58,507310 +DA:59,307749 +DA:60,307749 +DA:62,307749 +DA:63,307749 +DA:64,307269 +DA:65,480 +DA:66,480 +DA:67,307269 +DA:68,307269 +DA:69,199561 +DA:70,200041 +DA:72,200041 +DA:73,200041 +DA:74,200041 +DA:75,200041 +DA:80,68103 +DA:82,68103 +DA:84,68103 +DA:85,68103 +DA:86,60400 +DA:88,7703 +DA:89,201 +DA:90,201 +DA:92,7502 +DA:93,7703 +BRDA:19,0,0,672 +BRDA:19,0,1,77215 +BRDA:23,0,0,15 +BRDA:23,0,1,77200 +BRDA:58,0,0,307749 +BRDA:58,0,1,199561 +BRDA:63,0,0,307269 +BRDA:63,0,1,480 +BRDA:85,0,0,60400 +BRDA:85,0,1,7703 +BRDA:88,0,0,201 +BRDA:88,0,1,7502 +BRDA:88,1,2,2857 +BRDA:88,1,3,4846 +BRDA:88,2,4,201 +BRDA:88,2,5,2656 +BRF:16 +BRH:16 +LF:76 +LH:76 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/block.hpp +FN:29,_ZNK6evmone5state10Withdrawal10get_amountEv +FNDA:4168,_ZNK6evmone5state10Withdrawal10get_amountEv +FNF:1 +FNH:1 +DA:29,4168 +DA:30,4168 +DA:31,4168 +BRF:0 +BRH:0 +LF:3 +LH:3 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/bloom_filter.cpp +FN:34,_ZN6evmone5state20compute_bloom_filterESt4spanIKNS0_3LogELm18446744073709551615EE +FN:47,_ZN6evmone5state20compute_bloom_filterESt4spanIKNS0_18TransactionReceiptELm18446744073709551615EE +FN:58,_ZN6evmone5state23bloom_filter_from_bytesERKSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:17,bloom_filter.cpp:_ZN6evmone5state12_GLOBAL__N_16add_toERNS0_11BloomFilterERKSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:148703,_ZN6evmone5state20compute_bloom_filterESt4spanIKNS0_3LogELm18446744073709551615EE +FNDA:89819,_ZN6evmone5state20compute_bloom_filterESt4spanIKNS0_18TransactionReceiptELm18446744073709551615EE +FNDA:160663,_ZN6evmone5state23bloom_filter_from_bytesERKSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:69106,bloom_filter.cpp:_ZN6evmone5state12_GLOBAL__N_16add_toERNS0_11BloomFilterERKSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNF:4 +FNH:4 +DA:17,69106 +DA:18,69106 +DA:21,69106 +DA:22,207318 +DA:23,207318 +DA:24,207318 +DA:25,207318 +DA:26,207318 +DA:27,207318 +DA:28,207318 +DA:29,69106 +DA:34,148703 +DA:35,148703 +DA:36,148703 +DA:37,28651 +DA:38,28651 +DA:39,28651 +DA:40,40455 +DA:41,28651 +DA:43,148703 +DA:44,148703 +DA:47,89819 +DA:48,89819 +DA:50,89819 +DA:51,87954 +DA:52,87954 +DA:54,89819 +DA:55,89819 +DA:58,160663 +DA:60,160663 +DA:61,160663 +DA:62,160663 +DA:63,160663 +BRDA:21,0,0,207318 +BRDA:21,0,1,69106 +BRDA:36,0,0,28651 +BRDA:36,0,1,148703 +BRDA:39,0,0,40455 +BRDA:39,0,1,28651 +BRDA:50,0,0,87954 +BRDA:50,0,1,89819 +BRF:8 +BRH:8 +LF:33 +LH:33 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/bloom_filter.hpp +FN:21,_ZNK6evmone5state11BloomFiltercvSt17basic_string_viewIhN4evmc11byte_traitsIhEEEEv +FNDA:397797,_ZNK6evmone5state11BloomFiltercvSt17basic_string_viewIhN4evmc11byte_traitsIhEEEEv +FNF:1 +FNH:1 +DA:21,397797 +BRF:0 +BRH:0 +LF:1 +LH:1 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/errors.hpp +FN:42,_ZZN6evmone5state15evmone_categoryEvENK8Category4nameEv +FN:45,_ZZN6evmone5state15evmone_categoryEvENK8Category7messageB5cxx11Ei +FN:39,_ZN6evmone5state15evmone_categoryEv +FN:106,_ZN6evmone5state15make_error_codeENS0_9ErrorCodeE +FNDA:0,_ZZN6evmone5state15evmone_categoryEvENK8Category4nameEv +FNDA:3575,_ZZN6evmone5state15evmone_categoryEvENK8Category7messageB5cxx11Ei +FNDA:6631,_ZN6evmone5state15evmone_categoryEv +FNDA:6631,_ZN6evmone5state15make_error_codeENS0_9ErrorCodeE +FNF:4 +FNH:3 +DA:39,6631 +DA:40,6631 +DA:41,6631 +DA:42,6631 +DA:44,6631 +DA:45,6631 +DA:46,3575 +DA:47,3575 +DA:48,0 +DA:49,0 +DA:50,2183 +DA:51,2183 +DA:52,17 +DA:53,17 +DA:54,1104 +DA:55,1104 +DA:56,6 +DA:57,6 +DA:58,12 +DA:59,12 +DA:60,2 +DA:61,2 +DA:62,5 +DA:63,5 +DA:64,14 +DA:65,14 +DA:66,6 +DA:67,6 +DA:68,4 +DA:69,4 +DA:70,37 +DA:71,37 +DA:72,11 +DA:73,11 +DA:74,3 +DA:75,3 +DA:76,6 +DA:77,6 +DA:78,27 +DA:79,27 +DA:80,123 +DA:81,123 +DA:82,2 +DA:83,2 +DA:84,2 +DA:85,2 +DA:86,11 +DA:87,11 +DA:88,0 +DA:89,0 +DA:90,0 +DA:91,0 +DA:92,0 +DA:93,3575 +DA:94,3575 +DA:95,6631 +DA:97,6631 +DA:98,6631 +DA:99,6631 +DA:106,6631 +DA:107,6631 +DA:108,6631 +BRDA:48,0,0,0 +BRDA:48,0,1,3575 +BRDA:50,0,0,2183 +BRDA:50,0,1,1392 +BRDA:52,0,0,17 +BRDA:52,0,1,3558 +BRDA:54,0,0,1104 +BRDA:54,0,1,2471 +BRDA:56,0,0,6 +BRDA:56,0,1,3569 +BRDA:58,0,0,12 +BRDA:58,0,1,3563 +BRDA:60,0,0,2 +BRDA:60,0,1,3573 +BRDA:62,0,0,5 +BRDA:62,0,1,3570 +BRDA:64,0,0,14 +BRDA:64,0,1,3561 +BRDA:66,0,0,6 +BRDA:66,0,1,3569 +BRDA:68,0,0,4 +BRDA:68,0,1,3571 +BRDA:70,0,0,37 +BRDA:70,0,1,3538 +BRDA:72,0,0,11 +BRDA:72,0,1,3564 +BRDA:74,0,0,3 +BRDA:74,0,1,3572 +BRDA:76,0,0,6 +BRDA:76,0,1,3569 +BRDA:78,0,0,27 +BRDA:78,0,1,3548 +BRDA:80,0,0,123 +BRDA:80,0,1,3452 +BRDA:82,0,0,2 +BRDA:82,0,1,3573 +BRDA:84,0,0,2 +BRDA:84,0,1,3573 +BRDA:86,0,0,11 +BRDA:86,0,1,3564 +BRDA:88,0,0,0 +BRDA:88,0,1,3575 +BRDA:90,0,0,0 +BRDA:90,0,1,3575 +BRF:44 +BRH:41 +LF:112 +LH:105 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/ethash_difficulty.cpp +FN:76,_ZN6evmone5state20calculate_difficultyElblll13evmc_revision +FN:34,ethash_difficulty.cpp:_ZN6evmone5state12_GLOBAL__N_134calculate_difficulty_pre_byzantiumEllll13evmc_revision +FN:57,ethash_difficulty.cpp:_ZN6evmone5state12_GLOBAL__N_136calculate_difficulty_since_byzantiumElblll13evmc_revision +FN:14,ethash_difficulty.cpp:_ZN6evmone5state12_GLOBAL__N_114get_bomb_delayE13evmc_revision +FNDA:91044,_ZN6evmone5state20calculate_difficultyElblll13evmc_revision +FNDA:2462,ethash_difficulty.cpp:_ZN6evmone5state12_GLOBAL__N_134calculate_difficulty_pre_byzantiumEllll13evmc_revision +FNDA:13727,ethash_difficulty.cpp:_ZN6evmone5state12_GLOBAL__N_136calculate_difficulty_since_byzantiumElblll13evmc_revision +FNDA:13727,ethash_difficulty.cpp:_ZN6evmone5state12_GLOBAL__N_114get_bomb_delayE13evmc_revision +FNF:4 +FNH:4 +DA:14,13727 +DA:15,13727 +DA:16,13727 +DA:17,0 +DA:18,0 +DA:19,1805 +DA:20,1805 +DA:21,1989 +DA:22,3979 +DA:23,6114 +DA:24,6114 +DA:25,2776 +DA:26,2776 +DA:27,3032 +DA:28,3032 +DA:29,13727 +DA:30,13727 +DA:34,2462 +DA:36,2462 +DA:37,2462 +DA:39,2462 +DA:41,2462 +DA:42,1107 +DA:43,1355 +DA:44,1355 +DA:46,2462 +DA:47,0 +DA:48,2462 +DA:49,0 +DA:51,2462 +DA:52,2462 +DA:57,13727 +DA:58,13727 +DA:59,13727 +DA:60,13727 +DA:61,13727 +DA:62,13727 +DA:63,13727 +DA:65,13727 +DA:66,13727 +DA:67,13727 +DA:68,13727 +DA:69,13727 +DA:70,13727 +DA:76,91044 +DA:78,91044 +DA:80,91044 +DA:81,74855 +DA:83,16189 +DA:84,16189 +DA:85,2462 +DA:86,2462 +DA:87,16189 +DA:88,13727 +DA:90,16189 +DA:91,91044 +BRDA:17,0,0,0 +BRDA:17,0,1,13727 +BRDA:19,0,0,1805 +BRDA:19,0,1,11922 +BRDA:21,0,0,1989 +BRDA:21,0,1,11738 +BRDA:22,0,0,1990 +BRDA:22,0,1,11737 +BRDA:23,0,0,2135 +BRDA:23,0,1,11592 +BRDA:25,0,0,2776 +BRDA:25,0,1,10951 +BRDA:27,0,0,3032 +BRDA:27,0,1,10695 +BRDA:41,0,0,1107 +BRDA:41,0,1,1355 +BRDA:42,0,0,744 +BRDA:42,0,1,363 +BRDA:46,0,0,0 +BRDA:46,0,1,2462 +BRDA:48,0,0,0 +BRDA:48,0,1,2462 +BRDA:62,0,0,13727 +BRDA:62,0,1,0 +BRDA:63,0,0,0 +BRDA:63,0,1,13727 +BRDA:80,0,0,74855 +BRDA:80,0,1,16189 +BRDA:84,0,0,2462 +BRDA:84,0,1,13727 +BRF:30 +BRH:25 +LF:55 +LH:51 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/hash_utils.hpp +FN:31,_ZN6evmone9keccak256ESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:44041037,_ZN6evmone9keccak256ESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNF:1 +FNH:1 +DA:31,44041037 +DA:32,44041037 +DA:33,44041037 +BRF:0 +BRH:0 +LF:3 +LH:3 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/host.cpp +FN:12,_ZNK6evmone5state4Host14account_existsERKN4evmc7addressE +FN:18,_ZNK6evmone5state4Host11get_storageERKN4evmc7addressERKNS2_7bytes32E +FN:24,_ZN6evmone5state4Host11set_storageERKN4evmc7addressERKNS2_7bytes32ES8_ +FN:72,_ZNK6evmone5state4Host11get_balanceERKN4evmc7addressE +FN:102,_ZNK6evmone5state4Host13get_code_sizeERKN4evmc7addressE +FN:108,_ZNK6evmone5state4Host13get_code_hashERKN4evmc7addressE +FN:118,_ZNK6evmone5state4Host9copy_codeERKN4evmc7addressEmPhm +FN:127,_ZN6evmone5state4Host12selfdestructERKN4evmc7addressES5_ +FN:166,_ZN6evmone5state22compute_create_addressERKN4evmc7addressEm +FN:202,_ZN6evmone5state23compute_create2_addressERKN4evmc7addressERKNS1_7bytes32ESt17basic_string_viewIhNS1_11byte_traitsIhEEE +FN:218,_ZN6evmone5state4Host15prepare_messageE12evmc_message +FN:260,_ZN6evmone5state4Host6createERK12evmc_message +FN:331,_ZN6evmone5state4Host15execute_messageERK12evmc_message +FN:378,_ZN6evmone5state4Host4callERK12evmc_message +FN:406,_ZNK6evmone5state4Host14get_tx_contextEv +FN:431,_ZNK6evmone5state4Host14get_block_hashEl +FN:437,_ZN6evmone5state4Host8emit_logERKN4evmc7addressEPKhmPKNS2_7bytes32Em +FN:442,_ZN6evmone5state4Host14access_accountERKN4evmc7addressE +FN:457,_ZN6evmone5state4Host14access_storageERKN4evmc7addressERKNS2_7bytes32E +FN:465,_ZNK6evmone5state4Host21get_transient_storageERKN4evmc7addressERKNS2_7bytes32E +FN:473,_ZN6evmone5state4Host21set_transient_storageERKN4evmc7addressERKNS2_7bytes32ES8_ +FN:82,host.cpp:_ZN6evmone5state12_GLOBAL__N_119is_create_collisionERKNS0_7AccountE +FNDA:60405,_ZNK6evmone5state4Host14account_existsERKN4evmc7addressE +FNDA:943670,_ZNK6evmone5state4Host11get_storageERKN4evmc7addressERKNS2_7bytes32E +FNDA:4330462,_ZN6evmone5state4Host11set_storageERKN4evmc7addressERKNS2_7bytes32ES8_ +FNDA:80546,_ZNK6evmone5state4Host11get_balanceERKN4evmc7addressE +FNDA:471147,_ZNK6evmone5state4Host13get_code_sizeERKN4evmc7addressE +FNDA:3416,_ZNK6evmone5state4Host13get_code_hashERKN4evmc7addressE +FNDA:2366758,_ZNK6evmone5state4Host9copy_codeERKN4evmc7addressEmPhm +FNDA:7512,_ZN6evmone5state4Host12selfdestructERKN4evmc7addressES5_ +FNDA:61679,_ZN6evmone5state22compute_create_addressERKN4evmc7addressEm +FNDA:13304,_ZN6evmone5state23compute_create2_addressERKN4evmc7addressERKNS1_7bytes32ESt17basic_string_viewIhNS1_11byte_traitsIhEEE +FNDA:4144202,_ZN6evmone5state4Host15prepare_messageE12evmc_message +FNDA:74983,_ZN6evmone5state4Host6createERK12evmc_message +FNDA:4144106,_ZN6evmone5state4Host15execute_messageERK12evmc_message +FNDA:4144202,_ZN6evmone5state4Host4callERK12evmc_message +FNDA:173806,_ZNK6evmone5state4Host14get_tx_contextEv +FNDA:69780,_ZNK6evmone5state4Host14get_block_hashEl +FNDA:30227,_ZN6evmone5state4Host8emit_logERKN4evmc7addressEPKhmPKNS2_7bytes32Em +FNDA:4831878,_ZN6evmone5state4Host14access_accountERKN4evmc7addressE +FNDA:5222286,_ZN6evmone5state4Host14access_storageERKN4evmc7addressERKNS2_7bytes32E +FNDA:1886115,_ZNK6evmone5state4Host21get_transient_storageERKN4evmc7addressERKNS2_7bytes32E +FNDA:9077186,_ZN6evmone5state4Host21set_transient_storageERKN4evmc7addressERKNS2_7bytes32ES8_ +FNDA:68538,host.cpp:_ZN6evmone5state12_GLOBAL__N_119is_create_collisionERKNS0_7AccountE +FNF:22 +FNH:22 +DA:12,60405 +DA:13,60405 +DA:14,60405 +DA:15,60405 +DA:18,943670 +DA:19,943670 +DA:20,943670 +DA:24,4330462 +DA:28,4330462 +DA:29,4330462 +DA:31,4330462 +DA:32,4330462 +DA:33,4330462 +DA:34,4330462 +DA:36,4330462 +DA:37,4330462 +DA:38,1311748 +DA:39,1311748 +DA:40,1214213 +DA:41,97535 +DA:42,45503 +DA:43,52032 +DA:44,52032 +DA:45,1311748 +DA:46,3018714 +DA:47,636815 +DA:48,636815 +DA:49,48 +DA:50,636767 +DA:51,222 +DA:52,636815 +DA:53,2381899 +DA:54,754159 +DA:55,754159 +DA:56,754159 +DA:57,72 +DA:58,754087 +DA:59,754063 +DA:60,24 +DA:61,24 +DA:62,754159 +DA:65,4330462 +DA:66,51209 +DA:67,4330462 +DA:68,4330462 +DA:69,4330462 +DA:72,80546 +DA:73,80546 +DA:74,80546 +DA:75,80546 +DA:82,68538 +DA:87,68538 +DA:88,368 +DA:89,68170 +DA:90,312 +DA:91,67858 +DA:92,178 +DA:96,67858 +DA:97,67680 +DA:98,67858 +DA:102,471147 +DA:103,471147 +DA:104,471147 +DA:105,471147 +DA:108,3416 +DA:109,3416 +DA:110,3416 +DA:111,694 +DA:113,2722 +DA:114,3416 +DA:118,2366758 +DA:119,2366758 +DA:120,2366758 +DA:121,2366758 +DA:122,2366758 +DA:123,2366758 +DA:124,2366758 +DA:127,7512 +DA:128,7512 +DA:129,42 +DA:130,7512 +DA:131,7512 +DA:132,7512 +DA:134,7512 +DA:135,7512 +DA:137,7512 +DA:138,2286 +DA:142,2286 +DA:143,2286 +DA:147,2286 +DA:148,2286 +DA:152,5226 +DA:153,5226 +DA:156,5226 +DA:157,4342 +DA:158,4342 +DA:159,4342 +DA:160,4342 +DA:161,4342 +DA:162,884 +DA:163,5226 +DA:166,61679 +DA:167,61679 +DA:168,61679 +DA:169,61679 +DA:170,61679 +DA:172,61679 +DA:173,61679 +DA:174,61679 +DA:175,61679 +DA:177,61679 +DA:178,55739 +DA:179,55739 +DA:180,55739 +DA:181,5940 +DA:182,5940 +DA:185,5940 +DA:186,5940 +DA:187,5940 +DA:188,5940 +DA:189,5940 +DA:191,61679 +DA:192,61679 +DA:194,61679 +DA:195,61679 +DA:196,61679 +DA:197,61679 +DA:198,61679 +DA:202,13304 +DA:203,13304 +DA:204,13304 +DA:205,13304 +DA:206,13304 +DA:207,13304 +DA:208,13304 +DA:209,13304 +DA:210,13304 +DA:211,13304 +DA:212,13304 +DA:213,13304 +DA:214,13304 +DA:215,13304 +DA:218,4144202 +DA:219,4144202 +DA:220,4144202 +DA:221,184945 +DA:222,184945 +DA:225,184945 +DA:226,96 +DA:228,184849 +DA:229,36146 +DA:230,36146 +DA:231,36146 +DA:232,36146 +DA:234,184849 +DA:235,74983 +DA:237,74983 +DA:238,74983 +DA:240,74983 +DA:241,74983 +DA:242,74983 +DA:243,61679 +DA:244,13304 +DA:245,13304 +DA:246,13304 +DA:247,13304 +DA:248,13304 +DA:249,13304 +DA:252,74983 +DA:253,74983 +DA:254,184849 +DA:256,4144106 +DA:257,4144202 +DA:260,74983 +DA:261,74983 +DA:263,74983 +DA:264,74983 +DA:265,74983 +DA:266,6445 +DA:267,68538 +DA:268,858 +DA:269,74125 +DA:271,74125 +DA:272,74125 +DA:274,74125 +DA:275,72829 +DA:277,74125 +DA:279,74125 +DA:280,74125 +DA:281,74125 +DA:282,74125 +DA:283,74125 +DA:284,74125 +DA:285,74125 +DA:287,74125 +DA:288,74125 +DA:289,74125 +DA:290,74125 +DA:291,74125 +DA:292,74125 +DA:293,3846 +DA:294,3846 +DA:295,3846 +DA:296,3846 +DA:298,70279 +DA:299,70279 +DA:301,70279 +DA:303,70279 +DA:304,94 +DA:307,70185 +DA:308,70185 +DA:309,70185 +DA:310,346 +DA:311,346 +DA:312,2 +DA:313,346 +DA:314,346 +DA:316,69839 +DA:317,27772 +DA:319,27772 +DA:320,84 +DA:322,27688 +DA:323,27688 +DA:324,27688 +DA:325,27688 +DA:327,69755 +DA:328,69839 +DA:331,4144106 +DA:332,4144106 +DA:333,4144106 +DA:334,74983 +DA:336,4069123 +DA:337,3919583 +DA:338,3919583 +DA:339,3919583 +DA:340,7668 +DA:341,3919583 +DA:343,4069123 +DA:344,3919583 +DA:345,3919583 +DA:346,3837008 +DA:347,82575 +DA:348,82575 +DA:352,82575 +DA:356,82575 +DA:357,82575 +DA:358,82575 +DA:359,82575 +DA:360,82575 +DA:361,82575 +DA:362,82575 +DA:363,3919583 +DA:366,4069123 +DA:367,1640720 +DA:370,2428403 +DA:371,2428403 +DA:372,59671 +DA:374,2368732 +DA:375,2428403 +DA:378,4144202 +DA:379,4144202 +DA:380,4144202 +DA:381,96 +DA:383,4144106 +DA:384,4144106 +DA:386,4144106 +DA:388,4144106 +DA:389,2416337 +DA:390,2416337 +DA:391,2416337 +DA:392,2416337 +DA:395,2416337 +DA:396,2416337 +DA:399,2416337 +DA:400,395670 +DA:401,2416337 +DA:402,4144106 +DA:403,4144202 +DA:406,173806 +DA:409,173806 +DA:410,173806 +DA:411,173806 +DA:412,173806 +DA:414,173806 +DA:415,173806 +DA:416,173806 +DA:417,173806 +DA:418,173806 +DA:419,173806 +DA:420,173806 +DA:421,173806 +DA:422,173806 +DA:423,173806 +DA:424,173806 +DA:425,173806 +DA:426,173806 +DA:427,173806 +DA:428,173806 +DA:431,69780 +DA:432,69780 +DA:433,69780 +DA:437,30227 +DA:438,30227 +DA:439,30227 +DA:442,4831878 +DA:443,4831878 +DA:444,17977 +DA:446,4813901 +DA:448,4813901 +DA:449,4225863 +DA:451,588038 +DA:452,588038 +DA:453,588038 +DA:454,4813901 +DA:457,5222286 +DA:458,5222286 +DA:459,5222286 +DA:460,5222286 +DA:461,5222286 +DA:465,1886115 +DA:466,1886115 +DA:467,1886115 +DA:468,1886115 +DA:469,1886115 +DA:473,9077186 +DA:474,9077186 +DA:475,9077186 +DA:476,9077186 +DA:477,9077186 +BRDA:14,0,0,60070 +BRDA:14,0,1,335 +BRDA:14,1,2,10616 +BRDA:14,1,3,49454 +BRDA:14,2,4,47786 +BRDA:14,2,5,1668 +BRDA:37,0,0,2939488 +BRDA:37,0,1,1390974 +BRDA:37,1,2,1311748 +BRDA:37,1,3,1627740 +BRDA:39,0,0,1214213 +BRDA:39,0,1,97535 +BRDA:41,0,0,45503 +BRDA:41,0,1,52032 +BRDA:46,0,0,1390974 +BRDA:46,0,1,1627740 +BRDA:46,1,2,636815 +BRDA:46,1,3,754159 +BRDA:48,0,0,2532 +BRDA:48,0,1,634283 +BRDA:48,1,2,48 +BRDA:48,1,3,2484 +BRDA:50,0,0,634283 +BRDA:50,0,1,2484 +BRDA:50,1,2,222 +BRDA:50,1,3,634061 +BRDA:53,0,0,754159 +BRDA:53,0,1,1627740 +BRDA:56,0,0,72 +BRDA:56,0,1,754087 +BRDA:58,0,0,754063 +BRDA:58,0,1,24 +BRDA:65,0,0,51209 +BRDA:65,0,1,4279253 +BRDA:74,0,0,80531 +BRDA:74,0,1,15 +BRDA:87,0,0,368 +BRDA:87,0,1,68170 +BRDA:89,0,0,312 +BRDA:89,0,1,67858 +BRDA:91,0,0,178 +BRDA:91,0,1,67680 +BRDA:110,0,0,6 +BRDA:110,0,1,3410 +BRDA:110,1,2,688 +BRDA:110,1,3,2722 +BRDA:128,0,0,42 +BRDA:128,0,1,7470 +BRDA:137,0,0,6418 +BRDA:137,0,1,1094 +BRDA:137,1,2,2286 +BRDA:137,1,3,4132 +BRDA:156,0,0,4342 +BRDA:156,0,1,884 +BRDA:177,0,0,55739 +BRDA:177,0,1,5940 +BRDA:179,0,0,14750 +BRDA:179,0,1,40989 +BRDA:220,0,0,148703 +BRDA:220,0,1,3995499 +BRDA:220,1,2,22896 +BRDA:220,1,3,3972603 +BRDA:220,2,4,13346 +BRDA:220,2,5,3959257 +BRDA:225,0,0,96 +BRDA:225,0,1,184849 +BRDA:228,0,0,36146 +BRDA:228,0,1,148703 +BRDA:234,0,0,61679 +BRDA:234,0,1,123170 +BRDA:234,1,2,13304 +BRDA:234,1,3,109866 +BRDA:242,0,0,61679 +BRDA:242,0,1,13304 +BRDA:265,0,0,6445 +BRDA:265,0,1,68538 +BRDA:267,0,0,858 +BRDA:267,0,1,67680 +BRDA:274,0,0,72829 +BRDA:274,0,1,1296 +BRDA:292,0,0,3846 +BRDA:292,0,1,70279 +BRDA:303,0,0,69011 +BRDA:303,0,1,1268 +BRDA:303,1,2,94 +BRDA:303,1,3,68917 +BRDA:309,0,0,346 +BRDA:309,0,1,69839 +BRDA:311,0,0,2 +BRDA:311,0,1,344 +BRDA:316,0,0,27772 +BRDA:316,0,1,42067 +BRDA:319,0,0,20109 +BRDA:319,0,1,7663 +BRDA:319,1,2,84 +BRDA:319,1,3,20025 +BRDA:333,0,0,61679 +BRDA:333,0,1,4082427 +BRDA:333,1,2,13304 +BRDA:333,1,3,4069123 +BRDA:336,0,0,3919583 +BRDA:336,0,1,149540 +BRDA:339,0,0,7668 +BRDA:339,0,1,3911915 +BRDA:343,0,0,3919583 +BRDA:343,0,1,149540 +BRDA:345,0,0,3837008 +BRDA:345,0,1,82575 +BRDA:366,0,0,4065787 +BRDA:366,0,1,3336 +BRDA:366,1,2,1640720 +BRDA:366,1,3,2428403 +BRDA:366,2,4,1640720 +BRDA:366,2,5,2425067 +BRDA:371,0,0,59671 +BRDA:371,0,1,2368732 +BRDA:380,0,0,96 +BRDA:380,0,1,4144106 +BRDA:388,0,0,2416337 +BRDA:388,0,1,1727769 +BRDA:392,0,0,401306 +BRDA:392,0,1,2015031 +BRDA:392,1,2,395762 +BRDA:392,1,3,5544 +BRDA:399,0,0,395762 +BRDA:399,0,1,2020575 +BRDA:399,1,2,395670 +BRDA:399,1,3,92 +BRDA:443,0,0,17977 +BRDA:443,0,1,4813901 +BRDA:448,0,0,2112828 +BRDA:448,0,1,2701073 +BRDA:448,1,2,2113035 +BRDA:448,1,3,588038 +BRDA:468,0,0,1884473 +BRDA:468,0,1,1642 +BRF:136 +BRH:136 +LF:329 +LH:329 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/host.hpp +FN:50,_ZN6evmone5state4HostC2E13evmc_revisionRN4evmc2VMERNS0_5StateERKNS0_9BlockInfoERKNS0_11BlockHashesERKNS0_11TransactionE +FN:53,_ZN6evmone5state4Host9take_logsEv +FNDA:356674,_ZN6evmone5state4HostC2E13evmc_revisionRN4evmc2VMERNS0_5StateERKNS0_9BlockInfoERKNS0_11BlockHashesERKNS0_11TransactionE +FNDA:148703,_ZN6evmone5state4Host9take_logsEv +FNF:2 +FNH:2 +DA:50,356674 +DA:51,356674 +DA:53,148703 +BRF:0 +BRH:0 +LF:3 +LH:3 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/precompiles.cpp +FN:61,_ZN6evmone5state17ecrecover_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:66,_ZN6evmone5state14sha256_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:71,_ZN6evmone5state17ripemd160_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:76,_ZN6evmone5state16identity_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:81,_ZN6evmone5state13ecadd_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:86,_ZN6evmone5state13ecmul_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:91,_ZN6evmone5state17ecpairing_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:99,_ZN6evmone5state16blake2bf_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:105,_ZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:200,_ZN6evmone5state24point_evaluation_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:206,_ZN6evmone5state19bls12_g1add_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:212,_ZN6evmone5state19bls12_g1msm_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:234,_ZN6evmone5state19bls12_g2add_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:240,_ZN6evmone5state19bls12_g2msm_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:262,_ZN6evmone5state27bls12_pairing_check_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:278,_ZN6evmone5state26bls12_map_fp_to_g1_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:284,_ZN6evmone5state27bls12_map_fp2_to_g2_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:290,_ZN6evmone5state18p256verify_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FN:296,_ZN6evmone5state17ecrecover_executeEPKhmPhm +FN:327,_ZN6evmone5state14sha256_executeEPKhmPhm +FN:336,_ZN6evmone5state17ripemd160_executeEPKhmPhm +FN:402,_ZN6evmone5state14expmod_executeEPKhmPhm +FN:436,_ZN6evmone5state13ecadd_executeEPKhmPhm +FN:463,_ZN6evmone5state13ecmul_executeEPKhmPhm +FN:490,_ZN6evmone5state17ecpairing_executeEPKhmPhm +FN:526,_ZN6evmone5state16identity_executeEPKhmPhm +FN:534,_ZN6evmone5state16blake2bf_executeEPKhmPhm +FN:566,_ZN6evmone5state24point_evaluation_executeEPKhmPhm +FN:589,_ZN6evmone5state19bls12_g1add_executeEPKhmPhm +FN:603,_ZN6evmone5state19bls12_g1msm_executeEPKhmPhm +FN:625,_ZN6evmone5state19bls12_g2add_executeEPKhmPhm +FN:639,_ZN6evmone5state19bls12_g2msm_executeEPKhmPhm +FN:661,_ZN6evmone5state27bls12_pairing_check_executeEPKhmPhm +FN:674,_ZN6evmone5state26bls12_map_fp_to_g1_executeEPKhmPhm +FN:688,_ZN6evmone5state27bls12_map_fp2_to_g2_executeEPKhmPhm +FN:702,_ZN6evmone5state18p256verify_executeEPKhmPhm +FN:773,_ZN6evmone5state13is_precompileE13evmc_revisionRKN4evmc7addressE +FN:789,_ZN6evmone5state15call_precompileE13evmc_revisionRK12evmc_message +FN:55,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_119cost_per_input_wordILi60ELi12EEElm +FN:49,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_19num_wordsEm +FN:55,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_119cost_per_input_wordILi600ELi120EEElm +FN:55,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_119cost_per_input_wordILi15ELi3EEElm +FN:155,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_1clEv +FN:128,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_2clEj +FN:135,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_3clEj +FN:139,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_4clEj +FN:108,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_0clEmj +FN:347,precompiles.cpp:_ZN6evmone5stateL18expmod_parse_inputEPKhmPhm +FN:376,precompiles.cpp:_ZZN6evmone5stateL18expmod_parse_inputEPKhmPhmENK3$_0clEh +FN:765,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_115to_lookup_indexERKN4evmc7addressE +FN:819,precompiles.cpp:_ZZN6evmone5state15call_precompileE13evmc_revisionRK12evmc_messageENK3$_1clEPK11evmc_result +FNDA:402522,_ZN6evmone5state17ecrecover_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:19822,_ZN6evmone5state14sha256_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:395926,_ZN6evmone5state17ripemd160_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:792344,_ZN6evmone5state16identity_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:2982,_ZN6evmone5state13ecadd_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:6496,_ZN6evmone5state13ecmul_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:2142,_ZN6evmone5state17ecpairing_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:2128,_ZN6evmone5state16blake2bf_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:4776,_ZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:1314,_ZN6evmone5state24point_evaluation_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:534,_ZN6evmone5state19bls12_g1add_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:3426,_ZN6evmone5state19bls12_g1msm_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:558,_ZN6evmone5state19bls12_g2add_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:3450,_ZN6evmone5state19bls12_g2msm_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:846,_ZN6evmone5state27bls12_pairing_check_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:330,_ZN6evmone5state26bls12_map_fp_to_g1_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:318,_ZN6evmone5state27bls12_map_fp2_to_g2_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:806,_ZN6evmone5state18p256verify_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revision +FNDA:2360,_ZN6evmone5state17ecrecover_executeEPKhmPhm +FNDA:19792,_ZN6evmone5state14sha256_executeEPKhmPhm +FNDA:1166,_ZN6evmone5state17ripemd160_executeEPKhmPhm +FNDA:4334,_ZN6evmone5state14expmod_executeEPKhmPhm +FNDA:2950,_ZN6evmone5state13ecadd_executeEPKhmPhm +FNDA:6464,_ZN6evmone5state13ecmul_executeEPKhmPhm +FNDA:1762,_ZN6evmone5state17ecpairing_executeEPKhmPhm +FNDA:4858,_ZN6evmone5state16identity_executeEPKhmPhm +FNDA:1168,_ZN6evmone5state16blake2bf_executeEPKhmPhm +FNDA:1220,_ZN6evmone5state24point_evaluation_executeEPKhmPhm +FNDA:522,_ZN6evmone5state19bls12_g1add_executeEPKhmPhm +FNDA:1586,_ZN6evmone5state19bls12_g1msm_executeEPKhmPhm +FNDA:546,_ZN6evmone5state19bls12_g2add_executeEPKhmPhm +FNDA:1610,_ZN6evmone5state19bls12_g2msm_executeEPKhmPhm +FNDA:414,_ZN6evmone5state27bls12_pairing_check_executeEPKhmPhm +FNDA:318,_ZN6evmone5state26bls12_map_fp_to_g1_executeEPKhmPhm +FNDA:306,_ZN6evmone5state27bls12_map_fp2_to_g2_executeEPKhmPhm +FNDA:796,_ZN6evmone5state18p256verify_executeEPKhmPhm +FNDA:7218173,_ZN6evmone5state13is_precompileE13evmc_revisionRKN4evmc7addressE +FNDA:1640720,_ZN6evmone5state15call_precompileE13evmc_revisionRK12evmc_message +FNDA:19822,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_119cost_per_input_wordILi60ELi12EEElm +FNDA:1208092,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_19num_wordsEm +FNDA:395926,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_119cost_per_input_wordILi600ELi120EEElm +FNDA:792344,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_119cost_per_input_wordILi15ELi3EEElm +FNDA:4776,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_1clEv +FNDA:566,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_2clEj +FNDA:3590,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_3clEj +FNDA:264,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_4clEj +FNDA:4420,precompiles.cpp:_ZZN6evmone5state14expmod_analyzeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE13evmc_revisionENK3$_0clEmj +FNDA:4334,precompiles.cpp:_ZN6evmone5stateL18expmod_parse_inputEPKhmPhm +FNDA:34542,precompiles.cpp:_ZZN6evmone5stateL18expmod_parse_inputEPKhmPhmENK3$_0clEh +FNDA:5513673,precompiles.cpp:_ZN6evmone5state12_GLOBAL__N_115to_lookup_indexERKN4evmc7addressE +FNDA:52172,precompiles.cpp:_ZZN6evmone5state15call_precompileE13evmc_revisionRK12evmc_messageENK3$_1clEPK11evmc_result +FNF:49 +FNH:49 +DA:49,1208092 +DA:50,1208092 +DA:51,1208092 +DA:55,1208092 +DA:56,1208092 +DA:57,1208092 +DA:61,402522 +DA:62,402522 +DA:63,402522 +DA:66,19822 +DA:67,19822 +DA:68,19822 +DA:71,395926 +DA:72,395926 +DA:73,395926 +DA:76,792344 +DA:77,792344 +DA:78,792344 +DA:81,2982 +DA:82,2982 +DA:83,2982 +DA:86,6496 +DA:87,6496 +DA:88,6496 +DA:91,2142 +DA:92,2142 +DA:93,2142 +DA:94,2142 +DA:95,2142 +DA:96,2142 +DA:99,2128 +DA:101,2128 +DA:102,2128 +DA:105,4776 +DA:106,4776 +DA:108,4776 +DA:109,4420 +DA:110,4420 +DA:111,4420 +DA:112,3780 +DA:113,4420 +DA:115,4420 +DA:116,4420 +DA:117,4420 +DA:118,2855 +DA:119,2855 +DA:120,4420 +DA:122,4420 +DA:123,4420 +DA:124,4420 +DA:125,4420 +DA:126,4420 +DA:128,4776 +DA:130,566 +DA:131,566 +DA:132,566 +DA:133,566 +DA:134,566 +DA:135,4776 +DA:136,3590 +DA:137,3590 +DA:138,3590 +DA:139,4776 +DA:140,264 +DA:141,264 +DA:142,184 +DA:143,80 +DA:144,72 +DA:146,8 +DA:147,80 +DA:149,4776 +DA:150,4776 +DA:151,4776 +DA:152,4776 +DA:153,4776 +DA:154,4776 +DA:155,4776 +DA:156,4776 +DA:157,650 +DA:158,4126 +DA:159,3814 +DA:160,312 +DA:161,312 +DA:162,4776 +DA:164,4776 +DA:165,4776 +DA:167,4776 +DA:169,4776 +DA:170,4776 +DA:171,4776 +DA:175,4776 +DA:176,4776 +DA:177,4776 +DA:178,162 +DA:180,4614 +DA:181,194 +DA:183,194 +DA:184,32 +DA:185,162 +DA:186,194 +DA:188,4420 +DA:189,4420 +DA:190,4420 +DA:192,4420 +DA:193,4420 +DA:194,4420 +DA:195,4420 +DA:196,4420 +DA:197,4614 +DA:200,1314 +DA:201,1314 +DA:202,1314 +DA:203,1314 +DA:206,534 +DA:207,534 +DA:208,534 +DA:209,534 +DA:212,3426 +DA:213,3426 +DA:214,3426 +DA:215,3426 +DA:216,3426 +DA:217,3426 +DA:218,3426 +DA:219,3426 +DA:220,3426 +DA:221,3426 +DA:223,3426 +DA:224,1316 +DA:226,2110 +DA:227,2110 +DA:228,2110 +DA:229,2110 +DA:230,2110 +DA:231,3426 +DA:234,558 +DA:235,558 +DA:236,558 +DA:237,558 +DA:240,3450 +DA:241,3450 +DA:242,3450 +DA:243,3450 +DA:244,3450 +DA:245,3450 +DA:246,3450 +DA:247,3450 +DA:248,3450 +DA:249,3450 +DA:251,3450 +DA:252,1316 +DA:254,2134 +DA:255,2134 +DA:256,2134 +DA:257,2134 +DA:258,2134 +DA:259,3450 +DA:262,846 +DA:263,846 +DA:265,846 +DA:266,344 +DA:268,502 +DA:270,502 +DA:271,502 +DA:272,502 +DA:273,502 +DA:274,502 +DA:275,846 +DA:278,330 +DA:279,330 +DA:280,330 +DA:281,330 +DA:284,318 +DA:285,318 +DA:286,318 +DA:287,318 +DA:290,806 +DA:291,806 +DA:292,806 +DA:296,2360 +DA:297,2360 +DA:299,2360 +DA:300,2360 +DA:301,2030 +DA:303,2360 +DA:304,2360 +DA:306,2360 +DA:307,2360 +DA:308,1096 +DA:309,1264 +DA:311,1264 +DA:312,1264 +DA:314,1264 +DA:315,1264 +DA:316,832 +DA:317,832 +DA:318,832 +DA:319,832 +DA:320,832 +DA:321,432 +DA:322,432 +DA:323,1264 +DA:327,19792 +DA:328,19792 +DA:329,19792 +DA:330,19792 +DA:331,19792 +DA:332,19792 +DA:336,1166 +DA:337,1166 +DA:338,1166 +DA:339,1166 +DA:340,1166 +DA:341,1166 +DA:342,1166 +DA:347,4334 +DA:348,4334 +DA:349,4334 +DA:350,4334 +DA:353,4334 +DA:356,4334 +DA:357,526 +DA:358,526 +DA:359,526 +DA:360,526 +DA:362,3808 +DA:363,3808 +DA:364,3808 +DA:366,3808 +DA:367,3808 +DA:368,3808 +DA:369,3808 +DA:370,3808 +DA:376,34542 +DA:377,554 +DA:379,554 +DA:380,554 +DA:381,554 +DA:383,3254 +DA:384,3254 +DA:385,278 +DA:389,278 +DA:390,278 +DA:391,278 +DA:393,3254 +DA:394,3254 +DA:395,3254 +DA:397,3254 +DA:398,3808 +DA:402,4334 +DA:403,4334 +DA:404,4334 +DA:405,1080 +DA:407,3254 +DA:408,3253 +DA:409,3253 +DA:410,3253 +DA:411,3253 +DA:416,1 +DA:417,1 +DA:418,1 +DA:419,3254 +DA:436,2950 +DA:437,2950 +DA:439,2950 +DA:440,2950 +DA:441,2632 +DA:443,2950 +DA:445,2950 +DA:447,2950 +DA:448,2950 +DA:450,2950 +DA:451,2618 +DA:452,2618 +DA:453,2618 +DA:454,2618 +DA:455,2618 +DA:456,2618 +DA:457,332 +DA:458,332 +DA:459,2950 +DA:463,6464 +DA:464,6464 +DA:466,6464 +DA:467,6464 +DA:468,6146 +DA:470,6464 +DA:472,6464 +DA:474,6464 +DA:475,6464 +DA:477,6464 +DA:478,4626 +DA:479,4626 +DA:480,4626 +DA:481,4626 +DA:482,4626 +DA:483,4626 +DA:484,1838 +DA:485,1838 +DA:486,6464 +DA:490,1762 +DA:491,1762 +DA:492,1762 +DA:493,1762 +DA:495,1762 +DA:496,142 +DA:498,1620 +DA:499,1620 +DA:500,4464 +DA:501,2844 +DA:502,2844 +DA:503,2844 +DA:504,2844 +DA:505,2844 +DA:506,2844 +DA:507,2844 +DA:508,2844 +DA:509,2844 +DA:510,2844 +DA:511,2844 +DA:512,2844 +DA:513,2844 +DA:515,1620 +DA:516,1620 +DA:517,798 +DA:519,822 +DA:520,822 +DA:521,822 +DA:522,1620 +DA:526,4858 +DA:527,4858 +DA:528,4858 +DA:529,4858 +DA:530,4858 +DA:534,1168 +DA:535,1168 +DA:536,1168 +DA:537,1168 +DA:538,1168 +DA:540,1168 +DA:541,1168 +DA:543,1168 +DA:544,1168 +DA:545,1168 +DA:547,1168 +DA:548,1168 +DA:549,1168 +DA:551,1168 +DA:552,1168 +DA:553,1168 +DA:555,1168 +DA:556,1168 +DA:557,144 +DA:559,1024 +DA:560,1024 +DA:561,1024 +DA:562,1168 +DA:566,1220 +DA:567,1220 +DA:568,1220 +DA:569,314 +DA:571,906 +DA:572,906 +DA:573,906 +DA:574,906 +DA:575,906 +DA:577,906 +DA:578,486 +DA:582,420 +DA:583,420 +DA:584,420 +DA:585,906 +DA:589,522 +DA:590,522 +DA:591,196 +DA:593,522 +DA:595,326 +DA:596,144 +DA:598,182 +DA:599,326 +DA:603,1586 +DA:605,1586 +DA:606,1586 +DA:608,1586 +DA:609,364 +DA:611,364 +DA:612,172 +DA:613,364 +DA:614,1222 +DA:615,1222 +DA:616,1222 +DA:617,48 +DA:618,1222 +DA:620,1366 +DA:621,1586 +DA:625,546 +DA:626,546 +DA:627,196 +DA:629,546 +DA:631,350 +DA:632,176 +DA:634,174 +DA:635,350 +DA:639,1610 +DA:641,1610 +DA:642,1610 +DA:644,1610 +DA:645,376 +DA:647,376 +DA:648,184 +DA:649,376 +DA:650,1234 +DA:651,1234 +DA:652,1234 +DA:653,56 +DA:654,1234 +DA:656,1370 +DA:657,1610 +DA:661,414 +DA:663,414 +DA:664,414 +DA:666,414 +DA:667,204 +DA:669,210 +DA:670,414 +DA:674,318 +DA:675,318 +DA:676,200 +DA:678,318 +DA:680,118 +DA:681,36 +DA:683,82 +DA:684,118 +DA:688,306 +DA:689,306 +DA:690,200 +DA:692,306 +DA:694,106 +DA:695,56 +DA:697,50 +DA:698,106 +DA:702,796 +DA:703,796 +DA:705,796 +DA:706,14 +DA:708,782 +DA:709,782 +DA:710,782 +DA:711,782 +DA:712,782 +DA:713,782 +DA:715,782 +DA:716,304 +DA:719,478 +DA:720,478 +DA:721,478 +DA:722,782 +DA:765,5513673 +DA:766,5513673 +DA:767,5513673 +DA:768,5513673 +DA:769,5513673 +DA:773,7218173 +DA:774,7218173 +DA:775,7218173 +DA:776,7218173 +DA:777,7218173 +DA:778,7218173 +DA:779,7218173 +DA:780,7218173 +DA:781,7218173 +DA:783,7218173 +DA:784,3345220 +DA:785,3872953 +DA:786,7218173 +DA:789,1640720 +DA:790,1640720 +DA:791,1640720 +DA:792,1640720 +DA:793,1640720 +DA:794,1640720 +DA:795,1640720 +DA:796,1640720 +DA:797,1640720 +DA:798,1640720 +DA:799,1640720 +DA:800,1640720 +DA:802,1640720 +DA:804,1640720 +DA:806,1640720 +DA:807,1640720 +DA:808,1640720 +DA:809,1640720 +DA:810,1588548 +DA:814,52172 +DA:815,52172 +DA:816,52172 +DA:817,52172 +DA:818,52172 +DA:819,52172 +DA:820,52172 +DA:821,1640720 +BRDA:82,0,0,2970 +BRDA:82,0,1,12 +BRDA:87,0,0,6484 +BRDA:87,0,1,12 +BRDA:92,0,0,2130 +BRDA:92,0,1,12 +BRDA:93,0,0,2130 +BRDA:93,0,1,12 +BRDA:101,0,0,1280 +BRDA:101,0,1,848 +BRDA:111,0,0,3780 +BRDA:111,0,1,640 +BRDA:117,0,0,2855 +BRDA:117,0,1,1565 +BRDA:124,0,0,3854 +BRDA:124,0,1,566 +BRDA:132,0,0,396 +BRDA:132,0,1,170 +BRDA:141,0,0,184 +BRDA:141,0,1,80 +BRDA:143,0,0,72 +BRDA:143,0,1,8 +BRDA:156,0,0,650 +BRDA:156,0,1,4126 +BRDA:158,0,0,3814 +BRDA:158,0,1,312 +BRDA:176,0,0,4126 +BRDA:176,0,1,650 +BRDA:177,0,0,104 +BRDA:177,0,1,4672 +BRDA:177,1,2,162 +BRDA:177,1,3,4614 +BRDA:177,2,4,58 +BRDA:177,2,5,4614 +BRDA:180,0,0,194 +BRDA:180,0,1,4420 +BRDA:183,0,0,32 +BRDA:183,0,1,162 +BRDA:183,1,2,164 +BRDA:183,1,3,30 +BRDA:183,2,4,52 +BRDA:183,2,5,112 +BRDA:183,3,6,32 +BRDA:183,3,7,20 +BRDA:223,0,0,120 +BRDA:223,0,1,3306 +BRDA:223,1,2,1196 +BRDA:223,1,3,2110 +BRDA:251,0,0,120 +BRDA:251,0,1,3330 +BRDA:251,1,2,1196 +BRDA:251,1,3,2134 +BRDA:265,0,0,112 +BRDA:265,0,1,734 +BRDA:265,1,2,232 +BRDA:265,1,3,502 +BRDA:300,0,0,2030 +BRDA:300,0,1,330 +BRDA:307,0,0,1606 +BRDA:307,0,1,754 +BRDA:307,1,2,1096 +BRDA:307,1,3,1264 +BRDA:307,2,4,1096 +BRDA:307,2,5,510 +BRDA:315,0,0,832 +BRDA:315,0,1,432 +BRDA:356,0,0,526 +BRDA:356,0,1,3808 +BRDA:376,0,0,554 +BRDA:376,0,1,3254 +BRDA:384,0,0,278 +BRDA:384,0,1,2976 +BRDA:395,0,0,278 +BRDA:395,0,1,2976 +BRDA:404,0,0,1080 +BRDA:404,0,1,3254 +BRDA:407,0,0,3253 +BRDA:407,0,1,1 +BRDA:440,0,0,2632 +BRDA:440,0,1,318 +BRDA:450,0,0,2690 +BRDA:450,0,1,260 +BRDA:450,1,2,2618 +BRDA:450,1,3,72 +BRDA:467,0,0,6146 +BRDA:467,0,1,318 +BRDA:477,0,0,4626 +BRDA:477,0,1,1838 +BRDA:495,0,0,142 +BRDA:495,0,1,1620 +BRDA:500,0,0,2844 +BRDA:500,0,1,1620 +BRDA:516,0,0,798 +BRDA:516,0,1,822 +BRDA:520,0,0,744 +BRDA:520,0,1,78 +BRDA:556,0,0,896 +BRDA:556,0,1,272 +BRDA:556,1,2,144 +BRDA:556,1,3,752 +BRDA:568,0,0,314 +BRDA:568,0,1,906 +BRDA:577,0,0,486 +BRDA:577,0,1,420 +BRDA:590,0,0,196 +BRDA:590,0,1,326 +BRDA:595,0,0,144 +BRDA:595,0,1,182 +BRDA:608,0,0,364 +BRDA:608,0,1,1222 +BRDA:611,0,0,172 +BRDA:611,0,1,192 +BRDA:616,0,0,48 +BRDA:616,0,1,1174 +BRDA:626,0,0,196 +BRDA:626,0,1,350 +BRDA:631,0,0,176 +BRDA:631,0,1,174 +BRDA:644,0,0,376 +BRDA:644,0,1,1234 +BRDA:647,0,0,184 +BRDA:647,0,1,192 +BRDA:652,0,0,56 +BRDA:652,0,1,1178 +BRDA:666,0,0,204 +BRDA:666,0,1,210 +BRDA:675,0,0,200 +BRDA:675,0,1,118 +BRDA:680,0,0,36 +BRDA:680,0,1,82 +BRDA:689,0,0,200 +BRDA:689,0,1,106 +BRDA:694,0,0,56 +BRDA:694,0,1,50 +BRDA:705,0,0,14 +BRDA:705,0,1,782 +BRDA:715,0,0,304 +BRDA:715,0,1,478 +BRDA:783,0,0,3345220 +BRDA:783,0,1,3872953 +BRDA:809,0,0,1588548 +BRDA:809,0,1,52172 +BRDA:817,0,0,46250 +BRDA:817,0,1,5922 +BRF:144 +BRH:144 +LF:542 +LH:542 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/precompiles_stubs.cpp +FN:63,_ZN6evmone5state11expmod_stubESt4spanIKhLm18446744073709551615EES3_S3_Ph +FN:79,precompiles_stubs.cpp:_ZZN6evmone5state11expmod_stubESt4spanIKhLm18446744073709551615EES3_S3_PhENK3$_0clB5cxx11Ev +FN:36,precompiles_stubs.cpp:_ZN6evmone5state12_GLOBAL__N_120expmod_lookup_resultB5cxx11ESt17basic_string_viewIhN4evmc11byte_traitsIhEEES6_S6_ +FNDA:1,_ZN6evmone5state11expmod_stubESt4spanIKhLm18446744073709551615EES3_S3_Ph +FNDA:1,precompiles_stubs.cpp:_ZZN6evmone5state11expmod_stubESt4spanIKhLm18446744073709551615EES3_S3_PhENK3$_0clB5cxx11Ev +FNDA:0,precompiles_stubs.cpp:_ZN6evmone5state12_GLOBAL__N_120expmod_lookup_resultB5cxx11ESt17basic_string_viewIhN4evmc11byte_traitsIhEEES6_S6_ +FNF:3 +FNH:2 +DA:36,0 +DA:37,0 +DA:39,0 +DA:40,0 +DA:41,0 +DA:43,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:53,0 +DA:54,0 +DA:55,0 +DA:56,0 +DA:57,0 +DA:63,1 +DA:64,1 +DA:65,1 +DA:66,1 +DA:69,1 +DA:72,1 +DA:73,1 +DA:74,1 +DA:75,1 +DA:79,1 +DA:81,1 +DA:82,0 +DA:85,1 +DA:86,1 +DA:89,0 +DA:90,0 +DA:92,0 +DA:93,0 +DA:96,1 +DA:97,1 +DA:98,1 +BRDA:51,0,0,- +BRDA:51,0,1,- +BRDA:81,0,0,1 +BRDA:81,0,1,0 +BRDA:81,1,2,0 +BRDA:81,1,3,1 +BRDA:85,0,0,1 +BRDA:85,0,1,0 +BRDA:89,0,0,- +BRDA:89,0,1,- +BRDA:89,1,2,- +BRDA:89,1,3,- +BRDA:89,2,4,- +BRDA:89,2,5,- +BRF:14 +BRH:3 +LF:47 +LH:25 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/requests.cpp +FN:19,_ZN6evmone5state23calculate_requests_hashESt4spanIKNS0_8RequestsELm18446744073709551615EE +FN:41,_ZN6evmone5state24collect_deposit_requestsESt4spanIKNS0_18TransactionReceiptELm18446744073709551615EE +FN:77,requests.cpp:_ZZN6evmone5state24collect_deposit_requestsESt4spanIKNS0_18TransactionReceiptELm18446744073709551615EEENK3$_0clEm +FN:125,requests.cpp:_ZZN6evmone5state24collect_deposit_requestsESt4spanIKNS0_18TransactionReceiptELm18446744073709551615EEENK3$_1clEjj +FNDA:44939,_ZN6evmone5state23calculate_requests_hashESt4spanIKNS0_8RequestsELm18446744073709551615EE +FNDA:47063,_ZN6evmone5state24collect_deposit_requestsESt4spanIKNS0_18TransactionReceiptELm18446744073709551615EE +FNDA:15390,requests.cpp:_ZZN6evmone5state24collect_deposit_requestsESt4spanIKNS0_18TransactionReceiptELm18446744073709551615EEENK3$_0clEm +FNDA:7635,requests.cpp:_ZZN6evmone5state24collect_deposit_requestsESt4spanIKNS0_18TransactionReceiptELm18446744073709551615EEENK3$_1clEjj +FNF:4 +FNH:4 +DA:19,44939 +DA:20,44939 +DA:21,44939 +DA:23,44939 +DA:24,134817 +DA:25,134817 +DA:26,134068 +DA:28,749 +DA:29,749 +DA:30,749 +DA:31,749 +DA:32,749 +DA:34,44939 +DA:35,44939 +DA:36,44939 +DA:37,44939 +DA:38,44939 +DA:41,47063 +DA:43,47063 +DA:44,47063 +DA:45,49124 +DA:46,49124 +DA:47,9217 +DA:52,9217 +DA:53,7650 +DA:54,1567 +DA:55,8 +DA:59,1559 +DA:60,4 +DA:77,15390 +DA:78,15390 +DA:79,15390 +DA:81,15390 +DA:82,20 +DA:83,15370 +DA:84,15390 +DA:86,1555 +DA:87,1555 +DA:90,1555 +DA:91,9300 +DA:92,7755 +DA:93,7755 +DA:94,7755 +DA:95,10 +DA:96,7745 +DA:97,7745 +DA:100,1545 +DA:101,1545 +DA:102,1545 +DA:103,1545 +DA:104,1545 +DA:105,1545 +DA:106,1545 +DA:107,1545 +DA:108,1545 +DA:109,1545 +DA:110,1545 +DA:111,1545 +DA:112,1545 +DA:113,1545 +DA:114,1545 +DA:115,1545 +DA:118,1545 +DA:119,1545 +DA:121,1545 +DA:122,10 +DA:125,7635 +DA:126,7635 +DA:127,7635 +DA:128,7635 +DA:129,1535 +DA:130,1535 +DA:131,1535 +DA:132,1535 +DA:133,1535 +DA:134,20 +DA:136,20 +DA:137,20 +DA:140,1535 +DA:142,1515 +DA:143,1515 +DA:144,1515 +DA:145,1515 +DA:146,1515 +DA:147,1515 +DA:148,49124 +DA:149,47019 +DA:150,47063 +BRDA:23,0,0,134817 +BRDA:23,0,1,44939 +BRDA:25,0,0,134068 +BRDA:25,0,1,749 +BRDA:44,0,0,49124 +BRDA:44,0,1,47019 +BRDA:46,0,0,9217 +BRDA:46,0,1,49080 +BRDA:52,0,0,7650 +BRDA:52,0,1,1567 +BRDA:54,0,0,4 +BRDA:54,0,1,1563 +BRDA:54,1,2,4 +BRDA:54,1,3,1559 +BRDA:59,0,0,4 +BRDA:59,0,1,1555 +BRDA:81,0,0,20 +BRDA:81,0,1,15370 +BRDA:91,0,0,7755 +BRDA:91,0,1,1545 +BRDA:94,0,0,10 +BRDA:94,0,1,7745 +BRDA:121,0,0,10 +BRDA:121,0,1,1535 +BRDA:127,0,0,7625 +BRDA:127,0,1,10 +BRDA:127,1,2,7615 +BRDA:127,1,3,10 +BRDA:129,0,0,4 +BRDA:129,0,1,1531 +BRDA:130,0,0,4 +BRDA:130,0,1,1527 +BRDA:131,0,0,4 +BRDA:131,0,1,1523 +BRDA:132,0,0,4 +BRDA:132,0,1,1519 +BRDA:133,0,0,4 +BRDA:133,0,1,1515 +BRF:38 +BRH:38 +LF:99 +LH:99 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/requests.hpp +FN:49,_ZN6evmone5state8RequestsC2ENS1_4TypeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:56,_ZNK6evmone5state8Requests4typeEv +FN:59,_ZNK6evmone5state8Requests4dataEv +FN:62,_ZN6evmone5state8Requests6appendESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:141077,_ZN6evmone5state8RequestsC2ENS1_4TypeESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:0,_ZNK6evmone5state8Requests4typeEv +FNDA:134817,_ZNK6evmone5state8Requests4dataEv +FNDA:7575,_ZN6evmone5state8Requests6appendESt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNF:4 +FNH:3 +DA:49,141077 +DA:50,141077 +DA:51,141077 +DA:52,141077 +DA:53,141077 +DA:56,0 +DA:59,134817 +DA:62,7575 +BRF:0 +BRH:0 +LF:8 +LH:7 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/state.cpp +FN:198,_ZNK6evmone5state5State10build_diffE13evmc_revision +FN:238,_ZN6evmone5state5State6insertERKN4evmc7addressENS0_7AccountE +FN:245,_ZN6evmone5state5State4findERKN4evmc7addressE +FN:259,_ZN6evmone5state5State3getERKN4evmc7addressE +FN:266,_ZN6evmone5state5State13get_or_insertERKN4evmc7addressENS0_7AccountE +FN:273,_ZN6evmone5state5State8get_codeERKN4evmc7addressE +FN:285,_ZN6evmone5state5State5touchERKN4evmc7addressE +FN:296,_ZN6evmone5state5State11get_storageERKN4evmc7addressERKNS2_7bytes32E +FN:309,_ZN6evmone5state5State22journal_balance_changeERKN4evmc7addressERKN4intx4uintILj256EEE +FN:315,_ZN6evmone5state5State22journal_storage_changeERKN4evmc7addressERKNS2_7bytes32ERKNS0_12StorageValueE +FN:321,_ZN6evmone5state5State32journal_transient_storage_changeERKN4evmc7addressERKNS2_7bytes32ES8_ +FN:326,_ZN6evmone5state5State18journal_bump_nonceERKN4evmc7addressE +FN:331,_ZN6evmone5state5State14journal_createERKN4evmc7addressEb +FN:336,_ZN6evmone5state5State16journal_destructERKN4evmc7addressE +FN:341,_ZN6evmone5state5State22journal_access_accountERKN4evmc7addressE +FN:346,_ZN6evmone5state5State8rollbackEm +FN:418,_ZN6evmone5state20validate_transactionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11TransactionE13evmc_revisionll +FN:532,_ZN6evmone5state8finalizeERKNS0_9StateViewE13evmc_revisionRKN4evmc7addressESt8optionalImESt4spanIKNS0_5OmmerELm18446744073709551615EESB_IKNS0_10WithdrawalELm18446744073709551615EE +FN:559,_ZN6evmone5state10transitionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11BlockHashesERKNS0_11TransactionE13evmc_revisionRN4evmc2VMERKNS0_21TransactionPropertiesE +FN:350,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalBalanceChangeEEEDaRKT_ +FN:350,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_14JournalTouchedEEEDaRKT_ +FN:350,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalStorageChangeEEEDaRKT_ +FN:350,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_16JournalNonceBumpEEEDaRKT_ +FN:350,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_13JournalCreateEEEDaRKT_ +FN:350,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_29JournalTransientStorageChangeEEEDaRKT_ +FN:350,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_15JournalDestructEEEDaRKT_ +FN:350,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalAccessAccountEEEDaRKT_ +FN:435,state.cpp:_ZZN6evmone5state20validate_transactionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11TransactionE13evmc_revisionllENK3$_0clIN4evmc7bytes32EEEDaRKT_ +FN:60,state.cpp:_ZN6evmone5state12_GLOBAL__N_125compute_tx_intrinsic_costE13evmc_revisionRKNS0_11TransactionE +FN:33,state.cpp:_ZN6evmone5state12_GLOBAL__N_122compute_tx_data_tokensE13evmc_revisionSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FN:42,state.cpp:_ZN6evmone5state12_GLOBAL__N_124compute_access_list_costERKSt6vectorISt4pairIN4evmc7addressES2_INS4_7bytes32ESaIS6_EEESaIS9_EE +FN:28,state.cpp:_ZN6evmone5state12_GLOBAL__N_19num_wordsEm +FN:94,state.cpp:_ZN6evmone5state12_GLOBAL__N_126process_authorization_listERNS0_5StateEmRKSt6vectorINS0_13AuthorizationESaIS5_EE +FN:176,state.cpp:_ZN6evmone5state12_GLOBAL__N_113build_messageERKNS0_11TransactionEl +FNDA:481905,_ZNK6evmone5state5State10build_diffE13evmc_revision +FNDA:1179616,_ZN6evmone5state5State6insertERKN4evmc7addressENS0_7AccountE +FNDA:53675344,_ZN6evmone5state5State4findERKN4evmc7addressE +FNDA:32279575,_ZN6evmone5state5State3getERKN4evmc7addressE +FNDA:9555825,_ZN6evmone5state5State13get_or_insertERKN4evmc7addressENS0_7AccountE +FNDA:5277162,_ZN6evmone5state5State8get_codeERKN4evmc7addressE +FNDA:4473054,_ZN6evmone5state5State5touchERKN4evmc7addressE +FNDA:10566779,_ZN6evmone5state5State11get_storageERKN4evmc7addressERKNS2_7bytes32E +FNDA:328424,_ZN6evmone5state5State22journal_balance_changeERKN4evmc7addressERKN4intx4uintILj256EEE +FNDA:5273495,_ZN6evmone5state5State22journal_storage_changeERKN4evmc7addressERKNS2_7bytes32ERKNS0_12StorageValueE +FNDA:9077186,_ZN6evmone5state5State32journal_transient_storage_changeERKN4evmc7addressERKNS2_7bytes32ES8_ +FNDA:36146,_ZN6evmone5state5State18journal_bump_nonceERKN4evmc7addressE +FNDA:81835,_ZN6evmone5state5State14journal_createERKN4evmc7addressEb +FNDA:4342,_ZN6evmone5state5State16journal_destructERKN4evmc7addressE +FNDA:588038,_ZN6evmone5state5State22journal_access_accountERKN4evmc7addressE +FNDA:2416337,_ZN6evmone5state5State8rollbackEm +FNDA:155334,_ZN6evmone5state20validate_transactionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11TransactionE13evmc_revisionll +FNDA:153624,_ZN6evmone5state8finalizeERKNS0_9StateViewE13evmc_revisionRKN4evmc7addressESt8optionalImESt4spanIKNS0_5OmmerELm18446744073709551615EESB_IKNS0_10WithdrawalELm18446744073709551615EE +FNDA:148703,_ZN6evmone5state10transitionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11BlockHashesERKNS0_11TransactionE13evmc_revisionRN4evmc2VMERKNS0_21TransactionPropertiesE +FNDA:31834,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalBalanceChangeEEEDaRKT_ +FNDA:0,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_14JournalTouchedEEEDaRKT_ +FNDA:1188259,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalStorageChangeEEEDaRKT_ +FNDA:6070,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_16JournalNonceBumpEEEDaRKT_ +FNDA:10435,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_13JournalCreateEEEDaRKT_ +FNDA:9067478,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_29JournalTransientStorageChangeEEEDaRKT_ +FNDA:74,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_15JournalDestructEEEDaRKT_ +FNDA:14280,state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalAccessAccountEEEDaRKT_ +FNDA:42376,state.cpp:_ZZN6evmone5state20validate_transactionERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11TransactionE13evmc_revisionllENK3$_0clIN4evmc7bytes32EEEDaRKT_ +FNDA:153069,state.cpp:_ZN6evmone5state12_GLOBAL__N_125compute_tx_intrinsic_costE13evmc_revisionRKNS0_11TransactionE +FNDA:153069,state.cpp:_ZN6evmone5state12_GLOBAL__N_122compute_tx_data_tokensE13evmc_revisionSt17basic_string_viewIhN4evmc11byte_traitsIhEEE +FNDA:153069,state.cpp:_ZN6evmone5state12_GLOBAL__N_124compute_access_list_costERKSt6vectorISt4pairIN4evmc7addressES2_INS4_7bytes32ESaIS6_EEESaIS9_EE +FNDA:38975,state.cpp:_ZN6evmone5state12_GLOBAL__N_19num_wordsEm +FNDA:148703,state.cpp:_ZN6evmone5state12_GLOBAL__N_126process_authorization_listERNS0_5StateEmRKSt6vectorINS0_13AuthorizationESaIS5_EE +FNDA:148703,state.cpp:_ZN6evmone5state12_GLOBAL__N_113build_messageERKNS0_11TransactionEl +FNF:27 +FNH:27 +DA:28,38975 +DA:29,38975 +DA:30,38975 +DA:33,153069 +DA:34,153069 +DA:35,153069 +DA:37,153069 +DA:38,153069 +DA:39,153069 +DA:42,153069 +DA:43,153069 +DA:44,153069 +DA:46,153069 +DA:47,153069 +DA:48,164946 +DA:49,153069 +DA:50,153069 +DA:60,153069 +DA:61,153069 +DA:62,153069 +DA:63,153069 +DA:64,153069 +DA:65,153069 +DA:67,153069 +DA:69,153069 +DA:71,153069 +DA:72,153069 +DA:74,153069 +DA:76,153069 +DA:77,153069 +DA:79,153069 +DA:80,153069 +DA:82,153069 +DA:83,153069 +DA:86,153069 +DA:87,153069 +DA:89,153069 +DA:90,153069 +DA:94,148703 +DA:95,148703 +DA:96,148703 +DA:97,37736 +DA:99,37736 +DA:100,56 +DA:103,37680 +DA:104,8 +DA:108,37672 +DA:109,68 +DA:112,37604 +DA:113,12 +DA:117,37592 +DA:120,37592 +DA:123,37592 +DA:124,37592 +DA:125,64 +DA:129,37528 +DA:130,5522 +DA:138,32006 +DA:139,16024 +DA:140,16024 +DA:141,16024 +DA:142,16024 +DA:143,16024 +DA:147,32006 +DA:148,128 +DA:149,128 +DA:150,44 +DA:151,44 +DA:152,44 +DA:153,44 +DA:154,44 +DA:155,128 +DA:157,31878 +DA:158,31878 +DA:159,31878 +DA:160,31878 +DA:161,26582 +DA:163,26582 +DA:164,26582 +DA:165,26582 +DA:166,26582 +DA:167,31878 +DA:170,32006 +DA:171,32006 +DA:172,148703 +DA:173,148703 +DA:176,148703 +DA:177,148703 +DA:179,148703 +DA:180,148703 +DA:181,148703 +DA:182,148703 +DA:183,148703 +DA:184,148703 +DA:185,148703 +DA:186,148703 +DA:187,148703 +DA:188,148703 +DA:189,148703 +DA:190,148703 +DA:191,148703 +DA:192,148703 +DA:193,148703 +DA:194,148703 +DA:198,481905 +DA:199,481905 +DA:200,481905 +DA:201,1178937 +DA:202,1178937 +DA:203,4268 +DA:206,4268 +DA:207,4268 +DA:208,4268 +DA:209,1174669 +DA:210,288642 +DA:211,288642 +DA:212,281604 +DA:213,288642 +DA:214,288642 +DA:221,886027 +DA:225,886027 +DA:226,49163 +DA:228,886027 +DA:229,1834880 +DA:230,1834880 +DA:231,519209 +DA:232,1834880 +DA:233,886027 +DA:234,481905 +DA:235,481905 +DA:238,1179616 +DA:239,1179616 +DA:240,1179616 +DA:241,1179616 +DA:242,1179616 +DA:245,53675344 +DA:248,53675344 +DA:249,50472514 +DA:250,3202830 +DA:251,766604 +DA:252,766604 +DA:253,766604 +DA:254,766604 +DA:255,2436226 +DA:256,3202830 +DA:259,32279575 +DA:260,32279575 +DA:261,32279575 +DA:262,32279575 +DA:263,32279575 +DA:266,9555825 +DA:267,9555825 +DA:268,9149258 +DA:269,406567 +DA:270,9555825 +DA:273,5277162 +DA:274,5277162 +DA:275,5277162 +DA:276,117 +DA:277,5277045 +DA:278,1385432 +DA:279,3891613 +DA:280,283494 +DA:281,3891613 +DA:282,5277045 +DA:285,4473054 +DA:286,4473054 +DA:287,4473054 +DA:288,4 +DA:289,4 +DA:290,4 +DA:291,4 +DA:292,4473054 +DA:293,4473054 +DA:296,10566779 +DA:298,10566779 +DA:299,10566779 +DA:300,10566779 +DA:301,1907057 +DA:302,1907057 +DA:303,1907057 +DA:304,1907057 +DA:305,10566779 +DA:306,10566779 +DA:309,328424 +DA:310,328424 +DA:311,328424 +DA:315,5273495 +DA:316,5273495 +DA:317,5273495 +DA:321,9077186 +DA:322,9077186 +DA:323,9077186 +DA:326,36146 +DA:327,36146 +DA:328,36146 +DA:331,81835 +DA:332,81835 +DA:333,81835 +DA:336,4342 +DA:337,4342 +DA:338,4342 +DA:341,588038 +DA:342,588038 +DA:343,588038 +DA:346,2416337 +DA:347,12734767 +DA:348,10318430 +DA:349,10318430 +DA:350,10318430 +DA:351,10318430 +DA:353,6070 +DA:354,6070 +DA:357,0 +DA:358,0 +DA:361,74 +DA:362,74 +DA:365,14280 +DA:366,14280 +DA:369,10435 +DA:370,10435 +DA:371,9768 +DA:373,9768 +DA:374,9768 +DA:375,9768 +DA:376,9768 +DA:377,9768 +DA:378,667 +DA:379,667 +DA:384,667 +DA:385,667 +DA:388,1188259 +DA:389,1188259 +DA:390,1188259 +DA:391,1188259 +DA:394,9067478 +DA:395,9067478 +DA:396,9067478 +DA:399,31834 +DA:400,31834 +DA:407,10318430 +DA:408,10318430 +DA:409,10318430 +DA:410,10318430 +DA:411,2416337 +DA:418,155334 +DA:419,155334 +DA:420,155334 +DA:421,13395 +DA:422,13395 +DA:423,4 +DA:424,13391 +DA:425,6 +DA:426,13385 +DA:427,12 +DA:428,13373 +DA:429,11 +DA:431,13373 +DA:432,13362 +DA:433,12 +DA:435,42376 +DA:436,42 +DA:437,13308 +DA:438,119 +DA:439,13189 +DA:441,13189 +DA:442,2609 +DA:443,4 +DA:444,2605 +DA:445,4 +DA:446,2601 +DA:447,4 +DA:448,2597 +DA:450,139330 +DA:451,155334 +DA:453,155116 +DA:454,155116 +DA:455,2597 +DA:456,15786 +DA:457,21032 +DA:458,21032 +DA:459,14 +DA:461,21018 +DA:462,10 +DA:463,21008 +DA:465,27369 +DA:466,27369 +DA:467,12 +DA:468,27357 +DA:470,155080 +DA:471,155116 +DA:473,155116 +DA:475,155080 +DA:476,21 +DA:478,155059 +DA:479,7 +DA:481,155052 +DA:482,28 +DA:486,155024 +DA:487,155024 +DA:489,155024 +DA:490,155024 +DA:491,74 +DA:493,154950 +DA:494,12 +DA:496,154938 +DA:497,12 +DA:499,154926 +DA:500,2 +DA:503,154924 +DA:504,22 +DA:509,154902 +DA:510,154902 +DA:512,154902 +DA:513,13169 +DA:514,13169 +DA:516,13169 +DA:517,13169 +DA:518,154902 +DA:519,1833 +DA:521,153069 +DA:522,153069 +DA:523,4366 +DA:525,148703 +DA:526,148703 +DA:527,153069 +DA:532,153624 +DA:533,153624 +DA:535,153624 +DA:536,79993 +DA:537,79993 +DA:538,79993 +DA:539,79993 +DA:540,79993 +DA:542,79993 +DA:543,79993 +DA:544,0 +DA:545,0 +DA:546,0 +DA:547,0 +DA:548,79993 +DA:550,153624 +DA:551,4168 +DA:553,153624 +DA:554,153624 +DA:559,148703 +DA:560,148703 +DA:562,148703 +DA:563,148703 +DA:564,148703 +DA:566,148703 +DA:567,148703 +DA:569,148703 +DA:570,148703 +DA:571,148703 +DA:572,148703 +DA:573,148703 +DA:574,148703 +DA:576,148703 +DA:577,148703 +DA:579,148703 +DA:581,148703 +DA:582,11822 +DA:585,11822 +DA:586,11822 +DA:587,11822 +DA:588,11822 +DA:589,11822 +DA:590,11822 +DA:592,148703 +DA:594,148703 +DA:595,148703 +DA:596,109866 +DA:597,148703 +DA:598,114056 +DA:599,114056 +DA:600,114056 +DA:601,70361 +DA:602,114056 +DA:606,148703 +DA:607,125962 +DA:609,148703 +DA:610,148703 +DA:611,109866 +DA:612,109866 +DA:613,540 +DA:614,540 +DA:615,540 +DA:616,540 +DA:617,540 +DA:618,109866 +DA:620,148703 +DA:622,148703 +DA:624,148703 +DA:625,148703 +DA:626,148703 +DA:627,148703 +DA:628,148703 +DA:631,148703 +DA:633,148703 +DA:634,148703 +DA:637,148703 +DA:638,148703 +DA:641,148703 +DA:643,148703 +DA:644,148703 +BRDA:37,0,0,144002 +BRDA:37,0,1,9067 +BRDA:47,0,0,164946 +BRDA:47,0,1,153069 +BRDA:69,0,0,39077 +BRDA:69,0,1,113992 +BRDA:69,1,2,39070 +BRDA:69,1,3,7 +BRDA:80,0,0,39077 +BRDA:80,0,1,113992 +BRDA:80,1,2,38975 +BRDA:80,1,3,102 +BRDA:87,0,0,87749 +BRDA:87,0,1,65320 +BRDA:96,0,0,37736 +BRDA:96,0,1,148703 +BRDA:99,0,0,56 +BRDA:99,0,1,37680 +BRDA:99,1,2,198 +BRDA:99,1,3,37538 +BRDA:99,2,4,56 +BRDA:99,2,5,142 +BRDA:103,0,0,8 +BRDA:103,0,1,37672 +BRDA:108,0,0,68 +BRDA:108,0,1,37604 +BRDA:112,0,0,12 +BRDA:112,0,1,37592 +BRDA:123,0,0,10854 +BRDA:123,0,1,26738 +BRDA:124,0,0,64 +BRDA:124,0,1,10790 +BRDA:129,0,0,5522 +BRDA:129,0,1,32006 +BRDA:138,0,0,16024 +BRDA:138,0,1,15982 +BRDA:147,0,0,128 +BRDA:147,0,1,31878 +BRDA:149,0,0,44 +BRDA:149,0,1,84 +BRDA:160,0,0,26582 +BRDA:160,0,1,5296 +BRDA:177,0,0,109866 +BRDA:177,0,1,38837 +BRDA:180,0,0,109866 +BRDA:180,0,1,38837 +BRDA:200,0,0,1178937 +BRDA:200,0,1,481905 +BRDA:202,0,0,4268 +BRDA:202,0,1,1174669 +BRDA:209,0,0,402464 +BRDA:209,0,1,772205 +BRDA:209,1,2,400754 +BRDA:209,1,3,1710 +BRDA:209,2,4,288642 +BRDA:209,2,5,112112 +BRDA:211,0,0,281604 +BRDA:211,0,1,7038 +BRDA:225,0,0,49163 +BRDA:225,0,1,836864 +BRDA:228,0,0,1834880 +BRDA:228,0,1,886027 +BRDA:230,0,0,519209 +BRDA:230,0,1,1315671 +BRDA:248,0,0,50472514 +BRDA:248,0,1,3202830 +BRDA:250,0,0,766604 +BRDA:250,0,1,2436226 +BRDA:267,0,0,9149258 +BRDA:267,0,1,406567 +BRDA:275,0,0,117 +BRDA:275,0,1,5277045 +BRDA:277,0,0,1385432 +BRDA:277,0,1,3891613 +BRDA:279,0,0,283494 +BRDA:279,0,1,3608119 +BRDA:287,0,0,1840611 +BRDA:287,0,1,2632443 +BRDA:287,1,2,4 +BRDA:287,1,3,1840607 +BRDA:300,0,0,1907057 +BRDA:300,0,1,8659722 +BRDA:347,0,0,10318430 +BRDA:347,0,1,2416337 +BRDA:370,0,0,9768 +BRDA:370,0,1,667 +BRDA:421,0,0,13395 +BRDA:421,0,1,141939 +BRDA:422,0,0,4 +BRDA:422,0,1,13391 +BRDA:424,0,0,6 +BRDA:424,0,1,13385 +BRDA:426,0,0,12 +BRDA:426,0,1,13373 +BRDA:428,0,0,5288 +BRDA:428,0,1,8085 +BRDA:428,1,2,11 +BRDA:428,1,3,5277 +BRDA:432,0,0,12 +BRDA:432,0,1,13350 +BRDA:435,0,0,42 +BRDA:435,0,1,13308 +BRDA:437,0,0,119 +BRDA:437,0,1,13189 +BRDA:441,0,0,2609 +BRDA:441,0,1,152725 +BRDA:442,0,0,4 +BRDA:442,0,1,2605 +BRDA:444,0,0,4 +BRDA:444,0,1,2601 +BRDA:446,0,0,4 +BRDA:446,0,1,2597 +BRDA:450,0,0,139330 +BRDA:450,0,1,16004 +BRDA:453,0,0,155116 +BRDA:453,0,1,0 +BRDA:455,0,0,2597 +BRDA:455,0,1,152519 +BRDA:456,0,0,13189 +BRDA:456,0,1,141927 +BRDA:457,0,0,5246 +BRDA:457,0,1,149870 +BRDA:458,0,0,14 +BRDA:458,0,1,21018 +BRDA:461,0,0,10 +BRDA:461,0,1,21008 +BRDA:465,0,0,6361 +BRDA:465,0,1,148755 +BRDA:466,0,0,12 +BRDA:466,0,1,27357 +BRDA:470,0,0,127723 +BRDA:470,0,1,27393 +BRDA:475,0,0,45090 +BRDA:475,0,1,109990 +BRDA:475,1,2,21 +BRDA:475,1,3,45069 +BRDA:478,0,0,7 +BRDA:478,0,1,155052 +BRDA:481,0,0,28 +BRDA:481,0,1,155024 +BRDA:489,0,0,74 +BRDA:489,0,1,154950 +BRDA:489,1,2,120 +BRDA:489,1,3,154904 +BRDA:490,0,0,74 +BRDA:490,0,1,46 +BRDA:493,0,0,12 +BRDA:493,0,1,154938 +BRDA:496,0,0,12 +BRDA:496,0,1,154926 +BRDA:499,0,0,2 +BRDA:499,0,1,154924 +BRDA:503,0,0,130851 +BRDA:503,0,1,24073 +BRDA:503,1,2,39237 +BRDA:503,1,3,91614 +BRDA:503,2,4,22 +BRDA:503,2,5,39215 +BRDA:512,0,0,13169 +BRDA:512,0,1,141733 +BRDA:518,0,0,1833 +BRDA:518,0,1,153069 +BRDA:522,0,0,4366 +BRDA:522,0,1,148703 +BRDA:535,0,0,79993 +BRDA:535,0,1,73631 +BRDA:543,0,0,0 +BRDA:543,0,1,79993 +BRDA:550,0,0,4168 +BRDA:550,0,1,153624 +BRDA:569,0,0,133650 +BRDA:569,0,1,15053 +BRDA:581,0,0,11822 +BRDA:581,0,1,136881 +BRDA:595,0,0,109866 +BRDA:595,0,1,38837 +BRDA:597,0,0,114056 +BRDA:597,0,1,148703 +BRDA:600,0,0,70361 +BRDA:600,0,1,114056 +BRDA:606,0,0,125962 +BRDA:606,0,1,22741 +BRDA:610,0,0,109866 +BRDA:610,0,1,38837 +BRDA:612,0,0,540 +BRDA:612,0,1,109326 +BRDA:624,0,0,133650 +BRDA:624,0,1,15053 +BRF:188 +BRH:186 +LF:440 +LH:436 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/state.hpp +FN:77,_ZN6evmone5state5StateC2ERKNS0_9StateViewE +FN:103,_ZNK6evmone5state5State10checkpointEv +FNDA:481921,_ZN6evmone5state5StateC2ERKNS0_9StateViewE +FNDA:4144106,_ZNK6evmone5state5State10checkpointEv +FNF:2 +FNH:2 +DA:77,481921 +DA:103,4144106 +BRF:0 +BRH:0 +LF:2 +LH:2 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/state_view.hpp +FN:28,_ZN6evmone5state9StateViewD2Ev +FN:39,_ZN6evmone5state11BlockHashesD2Ev +FNDA:1597698,_ZN6evmone5state9StateViewD2Ev +FNDA:349064,_ZN6evmone5state11BlockHashesD2Ev +FNF:2 +FNH:2 +DA:28,1597698 +DA:39,349064 +BRF:0 +BRH:0 +LF:2 +LH:2 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/system_contracts.cpp +FN:87,_ZN6evmone5state23system_call_block_startERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11BlockHashesE13evmc_revisionRN4evmc2VME +FN:111,_ZN6evmone5state21system_call_block_endERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11BlockHashesE13evmc_revisionRN4evmc2VME +FN:36,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_1clERKNS0_9BlockInfoERKNS0_11BlockHashesE +FN:40,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_2clERKNS0_9BlockInfoERKNS0_11BlockHashesE +FN:69,system_contracts.cpp:_ZN6evmone5state12_GLOBAL__N_119execute_system_callERNS0_5StateERKNS0_9BlockInfoERKNS0_11BlockHashesE13evmc_revisionRN4evmc2VMERKNSB_7addressESt17basic_string_viewIhNSB_11byte_traitsIhEEESK_ +FN:59,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_0clINS1_21StorageSystemContractES4_EEDaRKT_RKT0_ +FN:59,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_0clINS1_22RequestsSystemContractES4_EEDaRKT_RKT0_ +FNDA:89819,_ZN6evmone5state23system_call_block_startERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11BlockHashesE13evmc_revisionRN4evmc2VME +FNDA:89775,_ZN6evmone5state21system_call_block_endERKNS0_9StateViewERKNS0_9BlockInfoERKNS0_11BlockHashesE13evmc_revisionRN4evmc2VME +FNDA:66888,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_1clERKNS0_9BlockInfoERKNS0_11BlockHashesE +FNDA:47057,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_2clERKNS0_9BlockInfoERKNS0_11BlockHashesE +FNDA:207971,system_contracts.cpp:_ZN6evmone5state12_GLOBAL__N_119execute_system_callERNS0_5StateERKNS0_9BlockInfoERKNS0_11BlockHashesE13evmc_revisionRN4evmc2VMERKNSB_7addressESt17basic_string_viewIhNSB_11byte_traitsIhEEESK_ +FNDA:0,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_0clINS1_21StorageSystemContractES4_EEDaRKT_RKT0_ +FNDA:0,system_contracts.cpp:_ZNK6evmone5state12_GLOBAL__N_13$_0clINS1_22RequestsSystemContractES4_EEDaRKT_RKT0_ +FNF:6 +FNH:5 +DA:36,66888 +DA:37,66888 +DA:38,66888 +DA:40,47057 +DA:41,47057 +DA:42,47057 +DA:59,0 +DA:69,207971 +DA:70,207971 +DA:71,207971 +DA:72,207971 +DA:73,207971 +DA:74,207971 +DA:75,207971 +DA:76,207971 +DA:77,207971 +DA:79,207971 +DA:80,207971 +DA:81,207971 +DA:82,207971 +DA:87,89819 +DA:88,89819 +DA:89,89819 +DA:90,156709 +DA:91,156709 +DA:92,42756 +DA:96,113953 +DA:97,113953 +DA:98,8 +DA:100,113945 +DA:101,113945 +DA:102,113945 +DA:103,113945 +DA:104,113945 +DA:106,89819 +DA:107,89819 +DA:111,89775 +DA:112,89775 +DA:113,89775 +DA:114,89775 +DA:115,136786 +DA:116,136786 +DA:117,42756 +DA:120,94030 +DA:121,94030 +DA:122,4 +DA:124,94026 +DA:125,94026 +DA:126,12 +DA:127,94014 +DA:128,94014 +DA:129,89759 +DA:130,89775 +BRDA:89,0,0,156709 +BRDA:89,0,1,47063 +BRDA:91,0,0,42756 +BRDA:91,0,1,113953 +BRDA:97,0,0,8 +BRDA:97,0,1,113945 +BRDA:114,0,0,136786 +BRDA:114,0,1,47003 +BRDA:116,0,0,42756 +BRDA:116,0,1,94030 +BRDA:121,0,0,4 +BRDA:121,0,1,94026 +BRDA:125,0,0,12 +BRDA:125,0,1,94014 +BRF:14 +BRH:14 +LF:53 +LH:52 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/state/transaction.hpp +FN:64,_ZNK6evmone5state11Transaction13blob_gas_usedEv +FNDA:126253,_ZNK6evmone5state11Transaction13blob_gas_usedEv +FNF:1 +FNH:1 +DA:64,126253 +BRF:0 +BRH:0 +LF:1 +LH:1 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/statetest/statetest.cpp +FN:111,main +FN:79,statetest.cpp:_ZN12_GLOBAL__N_119register_test_filesERKNSt10filesystem7__cxx114pathERKSt8optionalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEERN4evmc2VMEb +FN:84,statetest.cpp:_ZZN12_GLOBAL__N_119register_test_filesERKNSt10filesystem7__cxx114pathERKSt8optionalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEERN4evmc2VMEbENK3$_0clERKNS1_15directory_entryE +FN:44,statetest.cpp:_ZN12_GLOBAL__N_113StateTestFile12register_oneERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNSt10filesystem7__cxx114pathERKSt8optionalIS6_ERN4evmc2VMEb +FN:46,statetest.cpp:_ZZN12_GLOBAL__N_113StateTestFile12register_oneERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNSt10filesystem7__cxx114pathERKSt8optionalIS6_ERN4evmc2VMEbENKUlvE_clEv +FN:27,statetest.cpp:_ZN12_GLOBAL__N_113StateTestFileC2ENSt10filesystem7__cxx114pathERKSt8optionalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEERN4evmc2VMEb +FN:31,statetest.cpp:_ZN12_GLOBAL__N_113StateTestFile8TestBodyEv +FN:70,statetest.cpp:_ZN12_GLOBAL__N_19StateTest12register_oneERKN6evmone4test19StateTransitionTestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESD_RKNSt10filesystem7__cxx114pathERN4evmc2VMEb +FN:73,statetest.cpp:_ZZN12_GLOBAL__N_19StateTest12register_oneERKN6evmone4test19StateTransitionTestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESD_RKNSt10filesystem7__cxx114pathERN4evmc2VMEbENKUlvE_clEv +FN:62,statetest.cpp:_ZN12_GLOBAL__N_19StateTestC2EN6evmone4test19StateTransitionTestERN4evmc2VMEb +FN:65,statetest.cpp:_ZN12_GLOBAL__N_19StateTest8TestBodyEv +FNDA:1,main +FNDA:1,statetest.cpp:_ZN12_GLOBAL__N_119register_test_filesERKNSt10filesystem7__cxx114pathERKSt8optionalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEERN4evmc2VMEb +FNDA:2814,statetest.cpp:_ZZN12_GLOBAL__N_119register_test_filesERKNSt10filesystem7__cxx114pathERKSt8optionalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEERN4evmc2VMEbENK3$_0clERKNS1_15directory_entryE +FNDA:2696,statetest.cpp:_ZN12_GLOBAL__N_113StateTestFile12register_oneERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNSt10filesystem7__cxx114pathERKSt8optionalIS6_ERN4evmc2VMEb +FNDA:2696,statetest.cpp:_ZZN12_GLOBAL__N_113StateTestFile12register_oneERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERKNSt10filesystem7__cxx114pathERKSt8optionalIS6_ERN4evmc2VMEbENKUlvE_clEv +FNDA:2696,statetest.cpp:_ZN12_GLOBAL__N_113StateTestFileC2ENSt10filesystem7__cxx114pathERKSt8optionalINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEERN4evmc2VMEb +FNDA:2696,statetest.cpp:_ZN12_GLOBAL__N_113StateTestFile8TestBodyEv +FNDA:0,statetest.cpp:_ZN12_GLOBAL__N_19StateTest12register_oneERKN6evmone4test19StateTransitionTestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESD_RKNSt10filesystem7__cxx114pathERN4evmc2VMEb +FNDA:0,statetest.cpp:_ZZN12_GLOBAL__N_19StateTest12register_oneERKN6evmone4test19StateTransitionTestERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESD_RKNSt10filesystem7__cxx114pathERN4evmc2VMEbENKUlvE_clEv +FNDA:0,statetest.cpp:_ZN12_GLOBAL__N_19StateTestC2EN6evmone4test19StateTransitionTestERN4evmc2VMEb +FNDA:0,statetest.cpp:_ZN12_GLOBAL__N_19StateTest8TestBodyEv +FNF:11 +FNH:7 +DA:27,2696 +DA:28,2696 +DA:31,2696 +DA:32,2696 +DA:33,2696 +DA:34,2696 +DA:35,63805 +DA:36,63805 +DA:37,0 +DA:38,63805 +DA:39,63805 +DA:40,2696 +DA:44,2696 +DA:45,2696 +DA:46,2696 +DA:47,2696 +DA:48,2696 +DA:49,2696 +DA:62,0 +DA:63,0 +DA:65,0 +DA:70,0 +DA:71,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:79,1 +DA:80,1 +DA:81,1 +DA:82,1 +DA:83,1 +DA:84,2814 +DA:86,2814 +DA:87,2814 +DA:88,2814 +DA:89,1 +DA:91,1 +DA:92,2696 +DA:93,2696 +DA:94,1 +DA:95,0 +DA:96,0 +DA:97,0 +DA:98,0 +DA:99,0 +DA:100,0 +DA:101,0 +DA:102,0 +DA:103,0 +DA:104,0 +DA:105,0 +DA:106,1 +DA:111,1 +DA:113,1 +DA:114,1 +DA:116,1 +DA:117,1 +DA:118,1 +DA:119,1 +DA:120,1 +DA:121,1 +DA:123,1 +DA:124,1 +DA:125,1 +DA:127,1 +DA:129,1 +DA:131,1 +DA:132,1 +DA:133,1 +DA:134,1 +DA:135,1 +DA:136,1 +DA:137,1 +DA:139,1 +DA:140,1 +DA:141,1 +DA:143,1 +DA:144,1 +DA:145,1 +DA:146,1 +DA:147,1 +DA:149,1 +DA:151,1 +DA:153,1 +DA:154,0 +DA:155,0 +DA:156,0 +DA:157,0 +DA:159,1 +DA:160,1 +DA:162,1 +DA:163,1 +DA:164,1 +DA:165,1 +DA:166,0 +DA:167,0 +DA:168,0 +DA:169,1 +BRDA:34,0,0,63805 +BRDA:34,0,1,2696 +BRDA:36,0,0,0 +BRDA:36,0,1,63805 +BRDA:36,1,2,- +BRDA:36,1,3,- +BRDA:80,0,0,1 +BRDA:80,0,1,0 +BRDA:86,0,0,2696 +BRDA:86,0,1,118 +BRDA:86,1,2,2696 +BRDA:86,1,3,0 +BRDA:87,0,0,2696 +BRDA:87,0,1,0 +BRDA:91,0,0,2696 +BRDA:91,0,1,1 +BRDA:99,0,0,- +BRDA:99,0,1,- +BRDA:101,0,0,- +BRDA:101,0,1,- +BRDA:101,1,2,- +BRDA:101,1,3,- +BRDA:153,0,0,0 +BRDA:153,0,1,1 +BRDA:159,0,0,1 +BRDA:159,0,1,1 +BRDA:160,0,0,0 +BRDA:160,0,1,1 +BRDA:160,1,2,0 +BRDA:160,1,3,1 +BRF:30 +BRH:15 +LF:106 +LH:78 +end_of_record +SF:/home/user/sources/ethereum/evmone/test/statetest/statetest_runner.cpp +FN:13,_ZN6evmone4test14run_state_testERKNS0_19StateTransitionTestERN4evmc2VMEb +FNDA:63805,_ZN6evmone4test14run_state_testERKNS0_19StateTransitionTestERN4evmc2VMEb +FNF:1 +FNH:1 +DA:13,63805 +DA:14,63805 +DA:15,63805 +DA:16,63805 +DA:17,63805 +DA:18,127610 +DA:19,63805 +DA:20,63805 +DA:26,63805 +DA:27,63805 +DA:28,63805 +DA:29,63805 +DA:31,63805 +DA:32,63805 +DA:35,63805 +DA:37,63805 +DA:39,63805 +DA:40,0 +DA:41,0 +DA:42,0 +DA:43,0 +DA:44,0 +DA:45,0 +DA:46,0 +DA:47,0 +DA:48,0 +DA:49,0 +DA:50,0 +DA:51,0 +DA:52,0 +DA:54,63805 +DA:55,3056 +DA:56,6112 +DA:57,6112 +DA:58,3056 +DA:59,3056 +DA:60,60749 +DA:61,60749 +DA:62,121498 +DA:63,121498 +DA:64,60749 +DA:65,60749 +DA:67,63805 +DA:68,63805 +DA:69,63805 +DA:70,63805 +BRDA:15,0,0,63805 +BRDA:15,0,1,63805 +BRDA:18,0,0,63805 +BRDA:18,0,1,63805 +BRDA:39,0,0,0 +BRDA:39,0,1,63805 +BRDA:42,0,0,- +BRDA:42,0,1,- +BRDA:45,0,0,- +BRDA:45,0,1,- +BRDA:54,0,0,3056 +BRDA:54,0,1,60749 +BRDA:56,0,0,3056 +BRDA:56,0,1,0 +BRDA:56,1,2,0 +BRDA:56,1,3,3056 +BRDA:56,2,4,3056 +BRDA:56,2,5,0 +BRDA:58,0,0,0 +BRDA:58,0,1,3056 +BRDA:58,1,2,3056 +BRDA:58,1,3,0 +BRDA:58,2,4,3056 +BRDA:58,2,5,0 +BRDA:62,0,0,60749 +BRDA:62,0,1,0 +BRDA:62,1,2,0 +BRDA:62,1,3,60749 +BRDA:62,2,4,60749 +BRDA:62,2,5,0 +BRDA:64,0,0,60749 +BRDA:64,0,1,0 +BRDA:64,1,2,0 +BRDA:64,1,3,60749 +BRDA:64,2,4,60749 +BRDA:64,2,5,0 +BRDA:67,0,0,63805 +BRDA:67,0,1,0 +BRDA:67,1,2,0 +BRDA:67,1,3,63805 +BRDA:67,2,4,63805 +BRDA:67,2,5,0 +BRF:42 +BRH:22 +LF:46 +LH:33 +end_of_record diff --git a/reports/coverage_eest_wip_annotated/html/control.js b/reports/coverage_eest_wip_annotated/html/control.js new file mode 100644 index 0000000000..5897b005c8 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/control.js @@ -0,0 +1,99 @@ + +function next_uncovered(selector, reverse, scroll_selector) { + function visit_element(element) { + element.classList.add("seen"); + element.classList.add("selected"); + + if (!scroll_selector) { + scroll_selector = "tr:has(.selected) td.line-number" + } + + const scroll_to = document.querySelector(scroll_selector); + if (scroll_to) { + scroll_to.scrollIntoView({behavior: "smooth", block: "center", inline: "end"}); + } + } + + function select_one() { + if (!reverse) { + const previously_selected = document.querySelector(".selected"); + + if (previously_selected) { + previously_selected.classList.remove("selected"); + } + + return document.querySelector(selector + ":not(.seen)"); + } else { + const previously_selected = document.querySelector(".selected"); + + if (previously_selected) { + previously_selected.classList.remove("selected"); + previously_selected.classList.remove("seen"); + } + + const nodes = document.querySelectorAll(selector + ".seen"); + if (nodes) { + const last = nodes[nodes.length - 1]; // last + return last; + } else { + return undefined; + } + } + } + + function reset_all() { + if (!reverse) { + const all_seen = document.querySelectorAll(selector + ".seen"); + + if (all_seen) { + all_seen.forEach(e => e.classList.remove("seen")); + } + } else { + const all_seen = document.querySelectorAll(selector + ":not(.seen)"); + + if (all_seen) { + all_seen.forEach(e => e.classList.add("seen")); + } + } + + } + + const uncovered = select_one(); + + if (uncovered) { + visit_element(uncovered); + } else { + reset_all(); + + const uncovered = select_one(); + + if (uncovered) { + visit_element(uncovered); + } + } +} + +function next_line(reverse) { + next_uncovered("td.uncovered-line", reverse) +} + +function next_region(reverse) { + next_uncovered("span.red.region", reverse); +} + +function next_branch(reverse) { + next_uncovered("span.red.branch", reverse); +} + +document.addEventListener("keypress", function(event) { + const reverse = event.shiftKey; + if (event.code == "KeyL") { + next_line(reverse); + } + if (event.code == "KeyB") { + next_branch(reverse); + } + if (event.code == "KeyR") { + next_region(reverse); + } +}); diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/build/cov/test/evmone/version.h.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/build/cov/test/evmone/version.h.html new file mode 100644 index 0000000000..5f1870ee84 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/build/cov/test/evmone/version.h.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/build/cov/test/evmone/version.h
Line
Count
Source
1
/* Cable: CMake Bootstrap Library.
2
 * Copyright 2019 Pawel Bylica.
3
 * Licensed under the Apache License, Version 2.0.
4
 */
5
6
/* Generated by Cable Build Info on 2025-11-29T09:02:14. Do not modify directly. */
7
8
#pragma once
9
10
2
#define EVMONE_VERSION "0.18.0-22+commit.31bf2116"
11
12
#ifdef __cplusplus
13
constexpr auto evmone_version = "0.18.0-22+commit.31bf2116";
14
#endif
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/include/evmmax/evmmax.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/include/evmmax/evmmax.hpp.html new file mode 100644 index 0000000000..b9aeb1927e --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/include/evmmax/evmmax.hpp.html @@ -0,0 +1,71 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/include/evmmax/evmmax.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <intx/intx.hpp>
7
8
namespace evmmax
9
{
10
11
/// Compute the modulus inverse for Montgomery multiplication, i.e. N': mod⋅N' = 2⁶⁴-1.
12
///
13
/// @param mod0  The least significant word of the modulus.
14
constexpr uint64_t compute_mod_inv(uint64_t mod0) noexcept
15
3.98k
{
16
    // TODO: Find what is this algorithm and why it works.
17
3.98k
    uint64_t base = 0 - mod0;
18
3.98k
    uint64_t result = 1;
19
259k
    for (auto i = 0; i < 64; 
++i255k
)
  Branch (19:22): [True: 255k, False: 3.98k]
+
20
255k
    {
21
255k
        result *= base;
22
255k
        base *= base;
23
255k
    }
24
3.98k
    return result;
25
3.98k
}
26
27
/// The modular arithmetic operations for EVMMAX (EVM Modular Arithmetic Extensions).
28
template <typename UintT>
29
class ModArith
30
{
31
public:
32
    const UintT mod;  ///< The modulus.
33
34
private:
35
    const UintT m_r_squared;  ///< R² % mod.
36
37
    /// The modulus inversion, i.e. the number N' such that mod⋅N' = 2⁶⁴-1.
38
    const uint64_t m_mod_inv;
39
40
    /// Compute R² % mod.
41
    static constexpr UintT compute_r_squared(const UintT& mod) noexcept
42
3.98k
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
3.98k
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
3.98k
        return intx::udivrem(r2, mod).rem;
47
3.98k
    }
evmmax::ModArith<intx::uint<256u>>::compute_r_squared(intx::uint<256u> const&)
Line
Count
Source
42
2.36k
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
2.36k
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
2.36k
        return intx::udivrem(r2, mod).rem;
47
2.36k
    }
evmmax::ModArith<intx::uint<128u>>::compute_r_squared(intx::uint<128u> const&)
Line
Count
Source
42
620
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
620
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
620
        return intx::udivrem(r2, mod).rem;
47
620
    }
evmmax::ModArith<intx::uint<512u>>::compute_r_squared(intx::uint<512u> const&)
Line
Count
Source
42
599
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
599
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
599
        return intx::udivrem(r2, mod).rem;
47
599
    }
evmmax::ModArith<intx::uint<1024u>>::compute_r_squared(intx::uint<1024u> const&)
Line
Count
Source
42
86
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
86
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
86
        return intx::udivrem(r2, mod).rem;
47
86
    }
evmmax::ModArith<intx::uint<2048u>>::compute_r_squared(intx::uint<2048u> const&)
Line
Count
Source
42
114
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
114
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
114
        return intx::udivrem(r2, mod).rem;
47
114
    }
evmmax::ModArith<intx::uint<8192u>>::compute_r_squared(intx::uint<8192u> const&)
Line
Count
Source
42
200
    {
43
        // R is 2^num_bits, R² is 2^(2*num_bits) and needs 2*num_bits+1 bits to represent,
44
        // rounded to 2*num_bits+64) for intx requirements.
45
200
        constexpr auto r2 = intx::uint<UintT::num_bits * 2 + 64>{1} << (UintT::num_bits * 2);
46
200
        return intx::udivrem(r2, mod).rem;
47
200
    }
48
49
    static constexpr std::pair<uint64_t, uint64_t> addmul(
50
        uint64_t t, uint64_t a, uint64_t b, uint64_t c) noexcept
51
1.52G
    {
52
1.52G
        const auto p = intx::umul(a, b) + t + c;
53
1.52G
        return {p[1], p[0]};
54
1.52G
    }
evmmax::ModArith<intx::uint<256u>>::addmul(unsigned long, unsigned long, unsigned long, unsigned long)
Line
Count
Source
51
1.35G
    {
52
1.35G
        const auto p = intx::umul(a, b) + t + c;
53
1.35G
        return {p[1], p[0]};
54
1.35G
    }
evmmax::ModArith<intx::uint<128u>>::addmul(unsigned long, unsigned long, unsigned long, unsigned long)
Line
Count
Source
51
2.06M
    {
52
2.06M
        const auto p = intx::umul(a, b) + t + c;
53
2.06M
        return {p[1], p[0]};
54
2.06M
    }
evmmax::ModArith<intx::uint<512u>>::addmul(unsigned long, unsigned long, unsigned long, unsigned long)
Line
Count
Source
51
9.29M
    {
52
9.29M
        const auto p = intx::umul(a, b) + t + c;
53
9.29M
        return {p[1], p[0]};
54
9.29M
    }
evmmax::ModArith<intx::uint<1024u>>::addmul(unsigned long, unsigned long, unsigned long, unsigned long)
Line
Count
Source
51
600k
    {
52
600k
        const auto p = intx::umul(a, b) + t + c;
53
600k
        return {p[1], p[0]};
54
600k
    }
evmmax::ModArith<intx::uint<2048u>>::addmul(unsigned long, unsigned long, unsigned long, unsigned long)
Line
Count
Source
51
91.7M
    {
52
91.7M
        const auto p = intx::umul(a, b) + t + c;
53
91.7M
        return {p[1], p[0]};
54
91.7M
    }
evmmax::ModArith<intx::uint<8192u>>::addmul(unsigned long, unsigned long, unsigned long, unsigned long)
Line
Count
Source
51
67.5M
    {
52
67.5M
        const auto p = intx::umul(a, b) + t + c;
53
67.5M
        return {p[1], p[0]};
54
67.5M
    }
55
56
public:
57
    constexpr explicit ModArith(const UintT& modulus) noexcept
58
3.98k
      : mod{modulus},
59
3.98k
        m_r_squared{compute_r_squared(modulus)},
60
3.98k
        m_mod_inv{compute_mod_inv(modulus[0])}
61
3.98k
    {}
evmmax::ModArith<intx::uint<128u>>::ModArith(intx::uint<128u> const&)
Line
Count
Source
58
620
      : mod{modulus},
59
620
        m_r_squared{compute_r_squared(modulus)},
60
620
        m_mod_inv{compute_mod_inv(modulus[0])}
61
620
    {}
evmmax::ModArith<intx::uint<256u>>::ModArith(intx::uint<256u> const&)
Line
Count
Source
58
2.36k
      : mod{modulus},
59
2.36k
        m_r_squared{compute_r_squared(modulus)},
60
2.36k
        m_mod_inv{compute_mod_inv(modulus[0])}
61
2.36k
    {}
evmmax::ModArith<intx::uint<512u>>::ModArith(intx::uint<512u> const&)
Line
Count
Source
58
599
      : mod{modulus},
59
599
        m_r_squared{compute_r_squared(modulus)},
60
599
        m_mod_inv{compute_mod_inv(modulus[0])}
61
599
    {}
evmmax::ModArith<intx::uint<1024u>>::ModArith(intx::uint<1024u> const&)
Line
Count
Source
58
86
      : mod{modulus},
59
86
        m_r_squared{compute_r_squared(modulus)},
60
86
        m_mod_inv{compute_mod_inv(modulus[0])}
61
86
    {}
evmmax::ModArith<intx::uint<2048u>>::ModArith(intx::uint<2048u> const&)
Line
Count
Source
58
114
      : mod{modulus},
59
114
        m_r_squared{compute_r_squared(modulus)},
60
114
        m_mod_inv{compute_mod_inv(modulus[0])}
61
114
    {}
evmmax::ModArith<intx::uint<8192u>>::ModArith(intx::uint<8192u> const&)
Line
Count
Source
58
200
      : mod{modulus},
59
200
        m_r_squared{compute_r_squared(modulus)},
60
200
        m_mod_inv{compute_mod_inv(modulus[0])}
61
200
    {}
62
63
    /// Converts a value to Montgomery form.
64
    ///
65
    /// This is done by using Montgomery multiplication mul(x, R²)
66
    /// what gives aR²R⁻¹ % mod = aR % mod.
67
59.9k
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
evmmax::ModArith<intx::uint<256u>>::to_mont(intx::uint<256u> const&) const
Line
Count
Source
67
56.6k
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
evmmax::ModArith<intx::uint<128u>>::to_mont(intx::uint<128u> const&) const
Line
Count
Source
67
1.24k
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
evmmax::ModArith<intx::uint<512u>>::to_mont(intx::uint<512u> const&) const
Line
Count
Source
67
1.19k
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
evmmax::ModArith<intx::uint<1024u>>::to_mont(intx::uint<1024u> const&) const
Line
Count
Source
67
172
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
evmmax::ModArith<intx::uint<2048u>>::to_mont(intx::uint<2048u> const&) const
Line
Count
Source
67
228
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
evmmax::ModArith<intx::uint<8192u>>::to_mont(intx::uint<8192u> const&) const
Line
Count
Source
67
400
    constexpr UintT to_mont(const UintT& x) const noexcept { return mul(x, m_r_squared); }
68
69
    /// Converts a value in Montgomery form back to normal value.
70
    ///
71
    /// Given the x is the Montgomery form x = aR, the conversion is done by using
72
    /// Montgomery multiplication mul(x, 1) what gives aRR⁻¹ % mod = a % mod.
73
23.0k
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
evmmax::ModArith<intx::uint<256u>>::from_mont(intx::uint<256u> const&) const
Line
Count
Source
73
21.4k
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
evmmax::ModArith<intx::uint<128u>>::from_mont(intx::uint<128u> const&) const
Line
Count
Source
73
620
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
evmmax::ModArith<intx::uint<512u>>::from_mont(intx::uint<512u> const&) const
Line
Count
Source
73
599
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
evmmax::ModArith<intx::uint<1024u>>::from_mont(intx::uint<1024u> const&) const
Line
Count
Source
73
86
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
evmmax::ModArith<intx::uint<2048u>>::from_mont(intx::uint<2048u> const&) const
Line
Count
Source
73
114
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
evmmax::ModArith<intx::uint<8192u>>::from_mont(intx::uint<8192u> const&) const
Line
Count
Source
73
200
    constexpr UintT from_mont(const UintT& x) const noexcept { return mul(x, 1); }
74
75
    /// Performs a Montgomery modular multiplication.
76
    ///
77
    /// Inputs must be in Montgomery form: x = aR, y = bR.
78
    /// This computes Montgomery multiplication xyR⁻¹ % mod what gives aRbRR⁻¹ % mod = abR % mod.
79
    /// The result (abR) is in Montgomery form.
80
    constexpr UintT mul(const UintT& x, const UintT& y) const noexcept
81
42.5M
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
42.5M
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
42.5M
        intx::uint<UintT::num_bits + 64> t;
90
214M
        for (size_t i = 0; i != S; 
++i171M
)
  Branch (90:28): [True: 168M, False: 42.2M]
+
  Branch (90:28): [True: 516k, False: 258k]
+
  Branch (90:28): [True: 580k, False: 72.5k]
+
  Branch (90:28): [True: 18.7k, False: 1.17k]
+
  Branch (90:28): [True: 1.43M, False: 44.8k]
+
  Branch (90:28): [True: 263k, False: 2.06k]
+
91
171M
        {
92
171M
            uint64_t c = 0;
93
171M
#pragma GCC unroll 8
94
932M
            for (size_t j = 0; j != S; 
++j760M
)
  Branch (94:32): [True: 675M, False: 168M]
+
  Branch (94:32): [True: 1.03M, False: 516k]
+
  Branch (94:32): [True: 4.64M, False: 580k]
+
  Branch (94:32): [True: 300k, False: 18.7k]
+
  Branch (94:32): [True: 45.8M, False: 1.43M]
+
  Branch (94:32): [True: 33.7M, False: 263k]
+
95
760M
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
171M
            auto tmp = intx::addc(t[S], c);
97
171M
            t[S] = tmp.value;
98
171M
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
171M
            const auto m = t[0] * m_mod_inv;
101
171M
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
171M
#pragma GCC unroll 8
103
760M
            for (size_t j = 1; j != S; 
++j589M
)
  Branch (103:32): [True: 506M, False: 168M]
+
  Branch (103:32): [True: 516k, False: 516k]
+
  Branch (103:32): [True: 4.06M, False: 580k]
+
  Branch (103:32): [True: 281k, False: 18.7k]
+
  Branch (103:32): [True: 44.4M, False: 1.43M]
+
  Branch (103:32): [True: 33.5M, False: 263k]
+
104
589M
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
171M
            tmp = intx::addc(t[S], c);
106
171M
            t[S - 1] = tmp.value;
107
171M
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
171M
        }
109
110
42.5M
        if (t >= mod)
  Branch (110:13): [True: 3.86M, False: 38.3M]
+
  Branch (110:13): [True: 210, False: 258k]
+
  Branch (110:13): [True: 292, False: 72.3k]
+
  Branch (110:13): [True: 140, False: 1.03k]
+
  Branch (110:13): [True: 322, False: 44.4k]
+
  Branch (110:13): [True: 72, False: 1.99k]
+
111
3.86M
            t -= mod;
112
113
42.5M
        return static_cast<UintT>(t);
114
42.5M
    }
evmmax::ModArith<intx::uint<256u>>::mul(intx::uint<256u> const&, intx::uint<256u> const&) const
Line
Count
Source
81
42.2M
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
42.2M
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
42.2M
        intx::uint<UintT::num_bits + 64> t;
90
211M
        for (size_t i = 0; i != S; 
++i168M
)
  Branch (90:28): [True: 168M, False: 42.2M]
+
91
168M
        {
92
168M
            uint64_t c = 0;
93
168M
#pragma GCC unroll 8
94
844M
            for (size_t j = 0; j != S; 
++j675M
)
  Branch (94:32): [True: 675M, False: 168M]
+
95
675M
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
168M
            auto tmp = intx::addc(t[S], c);
97
168M
            t[S] = tmp.value;
98
168M
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
168M
            const auto m = t[0] * m_mod_inv;
101
168M
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
168M
#pragma GCC unroll 8
103
675M
            for (size_t j = 1; j != S; 
++j506M
)
  Branch (103:32): [True: 506M, False: 168M]
+
104
506M
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
168M
            tmp = intx::addc(t[S], c);
106
168M
            t[S - 1] = tmp.value;
107
168M
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
168M
        }
109
110
42.2M
        if (t >= mod)
  Branch (110:13): [True: 3.86M, False: 38.3M]
+
111
3.86M
            t -= mod;
112
113
42.2M
        return static_cast<UintT>(t);
114
42.2M
    }
evmmax::ModArith<intx::uint<128u>>::mul(intx::uint<128u> const&, intx::uint<128u> const&) const
Line
Count
Source
81
258k
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
258k
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
258k
        intx::uint<UintT::num_bits + 64> t;
90
774k
        for (size_t i = 0; i != S; 
++i516k
)
  Branch (90:28): [True: 516k, False: 258k]
+
91
516k
        {
92
516k
            uint64_t c = 0;
93
516k
#pragma GCC unroll 8
94
1.54M
            for (size_t j = 0; j != S; 
++j1.03M
)
  Branch (94:32): [True: 1.03M, False: 516k]
+
95
1.03M
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
516k
            auto tmp = intx::addc(t[S], c);
97
516k
            t[S] = tmp.value;
98
516k
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
516k
            const auto m = t[0] * m_mod_inv;
101
516k
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
516k
#pragma GCC unroll 8
103
1.03M
            for (size_t j = 1; j != S; 
++j516k
)
  Branch (103:32): [True: 516k, False: 516k]
+
104
516k
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
516k
            tmp = intx::addc(t[S], c);
106
516k
            t[S - 1] = tmp.value;
107
516k
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
516k
        }
109
110
258k
        if (t >= mod)
  Branch (110:13): [True: 210, False: 258k]
+
111
210
            t -= mod;
112
113
258k
        return static_cast<UintT>(t);
114
258k
    }
evmmax::ModArith<intx::uint<512u>>::mul(intx::uint<512u> const&, intx::uint<512u> const&) const
Line
Count
Source
81
72.5k
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
72.5k
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
72.5k
        intx::uint<UintT::num_bits + 64> t;
90
653k
        for (size_t i = 0; i != S; 
++i580k
)
  Branch (90:28): [True: 580k, False: 72.5k]
+
91
580k
        {
92
580k
            uint64_t c = 0;
93
580k
#pragma GCC unroll 8
94
5.22M
            for (size_t j = 0; j != S; 
++j4.64M
)
  Branch (94:32): [True: 4.64M, False: 580k]
+
95
4.64M
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
580k
            auto tmp = intx::addc(t[S], c);
97
580k
            t[S] = tmp.value;
98
580k
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
580k
            const auto m = t[0] * m_mod_inv;
101
580k
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
580k
#pragma GCC unroll 8
103
4.64M
            for (size_t j = 1; j != S; 
++j4.06M
)
  Branch (103:32): [True: 4.06M, False: 580k]
+
104
4.06M
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
580k
            tmp = intx::addc(t[S], c);
106
580k
            t[S - 1] = tmp.value;
107
580k
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
580k
        }
109
110
72.5k
        if (t >= mod)
  Branch (110:13): [True: 292, False: 72.3k]
+
111
292
            t -= mod;
112
113
72.5k
        return static_cast<UintT>(t);
114
72.5k
    }
evmmax::ModArith<intx::uint<1024u>>::mul(intx::uint<1024u> const&, intx::uint<1024u> const&) const
Line
Count
Source
81
1.17k
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
1.17k
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
1.17k
        intx::uint<UintT::num_bits + 64> t;
90
19.9k
        for (size_t i = 0; i != S; 
++i18.7k
)
  Branch (90:28): [True: 18.7k, False: 1.17k]
+
91
18.7k
        {
92
18.7k
            uint64_t c = 0;
93
18.7k
#pragma GCC unroll 8
94
318k
            for (size_t j = 0; j != S; 
++j300k
)
  Branch (94:32): [True: 300k, False: 18.7k]
+
95
300k
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
18.7k
            auto tmp = intx::addc(t[S], c);
97
18.7k
            t[S] = tmp.value;
98
18.7k
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
18.7k
            const auto m = t[0] * m_mod_inv;
101
18.7k
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
18.7k
#pragma GCC unroll 8
103
300k
            for (size_t j = 1; j != S; 
++j281k
)
  Branch (103:32): [True: 281k, False: 18.7k]
+
104
281k
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
18.7k
            tmp = intx::addc(t[S], c);
106
18.7k
            t[S - 1] = tmp.value;
107
18.7k
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
18.7k
        }
109
110
1.17k
        if (t >= mod)
  Branch (110:13): [True: 140, False: 1.03k]
+
111
140
            t -= mod;
112
113
1.17k
        return static_cast<UintT>(t);
114
1.17k
    }
evmmax::ModArith<intx::uint<2048u>>::mul(intx::uint<2048u> const&, intx::uint<2048u> const&) const
Line
Count
Source
81
44.8k
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
44.8k
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
44.8k
        intx::uint<UintT::num_bits + 64> t;
90
1.47M
        for (size_t i = 0; i != S; 
++i1.43M
)
  Branch (90:28): [True: 1.43M, False: 44.8k]
+
91
1.43M
        {
92
1.43M
            uint64_t c = 0;
93
1.43M
#pragma GCC unroll 8
94
47.3M
            for (size_t j = 0; j != S; 
++j45.8M
)
  Branch (94:32): [True: 45.8M, False: 1.43M]
+
95
45.8M
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
1.43M
            auto tmp = intx::addc(t[S], c);
97
1.43M
            t[S] = tmp.value;
98
1.43M
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
1.43M
            const auto m = t[0] * m_mod_inv;
101
1.43M
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
1.43M
#pragma GCC unroll 8
103
45.8M
            for (size_t j = 1; j != S; 
++j44.4M
)
  Branch (103:32): [True: 44.4M, False: 1.43M]
+
104
44.4M
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
1.43M
            tmp = intx::addc(t[S], c);
106
1.43M
            t[S - 1] = tmp.value;
107
1.43M
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
1.43M
        }
109
110
44.8k
        if (t >= mod)
  Branch (110:13): [True: 322, False: 44.4k]
+
111
322
            t -= mod;
112
113
44.8k
        return static_cast<UintT>(t);
114
44.8k
    }
evmmax::ModArith<intx::uint<8192u>>::mul(intx::uint<8192u> const&, intx::uint<8192u> const&) const
Line
Count
Source
81
2.06k
    {
82
        // Coarsely Integrated Operand Scanning (CIOS) Method
83
        // Based on 2.3.2 from
84
        // High-Speed Algorithms & Architectures For Number-Theoretic Cryptosystems
85
        // https://www.microsoft.com/en-us/research/wp-content/uploads/1998/06/97Acar.pdf
86
87
2.06k
        constexpr auto S = UintT::num_words;  // TODO(C++23): Make it static
88
89
2.06k
        intx::uint<UintT::num_bits + 64> t;
90
265k
        for (size_t i = 0; i != S; 
++i263k
)
  Branch (90:28): [True: 263k, False: 2.06k]
+
91
263k
        {
92
263k
            uint64_t c = 0;
93
263k
#pragma GCC unroll 8
94
34.0M
            for (size_t j = 0; j != S; 
++j33.7M
)
  Branch (94:32): [True: 33.7M, False: 263k]
+
95
33.7M
                std::tie(c, t[j]) = addmul(t[j], x[j], y[i], c);
96
263k
            auto tmp = intx::addc(t[S], c);
97
263k
            t[S] = tmp.value;
98
263k
            const auto d = tmp.carry;  // TODO: Carry is 0 for sparse modulus.
99
100
263k
            const auto m = t[0] * m_mod_inv;
101
263k
            std::tie(c, std::ignore) = addmul(t[0], m, mod[0], 0);
102
263k
#pragma GCC unroll 8
103
33.7M
            for (size_t j = 1; j != S; 
++j33.5M
)
  Branch (103:32): [True: 33.5M, False: 263k]
+
104
33.5M
                std::tie(c, t[j - 1]) = addmul(t[j], m, mod[j], c);
105
263k
            tmp = intx::addc(t[S], c);
106
263k
            t[S - 1] = tmp.value;
107
263k
            t[S] = d + tmp.carry;  // TODO: Carry is 0 for sparse modulus.
108
263k
        }
109
110
2.06k
        if (t >= mod)
  Branch (110:13): [True: 72, False: 1.99k]
+
111
72
            t -= mod;
112
113
2.06k
        return static_cast<UintT>(t);
114
2.06k
    }
115
116
    /// Performs a modular addition. It is required that x < mod and y < mod, but x and y may be
117
    /// but are not required to be in Montgomery form.
118
    constexpr UintT add(const UintT& x, const UintT& y) const noexcept
119
40.4M
    {
120
40.4M
        const auto s = addc(x, y);  // TODO: cannot overflow if modulus is sparse (e.g. 255 bits).
121
40.4M
        const auto d = subc(s.value, mod);
122
40.4M
        return (!s.carry && 
d.carry34.6M
) ?
s.value21.6M
:
d.value18.7M
;
  Branch (122:17): [True: 34.6M, False: 5.82M]
+  Branch (122:29): [True: 21.6M, False: 12.9M]
+
  MC/DC Decision Region (122:17) to (122:36)
+
+  Number of Conditions: 2
+     Condition C1 --> (122:17)
+     Condition C2 --> (122:29)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
123
40.4M
    }
124
125
    /// Performs a modular subtraction. It is required that x < mod and y < mod, but x and y may be
126
    /// but are not required to be in Montgomery form.
127
    constexpr UintT sub(const UintT& x, const UintT& y) const noexcept
128
24.9M
    {
129
24.9M
        const auto d = subc(x, y);
130
24.9M
        const auto s = d.value + mod;
131
24.9M
        return (d.carry) ? 
s11.7M
:
d.value13.2M
;
  Branch (131:16): [True: 11.7M, False: 13.2M]
+
132
24.9M
    }
133
134
    /// Compute the modular inversion of the x in Montgomery form. The result is in Montgomery form.
135
    /// If x is not invertible, the result is 0.
136
    constexpr UintT inv(const UintT& x) const noexcept
137
8.97k
    {
138
8.97k
        assert((mod & 1) == 1);
139
8.97k
        assert(mod >= 3);
140
141
        // Precompute inverse of 2 modulo mod: inv2 * 2 % mod == 1.
142
        // The 1/2 is inexact division that can be fixed by adding "0" to the numerator
143
        // and making it even: (mod + 1) / 2. To avoid potential overflow of (1 + mod)
144
        // we rewrite it further to (mod - 1 + 2) / 2 = (mod - 1) / 2 + 1 = ⌊mod / 2⌋ + 1.
145
8.97k
        const auto inv2 = (mod >> 1) + 1;
146
147
        // Use extended binary Euclidean algorithm. This evolves variables a and b until a is 0.
148
        // Then GCD(x, mod) is in b. If GCD(x, mod) == 1 then the inversion exists and is in v.
149
        // This follows the classic algorithm (Algorithm 1) presented in
150
        // "Optimized Binary GCD for Modular Inversion".
151
        // https://eprint.iacr.org/2020/972.pdf#algorithm.1
152
        // TODO: The same paper has additional optimizations that could be applied.
153
8.97k
        UintT a = x;
154
8.97k
        UintT b = mod;
155
156
        // Bézout's coefficients are originally initialized to 1 and 0. But because the input x
157
        // is in Montgomery form XR the algorithm would compute X⁻¹R⁻¹. To get the expected X⁻¹R,
158
        // we need to multiply the result by R². We can achieve the same effect "for free"
159
        // by initializing u to R² instead of 1.
160
8.97k
        UintT u = m_r_squared;
161
8.97k
        UintT v = 0;
162
163
2.21M
        while (a != 0)
  Branch (163:16): [True: 2.20M, False: 8.97k]
+
164
2.20M
        {
165
2.20M
            if ((a & 1) != 0)
  Branch (165:17): [True: 1.19M, False: 1.00M]
+
166
1.19M
            {
167
                // if a is odd, update it to a - b.
168
1.19M
                if (const auto [d, less] = subc(a, b); less)
  Branch (168:56): [True: 629k, False: 569k]
+
169
629k
                {
170
                    // swap a and b in case a < b.
171
629k
                    b = a;
172
629k
                    a = -d;
173
174
629k
                    using namespace std;
175
629k
                    swap(u, v);
176
629k
                }
177
569k
                else
178
569k
                {
179
569k
                    a = d;
180
569k
                }
181
1.19M
                u = sub(u, v);
182
1.19M
            }
183
184
            // Compute a / 2 % mod, a is even so division is exact and can be computed as ⌊a / 2⌋.
185
2.20M
            a >>= 1;
186
187
            // Compute u / 2 % mod. If u is even, this can be computed as ⌊u / 2⌋.
188
            // Otherwise, (u - 1 + 1) / 2 = ⌊u / 2⌋ + (1 / 2 % mod).
189
2.20M
            const auto u_odd = (u & 1) != 0;
190
2.20M
            u >>= 1;
191
2.20M
            if (u_odd)
  Branch (191:17): [True: 1.09M, False: 1.10M]
+
192
1.09M
                u += inv2;  // if u is odd, add back ½ % mod.
193
2.20M
        }
194
195
8.97k
        if (b != 1) [[unlikely]]
  Branch (195:13): [True: 2.65k, False: 6.31k]
+
196
2.65k
            v = 0;  // not invertible
197
8.97k
        return v;
198
8.97k
    }
199
};
200
}  // namespace evmmax
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline.hpp.html new file mode 100644 index 0000000000..df736b298d --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline.hpp.html @@ -0,0 +1,2 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone/baseline.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2020 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <evmc/evmc.hpp>
7
#include <evmc/utils.h>
8
#include <memory>
9
10
namespace evmone
11
{
12
using evmc::bytes_view;
13
class ExecutionState;
14
class VM;
15
16
/// A span type for a bitset.
17
struct BitsetSpan
18
{
19
    using word_type = uint64_t;
20
    static constexpr size_t WORD_BITS = sizeof(word_type) * 8;
21
22
    word_type* m_array = nullptr;
23
24
2.65M
    explicit BitsetSpan(word_type* array) noexcept : m_array{array} {}
25
26
    [[nodiscard]] bool test(size_t index) const noexcept
27
7.13M
    {
28
7.13M
        const auto [word, bit_mask] = get_ref(index);
29
7.13M
        return (word & bit_mask) != 0;
30
7.13M
    }
31
32
    void set(size_t index) const noexcept
33
89.5M
    {
34
89.5M
        const auto& [word, bit_mask] = get_ref(index);
35
89.5M
        word |= bit_mask;
36
89.5M
    }
37
38
private:
39
    struct Ref
40
    {
41
        word_type& word_ref;
42
        word_type bit_mask;
43
    };
44
45
    [[nodiscard, gnu::always_inline, msvc::forceinline]] Ref get_ref(size_t index) const noexcept
46
96.7M
    {
47
96.7M
        const auto word_index = index / WORD_BITS;
48
96.7M
        const auto bit_index = index % WORD_BITS;
49
96.7M
        const auto bit_mask = word_type{1} << bit_index;
50
96.7M
        return {m_array[word_index], bit_mask};
51
96.7M
    }
52
};
53
54
namespace baseline
55
{
56
class CodeAnalysis
57
{
58
private:
59
    bytes_view m_raw_code;         ///< Unmodified full code.
60
    bytes_view m_executable_code;  ///< Executable code section.
61
62
    /// Padded code for faster legacy code execution.
63
    /// If not nullptr the executable_code must point to it.
64
    std::unique_ptr<uint8_t[]> m_padded_code;
65
66
    BitsetSpan m_jumpdest_bitset{nullptr};
67
68
public:
69
    /// Constructor for legacy code.
70
    CodeAnalysis(std::unique_ptr<uint8_t[]> padded_code, size_t code_size, BitsetSpan map)
71
2.65M
      : m_raw_code{padded_code.get(), code_size},
72
2.65M
        m_executable_code{padded_code.get(), code_size},
73
2.65M
        m_padded_code{std::move(padded_code)},
74
2.65M
        m_jumpdest_bitset{map}
75
2.65M
    {}
76
77
    /// The raw code as stored in accounts or passes as initcode.
78
    /// TODO: Merge back raw_code() and executable_code() after EOF removal.
79
2.65M
    [[nodiscard]] bytes_view raw_code() const noexcept { return m_raw_code; }
80
81
    /// The pre-processed executable code. This is where interpreter should start execution.
82
15.4M
    [[nodiscard]] bytes_view executable_code() const noexcept { return m_executable_code; }
83
84
    /// Check if given position is valid jump destination. Use only for legacy code.
85
    [[nodiscard]] bool check_jumpdest(uint64_t position) const noexcept
86
7.13M
    {
87
7.13M
        if (position >= m_raw_code.size())
  Branch (87:13): [True: 78, False: 7.13M]
+
88
78
            return false;
89
7.13M
        return m_jumpdest_bitset.test(static_cast<size_t>(position));
90
7.13M
    }
91
};
92
93
/// Analyze the EVM code in preparation for execution.
94
///
95
/// This builds the map of valid JUMPDESTs.
96
///
97
/// @param code         The reference to the EVM code to be analyzed.
98
EVMC_EXPORT CodeAnalysis analyze(bytes_view code);
99
100
/// Executes in Baseline interpreter using EVMC-compatible parameters.
101
evmc_result execute(evmc_vm* vm, const evmc_host_interface* host, evmc_host_context* ctx,
102
    evmc_revision rev, const evmc_message* msg, const uint8_t* code, size_t code_size) noexcept;
103
104
/// Executes in Baseline interpreter with the pre-processed code.
105
EVMC_EXPORT evmc_result execute(VM&, const evmc_host_interface& host, evmc_host_context* ctx,
106
    evmc_revision rev, const evmc_message& msg, const CodeAnalysis& analysis) noexcept;
107
108
}  // namespace baseline
109
}  // namespace evmone
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline_analysis.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline_analysis.cpp.html new file mode 100644 index 0000000000..47f9fe3c30 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline_analysis.cpp.html @@ -0,0 +1,4 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone/baseline_analysis.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2020 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "baseline.hpp"
6
#include "instructions.hpp"
7
#include <memory>
8
9
namespace evmone::baseline
10
{
11
static_assert(std::is_move_constructible_v<CodeAnalysis>);
12
static_assert(std::is_move_assignable_v<CodeAnalysis>);
13
static_assert(!std::is_copy_constructible_v<CodeAnalysis>);
14
static_assert(!std::is_copy_assignable_v<CodeAnalysis>);
15
16
namespace
17
{
18
void analyze_jumpdests(BitsetSpan map, bytes_view code) noexcept
19
2.65M
{
20
    // To find if op is any PUSH opcode (OP_PUSH1 <= op <= OP_PUSH32)
21
    // it can be noticed that OP_PUSH32 is INT8_MAX (0x7f) therefore,
22
    // static_cast<int8_t>(op) <= OP_PUSH32 is always true and can be skipped.
23
2.65M
    static_assert(OP_PUSH32 == std::numeric_limits<int8_t>::max());
24
25
383M
    for (size_t i = 0; i < code.size(); 
++i380M
)
  Branch (25:24): [True: 380M, False: 2.65M]
+
26
380M
    {
27
380M
        const auto op = code[i];
28
380M
        if (static_cast<int8_t>(op) >= OP_PUSH1)  // If any PUSH opcode (see explanation above).
  Branch (28:13): [True: 68.6M, False: 312M]
+
29
68.6M
            i += op - size_t{OP_PUSH1 - 1};       // Skip PUSH data.
30
312M
        else if (INTX_UNLIKELY(op == OP_JUMPDEST))
  Branch (30:18): [True: 89.5M, False: 222M]
+
31
89.5M
            map.set(i);
32
380M
    }
33
2.65M
}
34
35
CodeAnalysis analyze_legacy(bytes_view code)
36
2.65M
{
37
    // We need at most 33 bytes of code padding: 32 for possible missing all data bytes of
38
    // the PUSH32 at the code end; and one more byte for STOP to guarantee there is a terminating
39
    // instruction at the code end.
40
2.65M
    static constexpr auto PADDING = 32 + 1;
41
42
2.65M
    static constexpr auto BITSET_ALIGNMENT = alignof(BitsetSpan::word_type);
43
44
2.65M
    const auto padded_code_size = code.size() + PADDING;
45
2.65M
    const auto aligned_code_size =
46
2.65M
        (padded_code_size + (BITSET_ALIGNMENT - 1)) / BITSET_ALIGNMENT * BITSET_ALIGNMENT;
47
2.65M
    const auto bitset_words = (code.size() + (BitsetSpan::WORD_BITS)) / BitsetSpan::WORD_BITS;
48
2.65M
    const auto total_size = aligned_code_size + bitset_words * sizeof(BitsetSpan::word_type);
49
50
2.65M
    auto storage = std::make_unique_for_overwrite<uint8_t[]>(total_size);
51
2.65M
    std::ranges::copy(code, storage.get());                           // Copy code.
52
2.65M
    std::fill_n(&storage[code.size()], total_size - code.size(), 0);  // Pad code and init bitset.
53
54
2.65M
    const auto bitset_storage =
55
2.65M
        new (&storage[aligned_code_size]) BitsetSpan::word_type[bitset_words];
56
2.65M
    const BitsetSpan jumpdest_bitset{bitset_storage};
57
2.65M
    analyze_jumpdests(jumpdest_bitset, code);
58
59
2.65M
    return {std::move(storage), code.size(), jumpdest_bitset};
60
2.65M
}
61
}  // namespace
62
63
CodeAnalysis analyze(bytes_view code)
64
2.65M
{
65
2.65M
    return analyze_legacy(code);
66
2.65M
}
67
}  // namespace evmone::baseline
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline_execution.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline_execution.cpp.html new file mode 100644 index 0000000000..f13e061275 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline_execution.cpp.html @@ -0,0 +1,1738 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone/baseline_execution.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2020 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "baseline.hpp"
6
#include "baseline_instruction_table.hpp"
7
#include "execution_state.hpp"
8
#include "instructions.hpp"
9
#include "vm.hpp"
10
#include <memory>
11
12
#ifdef NDEBUG
13
#define release_inline gnu::always_inline, msvc::forceinline
14
#else
15
#define release_inline
16
#endif
17
18
#ifdef __GNUC__
19
249M
#define ASM_COMMENT(COMMENT) asm("# " #COMMENT)  // NOLINT(hicpp-no-assembler)
20
#else
21
#define ASM_COMMENT(COMMENT)
22
#endif
23
24
namespace evmone::baseline
25
{
26
namespace
27
{
28
/// Checks instruction requirements before execution.
29
///
30
/// This checks:
31
/// - if the instruction is defined
32
/// - if stack height requirements are fulfilled (stack overflow, stack underflow)
33
/// - charges the instruction base gas cost and checks is there is any gas left.
34
///
35
/// @tparam         Op            Instruction opcode.
36
/// @param          cost_table    Table of base gas costs.
37
/// @param [in,out] gas_left      Gas left.
38
/// @param          stack_top     Pointer to the stack top item.
39
/// @param          stack_bottom  Pointer to the stack bottom.
40
///                               The stack height is stack_top - stack_bottom.
41
/// @return  Status code with information which check has failed
42
///          or EVMC_SUCCESS if everything is fine.
43
template <Opcode Op>
44
inline evmc_status_code check_requirements(const CostTable& cost_table, int64_t& gas_left,
45
    const uint256* stack_top, const uint256* stack_bottom) noexcept
46
249M
{
47
249M
    static_assert(
48
249M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
249M
        "undefined instructions must not be handled by check_requirements()");
50
51
249M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
21.6M
    {
54
21.6M
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
18.8M
        {
61
18.8M
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 85, False: 3.46M]
+
  Branch (61:17): [True: 83, False: 19.3k]
+
  Branch (61:17): [True: 83, False: 9.11k]
+
  Branch (61:17): [True: 499, False: 2.84k]
+
  Branch (61:17): [True: 80, False: 61.0k]
+
  Branch (61:17): [True: 80, False: 9.80k]
+
  Branch (61:17): [True: 154, False: 3.44k]
+
  Branch (61:17): [True: 322, False: 502]
+
  Branch (61:17): [True: 322, False: 1.64k]
+
  Branch (61:17): [True: 490, False: 588]
+
  Branch (61:17): [True: 742, False: 2.88k]
+
  Branch (61:17): [True: 746, False: 12.8k]
+
  Branch (61:17): [True: 742, False: 1.88M]
+
  Branch (61:17): [True: 742, False: 9.07M]
+
  Branch (61:17): [True: 742, False: 1.28k]
+
  Branch (61:17): [True: 670, False: 1.18M]
+
  Branch (61:17): [True: 19, False: 73.2k]
+
  Branch (61:17): [True: 83, False: 15.5k]
+
  Branch (61:17): [True: 45, False: 2.99M]
+
  Branch (61:17): [True: 45, False: 25.4k]
+
62
6.77k
                return EVMC_UNDEFINED_INSTRUCTION;
63
18.8M
        }
64
21.6M
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
127M
    {
70
127M
        static_assert(instr::traits[Op].stack_height_change == 1,
71
127M
            "unexpected instruction with multiple results");
72
127M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 46.9k]
+
  Branch (72:13): [True: 32, False: 23.7k]
+
  Branch (72:13): [True: 32, False: 276k]
+
  Branch (72:13): [True: 32, False: 24.8k]
+
  Branch (72:13): [True: 32, False: 185k]
+
  Branch (72:13): [True: 32, False: 22.0k]
+
  Branch (72:13): [True: 32, False: 13.5k]
+
  Branch (72:13): [True: 22, False: 61.1k]
+
  Branch (72:13): [True: 32, False: 15.0k]
+
  Branch (72:13): [True: 32, False: 151k]
+
  Branch (72:13): [True: 32, False: 135k]
+
  Branch (72:13): [True: 32, False: 13.9k]
+
  Branch (72:13): [True: 32, False: 15.3k]
+
  Branch (72:13): [True: 16, False: 808]
+
  Branch (72:13): [True: 16, False: 1.94k]
+
  Branch (72:13): [True: 12, False: 1.06k]
+
  Branch (72:13): [True: 12, False: 13.6k]
+
  Branch (72:13): [True: 48, False: 5.68M]
+
  Branch (72:13): [True: 32, False: 16.7k]
+
  Branch (72:13): [True: 32, False: 16.5M]
+
  Branch (72:13): [True: 40, False: 1.18M]
+
  Branch (72:13): [True: 88, False: 79.7M]
+
  Branch (72:13): [True: 58, False: 9.93M]
+
  Branch (72:13): [True: 58, False: 1.31M]
+
  Branch (72:13): [True: 58, False: 120k]
+
  Branch (72:13): [True: 58, False: 49.6k]
+
  Branch (72:13): [True: 58, False: 49.8k]
+
  Branch (72:13): [True: 58, False: 46.7k]
+
  Branch (72:13): [True: 58, False: 47.2k]
+
  Branch (72:13): [True: 58, False: 41.9k]
+
  Branch (72:13): [True: 58, False: 30.9k]
+
  Branch (72:13): [True: 58, False: 28.9k]
+
  Branch (72:13): [True: 58, False: 40.5k]
+
  Branch (72:13): [True: 58, False: 38.9k]
+
  Branch (72:13): [True: 58, False: 34.2k]
+
  Branch (72:13): [True: 58, False: 29.1k]
+
  Branch (72:13): [True: 58, False: 48.7k]
+
  Branch (72:13): [True: 58, False: 21.3k]
+
  Branch (72:13): [True: 58, False: 66.3k]
+
  Branch (72:13): [True: 58, False: 31.7k]
+
  Branch (72:13): [True: 58, False: 2.10M]
+
  Branch (72:13): [True: 58, False: 45.1k]
+
  Branch (72:13): [True: 58, False: 37.4k]
+
  Branch (72:13): [True: 58, False: 38.4k]
+
  Branch (72:13): [True: 58, False: 31.9k]
+
  Branch (72:13): [True: 58, False: 30.2k]
+
  Branch (72:13): [True: 58, False: 41.0k]
+
  Branch (72:13): [True: 58, False: 42.1k]
+
  Branch (72:13): [True: 58, False: 28.8k]
+
  Branch (72:13): [True: 58, False: 34.4k]
+
  Branch (72:13): [True: 58, False: 25.0k]
+
  Branch (72:13): [True: 58, False: 92.0k]
+
  Branch (72:13): [True: 58, False: 312k]
+
  Branch (72:13): [True: 32, False: 5.86M]
+
  Branch (72:13): [True: 32, False: 1.23M]
+
  Branch (72:13): [True: 32, False: 619k]
+
  Branch (72:13): [True: 32, False: 283k]
+
  Branch (72:13): [True: 32, False: 123k]
+
  Branch (72:13): [True: 32, False: 63.4k]
+
  Branch (72:13): [True: 32, False: 52.4k]
+
  Branch (72:13): [True: 32, False: 443k]
+
  Branch (72:13): [True: 32, False: 26.6k]
+
  Branch (72:13): [True: 32, False: 52.5k]
+
  Branch (72:13): [True: 32, False: 24.6k]
+
  Branch (72:13): [True: 32, False: 16.6k]
+
  Branch (72:13): [True: 32, False: 30.1k]
+
  Branch (72:13): [True: 32, False: 15.0k]
+
  Branch (72:13): [True: 32, False: 25.0k]
+
  Branch (72:13): [True: 32, False: 17.3k]
+
73
3.01k
            return EVMC_STACK_OVERFLOW;
74
127M
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
105M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
105M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
105M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 334, False: 15.7M]
+
  Branch (79:13): [True: 24, False: 240k]
+
  Branch (79:13): [True: 18, False: 3.29M]
+
  Branch (79:13): [True: 18, False: 42.6k]
+
  Branch (79:13): [True: 24, False: 4.11k]
+
  Branch (79:13): [True: 18, False: 158k]
+
  Branch (79:13): [True: 18, False: 3.65k]
+
  Branch (79:13): [True: 18, False: 2.14k]
+
  Branch (79:13): [True: 18, False: 2.41k]
+
  Branch (79:13): [True: 24, False: 37.5k]
+
  Branch (79:13): [True: 24, False: 2.66k]
+
  Branch (79:13): [True: 34, False: 2.90M]
+
  Branch (79:13): [True: 18, False: 404k]
+
  Branch (79:13): [True: 18, False: 6.65k]
+
  Branch (79:13): [True: 18, False: 6.29k]
+
  Branch (79:13): [True: 24, False: 818k]
+
  Branch (79:13): [True: 18, False: 5.27M]
+
  Branch (79:13): [True: 18, False: 125k]
+
  Branch (79:13): [True: 18, False: 51.1k]
+
  Branch (79:13): [True: 18, False: 1.75k]
+
  Branch (79:13): [True: 24, False: 67.8k]
+
  Branch (79:13): [True: 18, False: 75.5k]
+
  Branch (79:13): [True: 12, False: 3.46M]
+
  Branch (79:13): [True: 12, False: 19.4k]
+
  Branch (79:13): [True: 12, False: 9.18k]
+
  Branch (79:13): [True: 4, False: 3.33k]
+
  Branch (79:13): [True: 30, False: 15.8k]
+
  Branch (79:13): [True: 24, False: 13.1k]
+
  Branch (79:13): [True: 18, False: 1.79M]
+
  Branch (79:13): [True: 50, False: 127k]
+
  Branch (79:13): [True: 24, False: 11.4k]
+
  Branch (79:13): [True: 18, False: 471k]
+
  Branch (79:13): [True: 18, False: 13.3k]
+
  Branch (79:13): [True: 6, False: 9.88k]
+
  Branch (79:13): [True: 12, False: 3.59k]
+
  Branch (79:13): [True: 18, False: 70.0k]
+
  Branch (79:13): [True: 6, False: 3.62k]
+
  Branch (79:13): [True: 48, False: 4.49M]
+
  Branch (79:13): [True: 18, False: 12.2M]
+
  Branch (79:13): [True: 18, False: 8.64M]
+
  Branch (79:13): [True: 18, False: 158k]
+
  Branch (79:13): [True: 18, False: 943k]
+
  Branch (79:13): [True: 18, False: 4.58M]
+
  Branch (79:13): [True: 24, False: 5.50M]
+
  Branch (79:13): [True: 12, False: 7.06M]
+
  Branch (79:13): [True: 24, False: 1.88M]
+
  Branch (79:13): [True: 48, False: 9.07M]
+
  Branch (79:13): [True: 12, False: 2.01k]
+
  Branch (79:13): [True: 18, False: 5.86M]
+
  Branch (79:13): [True: 24, False: 1.23M]
+
  Branch (79:13): [True: 18, False: 619k]
+
  Branch (79:13): [True: 24, False: 283k]
+
  Branch (79:13): [True: 42, False: 123k]
+
  Branch (79:13): [True: 18, False: 63.4k]
+
  Branch (79:13): [True: 24, False: 52.4k]
+
  Branch (79:13): [True: 24, False: 443k]
+
  Branch (79:13): [True: 36, False: 26.6k]
+
  Branch (79:13): [True: 24, False: 52.5k]
+
  Branch (79:13): [True: 24, False: 24.6k]
+
  Branch (79:13): [True: 36, False: 16.6k]
+
  Branch (79:13): [True: 18, False: 30.1k]
+
  Branch (79:13): [True: 30, False: 15.0k]
+
  Branch (79:13): [True: 36, False: 25.0k]
+
  Branch (79:13): [True: 36, False: 17.3k]
+
  Branch (79:13): [True: 44, False: 717k]
+
  Branch (79:13): [True: 44, False: 395k]
+
  Branch (79:13): [True: 50, False: 268k]
+
  Branch (79:13): [True: 50, False: 84.9k]
+
  Branch (79:13): [True: 50, False: 35.8k]
+
  Branch (79:13): [True: 50, False: 8.14k]
+
  Branch (79:13): [True: 56, False: 3.90k]
+
  Branch (79:13): [True: 50, False: 7.82k]
+
  Branch (79:13): [True: 50, False: 5.95k]
+
  Branch (79:13): [True: 50, False: 2.34k]
+
  Branch (79:13): [True: 50, False: 2.77k]
+
  Branch (79:13): [True: 50, False: 6.82k]
+
  Branch (79:13): [True: 44, False: 4.28k]
+
  Branch (79:13): [True: 50, False: 3.60k]
+
  Branch (79:13): [True: 44, False: 2.45k]
+
  Branch (79:13): [True: 44, False: 2.45k]
+
  Branch (79:13): [True: 18, False: 9.75k]
+
  Branch (79:13): [True: 18, False: 8.48k]
+
  Branch (79:13): [True: 30, False: 4.94k]
+
  Branch (79:13): [True: 18, False: 7.13k]
+
  Branch (79:13): [True: 36, False: 1.10k]
+
  Branch (79:13): [True: 24, False: 25.5k]
+
  Branch (79:13): [True: 24, False: 814k]
+
  Branch (79:13): [True: 42, False: 77.6k]
+
  Branch (79:13): [True: 18, False: 527k]
+
  Branch (79:13): [True: 30, False: 73.2k]
+
  Branch (79:13): [True: 12, False: 15.6k]
+
  Branch (79:13): [True: 12, False: 2.99M]
+
  Branch (79:13): [True: 50, False: 25.4k]
+
  Branch (79:13): [True: 12, False: 421k]
+
80
2.83k
            return EVMC_STACK_UNDERFLOW;
81
105M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
243M
    {
85
243M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 48, False: 15.7M]
+
  Branch (85:13): [True: 26, False: 240k]
+
  Branch (85:13): [True: 14, False: 3.29M]
+
  Branch (85:13): [True: 20, False: 42.6k]
+
  Branch (85:13): [True: 14, False: 4.12k]
+
  Branch (85:13): [True: 14, False: 158k]
+
  Branch (85:13): [True: 14, False: 3.65k]
+
  Branch (85:13): [True: 14, False: 2.14k]
+
  Branch (85:13): [True: 14, False: 2.41k]
+
  Branch (85:13): [True: 56, False: 37.4k]
+
  Branch (85:13): [True: 14, False: 2.67k]
+
  Branch (85:13): [True: 14, False: 2.90M]
+
  Branch (85:13): [True: 14, False: 404k]
+
  Branch (85:13): [True: 14, False: 6.65k]
+
  Branch (85:13): [True: 14, False: 6.29k]
+
  Branch (85:13): [True: 14, False: 818k]
+
  Branch (85:13): [True: 22, False: 5.27M]
+
  Branch (85:13): [True: 14, False: 125k]
+
  Branch (85:13): [True: 14, False: 51.1k]
+
  Branch (85:13): [True: 14, False: 1.76k]
+
  Branch (85:13): [True: 14, False: 67.8k]
+
  Branch (85:13): [True: 14, False: 75.5k]
+
  Branch (85:13): [True: 14, False: 3.46M]
+
  Branch (85:13): [True: 14, False: 19.4k]
+
  Branch (85:13): [True: 14, False: 9.18k]
+
  Branch (85:13): [True: 18, False: 3.32k]
+
  Branch (85:13): [True: 14, False: 15.9k]
+
  Branch (85:13): [True: 14, False: 46.9k]
+
  Branch (85:13): [True: 14, False: 13.1k]
+
  Branch (85:13): [True: 14, False: 23.7k]
+
  Branch (85:13): [True: 20, False: 276k]
+
  Branch (85:13): [True: 14, False: 24.8k]
+
  Branch (85:13): [True: 20, False: 1.79M]
+
  Branch (85:13): [True: 14, False: 185k]
+
  Branch (85:13): [True: 14, False: 127k]
+
  Branch (85:13): [True: 14, False: 22.0k]
+
  Branch (85:13): [True: 14, False: 11.4k]
+
  Branch (85:13): [True: 14, False: 13.5k]
+
  Branch (85:13): [True: 422, False: 471k]
+
  Branch (85:13): [True: 38, False: 13.3k]
+
  Branch (85:13): [True: 14, False: 61.1k]
+
  Branch (85:13): [True: 14, False: 9.87k]
+
  Branch (85:13): [True: 14, False: 3.58k]
+
  Branch (85:13): [True: 14, False: 70.0k]
+
  Branch (85:13): [True: 14, False: 15.0k]
+
  Branch (85:13): [True: 14, False: 151k]
+
  Branch (85:13): [True: 14, False: 135k]
+
  Branch (85:13): [True: 14, False: 13.9k]
+
  Branch (85:13): [True: 14, False: 15.3k]
+
  Branch (85:13): [True: 14, False: 810]
+
  Branch (85:13): [True: 14, False: 1.95k]
+
  Branch (85:13): [True: 12, False: 1.06k]
+
  Branch (85:13): [True: 6, False: 3.62k]
+
  Branch (85:13): [True: 12, False: 13.6k]
+
  Branch (85:13): [True: 94, False: 4.49M]
+
  Branch (85:13): [True: 20, False: 12.2M]
+
  Branch (85:13): [True: 64, False: 8.64M]
+
  Branch (85:13): [True: 14, False: 158k]
+
  Branch (85:13): [True: 18, False: 943k]
+
  Branch (85:13): [True: 54, False: 5.50M]
+
  Branch (85:13): [True: 8, False: 7.06M]
+
  Branch (85:13): [True: 54, False: 5.68M]
+
  Branch (85:13): [True: 14, False: 16.7k]
+
  Branch (85:13): [True: 24, False: 16.5M]
+
  Branch (85:13): [True: 56, False: 24.0M]
+
  Branch (85:13): [True: 6, False: 1.88M]
+
  Branch (85:13): [True: 36, False: 9.07M]
+
  Branch (85:13): [True: 54, False: 1.97k]
+
  Branch (85:13): [True: 26, False: 1.18M]
+
  Branch (85:13): [True: 3.68k, False: 79.7M]
+
  Branch (85:13): [True: 128, False: 9.93M]
+
  Branch (85:13): [True: 20, False: 1.31M]
+
  Branch (85:13): [True: 14, False: 120k]
+
  Branch (85:13): [True: 14, False: 49.7k]
+
  Branch (85:13): [True: 14, False: 49.9k]
+
  Branch (85:13): [True: 14, False: 46.7k]
+
  Branch (85:13): [True: 18, False: 47.2k]
+
  Branch (85:13): [True: 14, False: 42.0k]
+
  Branch (85:13): [True: 14, False: 30.9k]
+
  Branch (85:13): [True: 14, False: 28.9k]
+
  Branch (85:13): [True: 14, False: 40.6k]
+
  Branch (85:13): [True: 14, False: 38.9k]
+
  Branch (85:13): [True: 14, False: 34.2k]
+
  Branch (85:13): [True: 14, False: 29.2k]
+
  Branch (85:13): [True: 14, False: 48.8k]
+
  Branch (85:13): [True: 14, False: 21.4k]
+
  Branch (85:13): [True: 14, False: 66.3k]
+
  Branch (85:13): [True: 14, False: 31.7k]
+
  Branch (85:13): [True: 36, False: 2.10M]
+
  Branch (85:13): [True: 14, False: 45.1k]
+
  Branch (85:13): [True: 14, False: 37.5k]
+
  Branch (85:13): [True: 14, False: 38.4k]
+
  Branch (85:13): [True: 14, False: 31.9k]
+
  Branch (85:13): [True: 14, False: 30.3k]
+
  Branch (85:13): [True: 14, False: 41.1k]
+
  Branch (85:13): [True: 14, False: 42.2k]
+
  Branch (85:13): [True: 14, False: 28.8k]
+
  Branch (85:13): [True: 18, False: 34.5k]
+
  Branch (85:13): [True: 14, False: 25.1k]
+
  Branch (85:13): [True: 14, False: 92.0k]
+
  Branch (85:13): [True: 14, False: 312k]
+
  Branch (85:13): [True: 14, False: 5.86M]
+
  Branch (85:13): [True: 14, False: 1.23M]
+
  Branch (85:13): [True: 14, False: 619k]
+
  Branch (85:13): [True: 14, False: 283k]
+
  Branch (85:13): [True: 14, False: 123k]
+
  Branch (85:13): [True: 14, False: 63.4k]
+
  Branch (85:13): [True: 14, False: 52.4k]
+
  Branch (85:13): [True: 14, False: 443k]
+
  Branch (85:13): [True: 14, False: 26.7k]
+
  Branch (85:13): [True: 18, False: 52.5k]
+
  Branch (85:13): [True: 14, False: 24.6k]
+
  Branch (85:13): [True: 14, False: 16.6k]
+
  Branch (85:13): [True: 14, False: 30.1k]
+
  Branch (85:13): [True: 14, False: 15.0k]
+
  Branch (85:13): [True: 14, False: 25.1k]
+
  Branch (85:13): [True: 14, False: 17.3k]
+
  Branch (85:13): [True: 14, False: 717k]
+
  Branch (85:13): [True: 14, False: 395k]
+
  Branch (85:13): [True: 14, False: 268k]
+
  Branch (85:13): [True: 14, False: 84.9k]
+
  Branch (85:13): [True: 14, False: 35.8k]
+
  Branch (85:13): [True: 14, False: 8.18k]
+
  Branch (85:13): [True: 14, False: 3.95k]
+
  Branch (85:13): [True: 14, False: 7.86k]
+
  Branch (85:13): [True: 14, False: 5.99k]
+
  Branch (85:13): [True: 14, False: 2.37k]
+
  Branch (85:13): [True: 14, False: 2.80k]
+
  Branch (85:13): [True: 14, False: 6.86k]
+
  Branch (85:13): [True: 18, False: 4.31k]
+
  Branch (85:13): [True: 14, False: 3.64k]
+
  Branch (85:13): [True: 14, False: 2.48k]
+
  Branch (85:13): [True: 14, False: 2.48k]
+
  Branch (85:13): [True: 32, False: 9.73k]
+
  Branch (85:13): [True: 28, False: 8.47k]
+
  Branch (85:13): [True: 28, False: 4.95k]
+
  Branch (85:13): [True: 28, False: 7.12k]
+
  Branch (85:13): [True: 28, False: 1.10k]
+
  Branch (85:13): [True: 2.31k, False: 23.2k]
+
  Branch (85:13): [True: 84, False: 814k]
+
  Branch (85:13): [True: 100, False: 77.6k]
+
  Branch (85:13): [True: 90, False: 73.1k]
+
  Branch (85:13): [True: 1.97k, False: 13.6k]
+
  Branch (85:13): [True: 122, False: 2.99M]
+
  Branch (85:13): [True: 0, False: 25.4k]
+
  Branch (85:13): [True: 413k, False: 8.01k]
+
86
424k
            return EVMC_OUT_OF_GAS;
87
243M
    }
88
89
242M
    return EVMC_SUCCESS;
90
249M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)0>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
1.29M
{
47
1.29M
    static_assert(
48
1.29M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
1.29M
        "undefined instructions must not be handled by check_requirements()");
50
51
1.29M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
    {
85
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
86
            return EVMC_OUT_OF_GAS;
87
    }
88
89
1.29M
    return EVMC_SUCCESS;
90
1.29M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)1>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
15.7M
{
47
15.7M
    static_assert(
48
15.7M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
15.7M
        "undefined instructions must not be handled by check_requirements()");
50
51
15.7M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
15.7M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
15.7M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
15.7M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 334, False: 15.7M]
+
80
334
            return EVMC_STACK_UNDERFLOW;
81
15.7M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
15.7M
    {
85
15.7M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 48, False: 15.7M]
+
86
48
            return EVMC_OUT_OF_GAS;
87
15.7M
    }
88
89
15.7M
    return EVMC_SUCCESS;
90
15.7M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)2>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
240k
{
47
240k
    static_assert(
48
240k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
240k
        "undefined instructions must not be handled by check_requirements()");
50
51
240k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
240k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
240k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
240k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 240k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
240k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
240k
    {
85
240k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 26, False: 240k]
+
86
26
            return EVMC_OUT_OF_GAS;
87
240k
    }
88
89
240k
    return EVMC_SUCCESS;
90
240k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)3>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
3.29M
{
47
3.29M
    static_assert(
48
3.29M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
3.29M
        "undefined instructions must not be handled by check_requirements()");
50
51
3.29M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
3.29M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
3.29M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
3.29M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 3.29M]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
3.29M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
3.29M
    {
85
3.29M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 3.29M]
+
86
14
            return EVMC_OUT_OF_GAS;
87
3.29M
    }
88
89
3.29M
    return EVMC_SUCCESS;
90
3.29M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)4>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
42.6k
{
47
42.6k
    static_assert(
48
42.6k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
42.6k
        "undefined instructions must not be handled by check_requirements()");
50
51
42.6k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
42.6k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
42.6k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
42.6k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 42.6k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
42.6k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
42.6k
    {
85
42.6k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 20, False: 42.6k]
+
86
20
            return EVMC_OUT_OF_GAS;
87
42.6k
    }
88
89
42.6k
    return EVMC_SUCCESS;
90
42.6k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)5>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
4.13k
{
47
4.13k
    static_assert(
48
4.13k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
4.13k
        "undefined instructions must not be handled by check_requirements()");
50
51
4.13k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
4.13k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
4.13k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
4.13k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 4.11k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
4.13k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
4.13k
    {
85
4.13k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 4.12k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
4.13k
    }
88
89
4.12k
    return EVMC_SUCCESS;
90
4.13k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)6>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
158k
{
47
158k
    static_assert(
48
158k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
158k
        "undefined instructions must not be handled by check_requirements()");
50
51
158k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
158k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
158k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
158k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 158k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
158k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
158k
    {
85
158k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 158k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
158k
    }
88
89
158k
    return EVMC_SUCCESS;
90
158k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)7>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
3.67k
{
47
3.67k
    static_assert(
48
3.67k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
3.67k
        "undefined instructions must not be handled by check_requirements()");
50
51
3.67k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
3.67k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
3.67k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
3.67k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 3.65k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
3.67k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
3.67k
    {
85
3.67k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 3.65k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
3.67k
    }
88
89
3.65k
    return EVMC_SUCCESS;
90
3.67k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)8>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
2.15k
{
47
2.15k
    static_assert(
48
2.15k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
2.15k
        "undefined instructions must not be handled by check_requirements()");
50
51
2.15k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
2.15k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
2.15k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
2.15k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 2.14k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
2.15k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
2.15k
    {
85
2.15k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 2.14k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
2.15k
    }
88
89
2.14k
    return EVMC_SUCCESS;
90
2.15k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)9>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
2.43k
{
47
2.43k
    static_assert(
48
2.43k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
2.43k
        "undefined instructions must not be handled by check_requirements()");
50
51
2.43k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
2.43k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
2.43k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
2.43k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 2.41k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
2.43k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
2.43k
    {
85
2.43k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 2.41k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
2.43k
    }
88
89
2.41k
    return EVMC_SUCCESS;
90
2.43k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)10>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
37.5k
{
47
37.5k
    static_assert(
48
37.5k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
37.5k
        "undefined instructions must not be handled by check_requirements()");
50
51
37.5k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
37.5k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
37.5k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
37.5k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 37.5k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
37.5k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
37.5k
    {
85
37.5k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 56, False: 37.4k]
+
86
56
            return EVMC_OUT_OF_GAS;
87
37.5k
    }
88
89
37.4k
    return EVMC_SUCCESS;
90
37.5k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)11>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
2.68k
{
47
2.68k
    static_assert(
48
2.68k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
2.68k
        "undefined instructions must not be handled by check_requirements()");
50
51
2.68k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
2.68k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
2.68k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
2.68k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 2.66k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
2.68k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
2.68k
    {
85
2.68k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 2.67k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
2.68k
    }
88
89
2.67k
    return EVMC_SUCCESS;
90
2.68k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)16>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
2.90M
{
47
2.90M
    static_assert(
48
2.90M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
2.90M
        "undefined instructions must not be handled by check_requirements()");
50
51
2.90M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
2.90M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
2.90M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
2.90M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 34, False: 2.90M]
+
80
34
            return EVMC_STACK_UNDERFLOW;
81
2.90M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
2.90M
    {
85
2.90M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 2.90M]
+
86
14
            return EVMC_OUT_OF_GAS;
87
2.90M
    }
88
89
2.90M
    return EVMC_SUCCESS;
90
2.90M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)17>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
404k
{
47
404k
    static_assert(
48
404k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
404k
        "undefined instructions must not be handled by check_requirements()");
50
51
404k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
404k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
404k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
404k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 404k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
404k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
404k
    {
85
404k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 404k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
404k
    }
88
89
404k
    return EVMC_SUCCESS;
90
404k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)18>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
6.67k
{
47
6.67k
    static_assert(
48
6.67k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
6.67k
        "undefined instructions must not be handled by check_requirements()");
50
51
6.67k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
6.67k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
6.67k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
6.67k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 6.65k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
6.67k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
6.67k
    {
85
6.67k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 6.65k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
6.67k
    }
88
89
6.65k
    return EVMC_SUCCESS;
90
6.67k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)19>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
6.31k
{
47
6.31k
    static_assert(
48
6.31k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
6.31k
        "undefined instructions must not be handled by check_requirements()");
50
51
6.31k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
6.31k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
6.31k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
6.31k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 6.29k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
6.31k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
6.31k
    {
85
6.31k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 6.29k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
6.31k
    }
88
89
6.29k
    return EVMC_SUCCESS;
90
6.31k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)20>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
818k
{
47
818k
    static_assert(
48
818k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
818k
        "undefined instructions must not be handled by check_requirements()");
50
51
818k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
818k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
818k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
818k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 818k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
818k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
818k
    {
85
818k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 818k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
818k
    }
88
89
818k
    return EVMC_SUCCESS;
90
818k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)21>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
5.27M
{
47
5.27M
    static_assert(
48
5.27M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
5.27M
        "undefined instructions must not be handled by check_requirements()");
50
51
5.27M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
5.27M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
5.27M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
5.27M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 5.27M]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
5.27M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
5.27M
    {
85
5.27M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 22, False: 5.27M]
+
86
22
            return EVMC_OUT_OF_GAS;
87
5.27M
    }
88
89
5.27M
    return EVMC_SUCCESS;
90
5.27M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)22>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
125k
{
47
125k
    static_assert(
48
125k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
125k
        "undefined instructions must not be handled by check_requirements()");
50
51
125k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
125k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
125k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
125k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 125k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
125k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
125k
    {
85
125k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 125k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
125k
    }
88
89
125k
    return EVMC_SUCCESS;
90
125k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)23>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
51.1k
{
47
51.1k
    static_assert(
48
51.1k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
51.1k
        "undefined instructions must not be handled by check_requirements()");
50
51
51.1k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
51.1k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
51.1k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
51.1k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 51.1k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
51.1k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
51.1k
    {
85
51.1k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 51.1k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
51.1k
    }
88
89
51.1k
    return EVMC_SUCCESS;
90
51.1k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)24>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
1.77k
{
47
1.77k
    static_assert(
48
1.77k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
1.77k
        "undefined instructions must not be handled by check_requirements()");
50
51
1.77k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
1.77k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
1.77k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
1.77k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 1.75k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
1.77k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
1.77k
    {
85
1.77k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 1.76k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
1.77k
    }
88
89
1.76k
    return EVMC_SUCCESS;
90
1.77k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)25>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
67.8k
{
47
67.8k
    static_assert(
48
67.8k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
67.8k
        "undefined instructions must not be handled by check_requirements()");
50
51
67.8k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
67.8k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
67.8k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
67.8k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 67.8k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
67.8k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
67.8k
    {
85
67.8k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 67.8k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
67.8k
    }
88
89
67.8k
    return EVMC_SUCCESS;
90
67.8k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)26>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
75.5k
{
47
75.5k
    static_assert(
48
75.5k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
75.5k
        "undefined instructions must not be handled by check_requirements()");
50
51
75.5k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
75.5k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
75.5k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
75.5k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 75.5k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
75.5k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
75.5k
    {
85
75.5k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 75.5k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
75.5k
    }
88
89
75.5k
    return EVMC_SUCCESS;
90
75.5k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)27>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
3.46M
{
47
3.46M
    static_assert(
48
3.46M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
3.46M
        "undefined instructions must not be handled by check_requirements()");
50
51
3.46M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
3.46M
    {
54
3.46M
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
3.46M
        {
61
3.46M
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 85, False: 3.46M]
+
62
85
                return EVMC_UNDEFINED_INSTRUCTION;
63
3.46M
        }
64
3.46M
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
3.46M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
3.46M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
3.46M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 12, False: 3.46M]
+
80
12
            return EVMC_STACK_UNDERFLOW;
81
3.46M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
3.46M
    {
85
3.46M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 3.46M]
+
86
14
            return EVMC_OUT_OF_GAS;
87
3.46M
    }
88
89
3.46M
    return EVMC_SUCCESS;
90
3.46M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)28>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
19.4k
{
47
19.4k
    static_assert(
48
19.4k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
19.4k
        "undefined instructions must not be handled by check_requirements()");
50
51
19.4k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
19.4k
    {
54
19.4k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
19.4k
        {
61
19.4k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 83, False: 19.3k]
+
62
83
                return EVMC_UNDEFINED_INSTRUCTION;
63
19.4k
        }
64
19.4k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
19.4k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
19.4k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
19.4k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 12, False: 19.4k]
+
80
12
            return EVMC_STACK_UNDERFLOW;
81
19.4k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
19.4k
    {
85
19.4k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 19.4k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
19.4k
    }
88
89
19.4k
    return EVMC_SUCCESS;
90
19.4k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)29>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
9.19k
{
47
9.19k
    static_assert(
48
9.19k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
9.19k
        "undefined instructions must not be handled by check_requirements()");
50
51
9.19k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
9.19k
    {
54
9.19k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
9.19k
        {
61
9.19k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 83, False: 9.11k]
+
62
83
                return EVMC_UNDEFINED_INSTRUCTION;
63
9.19k
        }
64
9.19k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
9.19k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
9.19k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
9.19k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 12, False: 9.18k]
+
80
12
            return EVMC_STACK_UNDERFLOW;
81
9.19k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
9.19k
    {
85
9.19k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 9.18k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
9.19k
    }
88
89
9.18k
    return EVMC_SUCCESS;
90
9.19k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)30>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
3.34k
{
47
3.34k
    static_assert(
48
3.34k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
3.34k
        "undefined instructions must not be handled by check_requirements()");
50
51
3.34k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
3.34k
    {
54
3.34k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
3.34k
        {
61
3.34k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 499, False: 2.84k]
+
62
499
                return EVMC_UNDEFINED_INSTRUCTION;
63
3.34k
        }
64
3.34k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
3.34k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
3.34k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
3.34k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 4, False: 3.33k]
+
80
4
            return EVMC_STACK_UNDERFLOW;
81
3.34k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
3.34k
    {
85
3.34k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 18, False: 3.32k]
+
86
18
            return EVMC_OUT_OF_GAS;
87
3.34k
    }
88
89
3.32k
    return EVMC_SUCCESS;
90
3.34k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)32>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
15.9k
{
47
15.9k
    static_assert(
48
15.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
15.9k
        "undefined instructions must not be handled by check_requirements()");
50
51
15.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
15.9k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
15.9k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
15.9k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 30, False: 15.8k]
+
80
30
            return EVMC_STACK_UNDERFLOW;
81
15.9k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
15.9k
    {
85
15.9k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 15.9k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
15.9k
    }
88
89
15.9k
    return EVMC_SUCCESS;
90
15.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)48>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
46.9k
{
47
46.9k
    static_assert(
48
46.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
46.9k
        "undefined instructions must not be handled by check_requirements()");
50
51
46.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
46.9k
    {
70
46.9k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
46.9k
            "unexpected instruction with multiple results");
72
46.9k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 46.9k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
46.9k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
46.9k
    {
85
46.9k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 46.9k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
46.9k
    }
88
89
46.9k
    return EVMC_SUCCESS;
90
46.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)49>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
13.2k
{
47
13.2k
    static_assert(
48
13.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
13.2k
        "undefined instructions must not be handled by check_requirements()");
50
51
13.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
13.2k
    {
54
13.2k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
13.2k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
13.2k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
13.2k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
13.2k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 13.1k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
13.2k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
13.2k
    {
85
13.2k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 13.1k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
13.2k
    }
88
89
13.1k
    return EVMC_SUCCESS;
90
13.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)50>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
23.7k
{
47
23.7k
    static_assert(
48
23.7k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
23.7k
        "undefined instructions must not be handled by check_requirements()");
50
51
23.7k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
23.7k
    {
70
23.7k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
23.7k
            "unexpected instruction with multiple results");
72
23.7k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 23.7k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
23.7k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
23.7k
    {
85
23.7k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 23.7k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
23.7k
    }
88
89
23.7k
    return EVMC_SUCCESS;
90
23.7k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)51>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
276k
{
47
276k
    static_assert(
48
276k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
276k
        "undefined instructions must not be handled by check_requirements()");
50
51
276k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
276k
    {
70
276k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
276k
            "unexpected instruction with multiple results");
72
276k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 276k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
276k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
276k
    {
85
276k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 20, False: 276k]
+
86
20
            return EVMC_OUT_OF_GAS;
87
276k
    }
88
89
276k
    return EVMC_SUCCESS;
90
276k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)52>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
24.8k
{
47
24.8k
    static_assert(
48
24.8k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
24.8k
        "undefined instructions must not be handled by check_requirements()");
50
51
24.8k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
24.8k
    {
70
24.8k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
24.8k
            "unexpected instruction with multiple results");
72
24.8k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 24.8k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
24.8k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
24.8k
    {
85
24.8k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 24.8k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
24.8k
    }
88
89
24.8k
    return EVMC_SUCCESS;
90
24.8k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)53>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
1.79M
{
47
1.79M
    static_assert(
48
1.79M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
1.79M
        "undefined instructions must not be handled by check_requirements()");
50
51
1.79M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
1.79M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
1.79M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
1.79M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 1.79M]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
1.79M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
1.79M
    {
85
1.79M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 20, False: 1.79M]
+
86
20
            return EVMC_OUT_OF_GAS;
87
1.79M
    }
88
89
1.79M
    return EVMC_SUCCESS;
90
1.79M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)54>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
185k
{
47
185k
    static_assert(
48
185k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
185k
        "undefined instructions must not be handled by check_requirements()");
50
51
185k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
185k
    {
70
185k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
185k
            "unexpected instruction with multiple results");
72
185k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 185k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
185k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
185k
    {
85
185k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 185k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
185k
    }
88
89
185k
    return EVMC_SUCCESS;
90
185k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)55>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
127k
{
47
127k
    static_assert(
48
127k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
127k
        "undefined instructions must not be handled by check_requirements()");
50
51
127k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
127k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
127k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
127k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 50, False: 127k]
+
80
50
            return EVMC_STACK_UNDERFLOW;
81
127k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
127k
    {
85
127k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 127k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
127k
    }
88
89
127k
    return EVMC_SUCCESS;
90
127k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)56>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
22.0k
{
47
22.0k
    static_assert(
48
22.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
22.0k
        "undefined instructions must not be handled by check_requirements()");
50
51
22.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
22.0k
    {
70
22.0k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
22.0k
            "unexpected instruction with multiple results");
72
22.0k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 22.0k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
22.0k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
22.0k
    {
85
22.0k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 22.0k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
22.0k
    }
88
89
22.0k
    return EVMC_SUCCESS;
90
22.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)57>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
11.4k
{
47
11.4k
    static_assert(
48
11.4k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
11.4k
        "undefined instructions must not be handled by check_requirements()");
50
51
11.4k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
11.4k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
11.4k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
11.4k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 11.4k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
11.4k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
11.4k
    {
85
11.4k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 11.4k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
11.4k
    }
88
89
11.4k
    return EVMC_SUCCESS;
90
11.4k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)58>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
13.5k
{
47
13.5k
    static_assert(
48
13.5k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
13.5k
        "undefined instructions must not be handled by check_requirements()");
50
51
13.5k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
13.5k
    {
70
13.5k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
13.5k
            "unexpected instruction with multiple results");
72
13.5k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 13.5k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
13.5k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
13.5k
    {
85
13.5k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 13.5k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
13.5k
    }
88
89
13.5k
    return EVMC_SUCCESS;
90
13.5k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)59>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
471k
{
47
471k
    static_assert(
48
471k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
471k
        "undefined instructions must not be handled by check_requirements()");
50
51
471k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
471k
    {
54
471k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
471k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
471k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
471k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
471k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 471k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
471k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
471k
    {
85
471k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 422, False: 471k]
+
86
422
            return EVMC_OUT_OF_GAS;
87
471k
    }
88
89
471k
    return EVMC_SUCCESS;
90
471k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)60>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
13.3k
{
47
13.3k
    static_assert(
48
13.3k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
13.3k
        "undefined instructions must not be handled by check_requirements()");
50
51
13.3k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
13.3k
    {
54
13.3k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
13.3k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
13.3k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
13.3k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
13.3k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 13.3k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
13.3k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
13.3k
    {
85
13.3k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 38, False: 13.3k]
+
86
38
            return EVMC_OUT_OF_GAS;
87
13.3k
    }
88
89
13.3k
    return EVMC_SUCCESS;
90
13.3k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)61>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
61.1k
{
47
61.1k
    static_assert(
48
61.1k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
61.1k
        "undefined instructions must not be handled by check_requirements()");
50
51
61.1k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
61.1k
    {
54
61.1k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
61.1k
        {
61
61.1k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 80, False: 61.0k]
+
62
80
                return EVMC_UNDEFINED_INSTRUCTION;
63
61.1k
        }
64
61.1k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
61.1k
    {
70
61.1k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
61.1k
            "unexpected instruction with multiple results");
72
61.1k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 22, False: 61.1k]
+
73
22
            return EVMC_STACK_OVERFLOW;
74
61.1k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
61.1k
    {
85
61.1k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 61.1k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
61.1k
    }
88
89
61.1k
    return EVMC_SUCCESS;
90
61.1k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)62>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
9.88k
{
47
9.88k
    static_assert(
48
9.88k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
9.88k
        "undefined instructions must not be handled by check_requirements()");
50
51
9.88k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
9.88k
    {
54
9.88k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
9.88k
        {
61
9.88k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 80, False: 9.80k]
+
62
80
                return EVMC_UNDEFINED_INSTRUCTION;
63
9.88k
        }
64
9.88k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
9.88k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
9.88k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
9.88k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 6, False: 9.88k]
+
80
6
            return EVMC_STACK_UNDERFLOW;
81
9.88k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
9.88k
    {
85
9.88k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 9.87k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
9.88k
    }
88
89
9.87k
    return EVMC_SUCCESS;
90
9.88k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)63>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
3.60k
{
47
3.60k
    static_assert(
48
3.60k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
3.60k
        "undefined instructions must not be handled by check_requirements()");
50
51
3.60k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
3.60k
    {
54
3.60k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
3.60k
        {
61
3.60k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 154, False: 3.44k]
+
62
154
                return EVMC_UNDEFINED_INSTRUCTION;
63
3.60k
        }
64
3.60k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
3.60k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
3.60k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
3.60k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 12, False: 3.59k]
+
80
12
            return EVMC_STACK_UNDERFLOW;
81
3.60k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
3.60k
    {
85
3.60k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 3.58k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
3.60k
    }
88
89
3.58k
    return EVMC_SUCCESS;
90
3.60k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)64>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
70.0k
{
47
70.0k
    static_assert(
48
70.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
70.0k
        "undefined instructions must not be handled by check_requirements()");
50
51
70.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
70.0k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
70.0k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
70.0k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 70.0k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
70.0k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
70.0k
    {
85
70.0k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 70.0k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
70.0k
    }
88
89
70.0k
    return EVMC_SUCCESS;
90
70.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)65>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
15.0k
{
47
15.0k
    static_assert(
48
15.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
15.0k
        "undefined instructions must not be handled by check_requirements()");
50
51
15.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
15.0k
    {
70
15.0k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
15.0k
            "unexpected instruction with multiple results");
72
15.0k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 15.0k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
15.0k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
15.0k
    {
85
15.0k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 15.0k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
15.0k
    }
88
89
15.0k
    return EVMC_SUCCESS;
90
15.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)66>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
151k
{
47
151k
    static_assert(
48
151k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
151k
        "undefined instructions must not be handled by check_requirements()");
50
51
151k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
151k
    {
70
151k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
151k
            "unexpected instruction with multiple results");
72
151k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 151k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
151k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
151k
    {
85
151k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 151k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
151k
    }
88
89
151k
    return EVMC_SUCCESS;
90
151k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)67>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
135k
{
47
135k
    static_assert(
48
135k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
135k
        "undefined instructions must not be handled by check_requirements()");
50
51
135k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
135k
    {
70
135k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
135k
            "unexpected instruction with multiple results");
72
135k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 135k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
135k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
135k
    {
85
135k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 135k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
135k
    }
88
89
135k
    return EVMC_SUCCESS;
90
135k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)68>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
13.9k
{
47
13.9k
    static_assert(
48
13.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
13.9k
        "undefined instructions must not be handled by check_requirements()");
50
51
13.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
13.9k
    {
70
13.9k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
13.9k
            "unexpected instruction with multiple results");
72
13.9k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 13.9k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
13.9k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
13.9k
    {
85
13.9k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 13.9k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
13.9k
    }
88
89
13.9k
    return EVMC_SUCCESS;
90
13.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)69>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
15.3k
{
47
15.3k
    static_assert(
48
15.3k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
15.3k
        "undefined instructions must not be handled by check_requirements()");
50
51
15.3k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
15.3k
    {
70
15.3k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
15.3k
            "unexpected instruction with multiple results");
72
15.3k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 15.3k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
15.3k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
15.3k
    {
85
15.3k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 15.3k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
15.3k
    }
88
89
15.3k
    return EVMC_SUCCESS;
90
15.3k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)70>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
824
{
47
824
    static_assert(
48
824
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
824
        "undefined instructions must not be handled by check_requirements()");
50
51
824
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
824
    {
54
824
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
824
        {
61
824
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 322, False: 502]
+
62
322
                return EVMC_UNDEFINED_INSTRUCTION;
63
824
        }
64
824
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
824
    {
70
824
        static_assert(instr::traits[Op].stack_height_change == 1,
71
824
            "unexpected instruction with multiple results");
72
824
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 16, False: 808]
+
73
16
            return EVMC_STACK_OVERFLOW;
74
824
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
824
    {
85
824
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 810]
+
86
14
            return EVMC_OUT_OF_GAS;
87
824
    }
88
89
810
    return EVMC_SUCCESS;
90
824
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)71>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
1.96k
{
47
1.96k
    static_assert(
48
1.96k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
1.96k
        "undefined instructions must not be handled by check_requirements()");
50
51
1.96k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
1.96k
    {
54
1.96k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
1.96k
        {
61
1.96k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 322, False: 1.64k]
+
62
322
                return EVMC_UNDEFINED_INSTRUCTION;
63
1.96k
        }
64
1.96k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
1.96k
    {
70
1.96k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
1.96k
            "unexpected instruction with multiple results");
72
1.96k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 16, False: 1.94k]
+
73
16
            return EVMC_STACK_OVERFLOW;
74
1.96k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
1.96k
    {
85
1.96k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 1.95k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
1.96k
    }
88
89
1.95k
    return EVMC_SUCCESS;
90
1.96k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)72>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
1.07k
{
47
1.07k
    static_assert(
48
1.07k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
1.07k
        "undefined instructions must not be handled by check_requirements()");
50
51
1.07k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
1.07k
    {
54
1.07k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
1.07k
        {
61
1.07k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 490, False: 588]
+
62
490
                return EVMC_UNDEFINED_INSTRUCTION;
63
1.07k
        }
64
1.07k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
1.07k
    {
70
1.07k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
1.07k
            "unexpected instruction with multiple results");
72
1.07k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 12, False: 1.06k]
+
73
12
            return EVMC_STACK_OVERFLOW;
74
1.07k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
1.07k
    {
85
1.07k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 12, False: 1.06k]
+
86
12
            return EVMC_OUT_OF_GAS;
87
1.07k
    }
88
89
1.06k
    return EVMC_SUCCESS;
90
1.07k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)73>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
3.63k
{
47
3.63k
    static_assert(
48
3.63k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
3.63k
        "undefined instructions must not be handled by check_requirements()");
50
51
3.63k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
3.63k
    {
54
3.63k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
3.63k
        {
61
3.63k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 742, False: 2.88k]
+
62
742
                return EVMC_UNDEFINED_INSTRUCTION;
63
3.63k
        }
64
3.63k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
3.63k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
3.63k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
3.63k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 6, False: 3.62k]
+
80
6
            return EVMC_STACK_UNDERFLOW;
81
3.63k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
3.63k
    {
85
3.63k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 6, False: 3.62k]
+
86
6
            return EVMC_OUT_OF_GAS;
87
3.63k
    }
88
89
3.62k
    return EVMC_SUCCESS;
90
3.63k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)74>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
13.6k
{
47
13.6k
    static_assert(
48
13.6k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
13.6k
        "undefined instructions must not be handled by check_requirements()");
50
51
13.6k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
13.6k
    {
54
13.6k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
13.6k
        {
61
13.6k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 746, False: 12.8k]
+
62
746
                return EVMC_UNDEFINED_INSTRUCTION;
63
13.6k
        }
64
13.6k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
13.6k
    {
70
13.6k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
13.6k
            "unexpected instruction with multiple results");
72
13.6k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 12, False: 13.6k]
+
73
12
            return EVMC_STACK_OVERFLOW;
74
13.6k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
13.6k
    {
85
13.6k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 12, False: 13.6k]
+
86
12
            return EVMC_OUT_OF_GAS;
87
13.6k
    }
88
89
13.6k
    return EVMC_SUCCESS;
90
13.6k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)80>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
4.49M
{
47
4.49M
    static_assert(
48
4.49M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
4.49M
        "undefined instructions must not be handled by check_requirements()");
50
51
4.49M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
4.49M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
4.49M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
4.49M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 48, False: 4.49M]
+
80
48
            return EVMC_STACK_UNDERFLOW;
81
4.49M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
4.49M
    {
85
4.49M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 94, False: 4.49M]
+
86
94
            return EVMC_OUT_OF_GAS;
87
4.49M
    }
88
89
4.49M
    return EVMC_SUCCESS;
90
4.49M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)81>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
12.2M
{
47
12.2M
    static_assert(
48
12.2M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
12.2M
        "undefined instructions must not be handled by check_requirements()");
50
51
12.2M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
12.2M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
12.2M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
12.2M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 12.2M]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
12.2M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
12.2M
    {
85
12.2M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 20, False: 12.2M]
+
86
20
            return EVMC_OUT_OF_GAS;
87
12.2M
    }
88
89
12.2M
    return EVMC_SUCCESS;
90
12.2M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)82>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
8.64M
{
47
8.64M
    static_assert(
48
8.64M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
8.64M
        "undefined instructions must not be handled by check_requirements()");
50
51
8.64M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
8.64M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
8.64M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
8.64M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 8.64M]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
8.64M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
8.64M
    {
85
8.64M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 64, False: 8.64M]
+
86
64
            return EVMC_OUT_OF_GAS;
87
8.64M
    }
88
89
8.64M
    return EVMC_SUCCESS;
90
8.64M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)83>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
158k
{
47
158k
    static_assert(
48
158k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
158k
        "undefined instructions must not be handled by check_requirements()");
50
51
158k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
158k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
158k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
158k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 158k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
158k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
158k
    {
85
158k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 158k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
158k
    }
88
89
158k
    return EVMC_SUCCESS;
90
158k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)84>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
943k
{
47
943k
    static_assert(
48
943k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
943k
        "undefined instructions must not be handled by check_requirements()");
50
51
943k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
943k
    {
54
943k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
943k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
943k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
943k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
943k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 943k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
943k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
943k
    {
85
943k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 18, False: 943k]
+
86
18
            return EVMC_OUT_OF_GAS;
87
943k
    }
88
89
943k
    return EVMC_SUCCESS;
90
943k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)85>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
4.58M
{
47
4.58M
    static_assert(
48
4.58M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
4.58M
        "undefined instructions must not be handled by check_requirements()");
50
51
4.58M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
4.58M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
4.58M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
4.58M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 4.58M]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
4.58M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
    {
85
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
86
            return EVMC_OUT_OF_GAS;
87
    }
88
89
4.58M
    return EVMC_SUCCESS;
90
4.58M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)86>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
5.50M
{
47
5.50M
    static_assert(
48
5.50M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
5.50M
        "undefined instructions must not be handled by check_requirements()");
50
51
5.50M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
5.50M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
5.50M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
5.50M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 5.50M]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
5.50M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
5.50M
    {
85
5.50M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 54, False: 5.50M]
+
86
54
            return EVMC_OUT_OF_GAS;
87
5.50M
    }
88
89
5.50M
    return EVMC_SUCCESS;
90
5.50M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)87>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
7.06M
{
47
7.06M
    static_assert(
48
7.06M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
7.06M
        "undefined instructions must not be handled by check_requirements()");
50
51
7.06M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
7.06M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
7.06M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
7.06M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 12, False: 7.06M]
+
80
12
            return EVMC_STACK_UNDERFLOW;
81
7.06M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
7.06M
    {
85
7.06M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 8, False: 7.06M]
+
86
8
            return EVMC_OUT_OF_GAS;
87
7.06M
    }
88
89
7.06M
    return EVMC_SUCCESS;
90
7.06M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)88>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
5.68M
{
47
5.68M
    static_assert(
48
5.68M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
5.68M
        "undefined instructions must not be handled by check_requirements()");
50
51
5.68M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
5.68M
    {
70
5.68M
        static_assert(instr::traits[Op].stack_height_change == 1,
71
5.68M
            "unexpected instruction with multiple results");
72
5.68M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 48, False: 5.68M]
+
73
48
            return EVMC_STACK_OVERFLOW;
74
5.68M
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
5.68M
    {
85
5.68M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 54, False: 5.68M]
+
86
54
            return EVMC_OUT_OF_GAS;
87
5.68M
    }
88
89
5.68M
    return EVMC_SUCCESS;
90
5.68M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)89>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
16.7k
{
47
16.7k
    static_assert(
48
16.7k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
16.7k
        "undefined instructions must not be handled by check_requirements()");
50
51
16.7k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
16.7k
    {
70
16.7k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
16.7k
            "unexpected instruction with multiple results");
72
16.7k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 16.7k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
16.7k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
16.7k
    {
85
16.7k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 16.7k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
16.7k
    }
88
89
16.7k
    return EVMC_SUCCESS;
90
16.7k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)90>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
16.5M
{
47
16.5M
    static_assert(
48
16.5M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
16.5M
        "undefined instructions must not be handled by check_requirements()");
50
51
16.5M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
16.5M
    {
70
16.5M
        static_assert(instr::traits[Op].stack_height_change == 1,
71
16.5M
            "unexpected instruction with multiple results");
72
16.5M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 16.5M]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
16.5M
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
16.5M
    {
85
16.5M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 24, False: 16.5M]
+
86
24
            return EVMC_OUT_OF_GAS;
87
16.5M
    }
88
89
16.5M
    return EVMC_SUCCESS;
90
16.5M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)91>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
24.0M
{
47
24.0M
    static_assert(
48
24.0M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
24.0M
        "undefined instructions must not be handled by check_requirements()");
50
51
24.0M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
24.0M
    {
85
24.0M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 56, False: 24.0M]
+
86
56
            return EVMC_OUT_OF_GAS;
87
24.0M
    }
88
89
24.0M
    return EVMC_SUCCESS;
90
24.0M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)92>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
1.88M
{
47
1.88M
    static_assert(
48
1.88M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
1.88M
        "undefined instructions must not be handled by check_requirements()");
50
51
1.88M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
1.88M
    {
54
1.88M
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
1.88M
        {
61
1.88M
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 742, False: 1.88M]
+
62
742
                return EVMC_UNDEFINED_INSTRUCTION;
63
1.88M
        }
64
1.88M
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
1.88M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
1.88M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
1.88M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 1.88M]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
1.88M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
1.88M
    {
85
1.88M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 6, False: 1.88M]
+
86
6
            return EVMC_OUT_OF_GAS;
87
1.88M
    }
88
89
1.88M
    return EVMC_SUCCESS;
90
1.88M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)93>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
9.07M
{
47
9.07M
    static_assert(
48
9.07M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
9.07M
        "undefined instructions must not be handled by check_requirements()");
50
51
9.07M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
9.07M
    {
54
9.07M
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
9.07M
        {
61
9.07M
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 742, False: 9.07M]
+
62
742
                return EVMC_UNDEFINED_INSTRUCTION;
63
9.07M
        }
64
9.07M
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
9.07M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
9.07M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
9.07M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 48, False: 9.07M]
+
80
48
            return EVMC_STACK_UNDERFLOW;
81
9.07M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
9.07M
    {
85
9.07M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 36, False: 9.07M]
+
86
36
            return EVMC_OUT_OF_GAS;
87
9.07M
    }
88
89
9.07M
    return EVMC_SUCCESS;
90
9.07M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)94>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
2.02k
{
47
2.02k
    static_assert(
48
2.02k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
2.02k
        "undefined instructions must not be handled by check_requirements()");
50
51
2.02k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
2.02k
    {
54
2.02k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
2.02k
        {
61
2.02k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 742, False: 1.28k]
+
62
742
                return EVMC_UNDEFINED_INSTRUCTION;
63
2.02k
        }
64
2.02k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
2.02k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
2.02k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
2.02k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 12, False: 2.01k]
+
80
12
            return EVMC_STACK_UNDERFLOW;
81
2.02k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
2.02k
    {
85
2.02k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 54, False: 1.97k]
+
86
54
            return EVMC_OUT_OF_GAS;
87
2.02k
    }
88
89
1.97k
    return EVMC_SUCCESS;
90
2.02k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)95>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
1.18M
{
47
1.18M
    static_assert(
48
1.18M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
1.18M
        "undefined instructions must not be handled by check_requirements()");
50
51
1.18M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
1.18M
    {
54
1.18M
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
1.18M
        {
61
1.18M
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 670, False: 1.18M]
+
62
670
                return EVMC_UNDEFINED_INSTRUCTION;
63
1.18M
        }
64
1.18M
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
1.18M
    {
70
1.18M
        static_assert(instr::traits[Op].stack_height_change == 1,
71
1.18M
            "unexpected instruction with multiple results");
72
1.18M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 40, False: 1.18M]
+
73
40
            return EVMC_STACK_OVERFLOW;
74
1.18M
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
1.18M
    {
85
1.18M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 26, False: 1.18M]
+
86
26
            return EVMC_OUT_OF_GAS;
87
1.18M
    }
88
89
1.18M
    return EVMC_SUCCESS;
90
1.18M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)96>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
79.7M
{
47
79.7M
    static_assert(
48
79.7M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
79.7M
        "undefined instructions must not be handled by check_requirements()");
50
51
79.7M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
79.7M
    {
70
79.7M
        static_assert(instr::traits[Op].stack_height_change == 1,
71
79.7M
            "unexpected instruction with multiple results");
72
79.7M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 88, False: 79.7M]
+
73
88
            return EVMC_STACK_OVERFLOW;
74
79.7M
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
79.7M
    {
85
79.7M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 3.68k, False: 79.7M]
+
86
3.68k
            return EVMC_OUT_OF_GAS;
87
79.7M
    }
88
89
79.7M
    return EVMC_SUCCESS;
90
79.7M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)97>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
9.93M
{
47
9.93M
    static_assert(
48
9.93M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
9.93M
        "undefined instructions must not be handled by check_requirements()");
50
51
9.93M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
9.93M
    {
70
9.93M
        static_assert(instr::traits[Op].stack_height_change == 1,
71
9.93M
            "unexpected instruction with multiple results");
72
9.93M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 9.93M]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
9.93M
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
9.93M
    {
85
9.93M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 128, False: 9.93M]
+
86
128
            return EVMC_OUT_OF_GAS;
87
9.93M
    }
88
89
9.93M
    return EVMC_SUCCESS;
90
9.93M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)98>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
1.31M
{
47
1.31M
    static_assert(
48
1.31M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
1.31M
        "undefined instructions must not be handled by check_requirements()");
50
51
1.31M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
1.31M
    {
70
1.31M
        static_assert(instr::traits[Op].stack_height_change == 1,
71
1.31M
            "unexpected instruction with multiple results");
72
1.31M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 1.31M]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
1.31M
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
1.31M
    {
85
1.31M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 20, False: 1.31M]
+
86
20
            return EVMC_OUT_OF_GAS;
87
1.31M
    }
88
89
1.31M
    return EVMC_SUCCESS;
90
1.31M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)99>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
120k
{
47
120k
    static_assert(
48
120k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
120k
        "undefined instructions must not be handled by check_requirements()");
50
51
120k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
120k
    {
70
120k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
120k
            "unexpected instruction with multiple results");
72
120k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 120k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
120k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
120k
    {
85
120k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 120k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
120k
    }
88
89
120k
    return EVMC_SUCCESS;
90
120k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)100>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
49.7k
{
47
49.7k
    static_assert(
48
49.7k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
49.7k
        "undefined instructions must not be handled by check_requirements()");
50
51
49.7k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
49.7k
    {
70
49.7k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
49.7k
            "unexpected instruction with multiple results");
72
49.7k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 49.6k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
49.7k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
49.7k
    {
85
49.7k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 49.7k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
49.7k
    }
88
89
49.7k
    return EVMC_SUCCESS;
90
49.7k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)101>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
49.9k
{
47
49.9k
    static_assert(
48
49.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
49.9k
        "undefined instructions must not be handled by check_requirements()");
50
51
49.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
49.9k
    {
70
49.9k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
49.9k
            "unexpected instruction with multiple results");
72
49.9k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 49.8k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
49.9k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
49.9k
    {
85
49.9k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 49.9k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
49.9k
    }
88
89
49.9k
    return EVMC_SUCCESS;
90
49.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)102>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
46.7k
{
47
46.7k
    static_assert(
48
46.7k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
46.7k
        "undefined instructions must not be handled by check_requirements()");
50
51
46.7k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
46.7k
    {
70
46.7k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
46.7k
            "unexpected instruction with multiple results");
72
46.7k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 46.7k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
46.7k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
46.7k
    {
85
46.7k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 46.7k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
46.7k
    }
88
89
46.7k
    return EVMC_SUCCESS;
90
46.7k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)103>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
47.2k
{
47
47.2k
    static_assert(
48
47.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
47.2k
        "undefined instructions must not be handled by check_requirements()");
50
51
47.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
47.2k
    {
70
47.2k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
47.2k
            "unexpected instruction with multiple results");
72
47.2k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 47.2k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
47.2k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
47.2k
    {
85
47.2k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 18, False: 47.2k]
+
86
18
            return EVMC_OUT_OF_GAS;
87
47.2k
    }
88
89
47.2k
    return EVMC_SUCCESS;
90
47.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)104>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
42.0k
{
47
42.0k
    static_assert(
48
42.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
42.0k
        "undefined instructions must not be handled by check_requirements()");
50
51
42.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
42.0k
    {
70
42.0k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
42.0k
            "unexpected instruction with multiple results");
72
42.0k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 41.9k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
42.0k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
42.0k
    {
85
42.0k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 42.0k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
42.0k
    }
88
89
42.0k
    return EVMC_SUCCESS;
90
42.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)105>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
31.0k
{
47
31.0k
    static_assert(
48
31.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
31.0k
        "undefined instructions must not be handled by check_requirements()");
50
51
31.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
31.0k
    {
70
31.0k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
31.0k
            "unexpected instruction with multiple results");
72
31.0k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 30.9k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
31.0k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
31.0k
    {
85
31.0k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 30.9k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
31.0k
    }
88
89
30.9k
    return EVMC_SUCCESS;
90
31.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)106>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
29.0k
{
47
29.0k
    static_assert(
48
29.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
29.0k
        "undefined instructions must not be handled by check_requirements()");
50
51
29.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
29.0k
    {
70
29.0k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
29.0k
            "unexpected instruction with multiple results");
72
29.0k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 28.9k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
29.0k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
29.0k
    {
85
29.0k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 28.9k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
29.0k
    }
88
89
28.9k
    return EVMC_SUCCESS;
90
29.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)107>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
40.6k
{
47
40.6k
    static_assert(
48
40.6k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
40.6k
        "undefined instructions must not be handled by check_requirements()");
50
51
40.6k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
40.6k
    {
70
40.6k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
40.6k
            "unexpected instruction with multiple results");
72
40.6k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 40.5k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
40.6k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
40.6k
    {
85
40.6k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 40.6k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
40.6k
    }
88
89
40.6k
    return EVMC_SUCCESS;
90
40.6k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)108>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
38.9k
{
47
38.9k
    static_assert(
48
38.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
38.9k
        "undefined instructions must not be handled by check_requirements()");
50
51
38.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
38.9k
    {
70
38.9k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
38.9k
            "unexpected instruction with multiple results");
72
38.9k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 38.9k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
38.9k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
38.9k
    {
85
38.9k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 38.9k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
38.9k
    }
88
89
38.9k
    return EVMC_SUCCESS;
90
38.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)109>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
34.2k
{
47
34.2k
    static_assert(
48
34.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
34.2k
        "undefined instructions must not be handled by check_requirements()");
50
51
34.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
34.2k
    {
70
34.2k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
34.2k
            "unexpected instruction with multiple results");
72
34.2k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 34.2k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
34.2k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
34.2k
    {
85
34.2k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 34.2k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
34.2k
    }
88
89
34.2k
    return EVMC_SUCCESS;
90
34.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)110>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
29.2k
{
47
29.2k
    static_assert(
48
29.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
29.2k
        "undefined instructions must not be handled by check_requirements()");
50
51
29.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
29.2k
    {
70
29.2k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
29.2k
            "unexpected instruction with multiple results");
72
29.2k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 29.1k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
29.2k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
29.2k
    {
85
29.2k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 29.2k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
29.2k
    }
88
89
29.2k
    return EVMC_SUCCESS;
90
29.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)111>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
48.8k
{
47
48.8k
    static_assert(
48
48.8k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
48.8k
        "undefined instructions must not be handled by check_requirements()");
50
51
48.8k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
48.8k
    {
70
48.8k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
48.8k
            "unexpected instruction with multiple results");
72
48.8k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 48.7k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
48.8k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
48.8k
    {
85
48.8k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 48.8k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
48.8k
    }
88
89
48.8k
    return EVMC_SUCCESS;
90
48.8k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)112>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
21.4k
{
47
21.4k
    static_assert(
48
21.4k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
21.4k
        "undefined instructions must not be handled by check_requirements()");
50
51
21.4k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
21.4k
    {
70
21.4k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
21.4k
            "unexpected instruction with multiple results");
72
21.4k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 21.3k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
21.4k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
21.4k
    {
85
21.4k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 21.4k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
21.4k
    }
88
89
21.4k
    return EVMC_SUCCESS;
90
21.4k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)113>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
66.3k
{
47
66.3k
    static_assert(
48
66.3k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
66.3k
        "undefined instructions must not be handled by check_requirements()");
50
51
66.3k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
66.3k
    {
70
66.3k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
66.3k
            "unexpected instruction with multiple results");
72
66.3k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 66.3k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
66.3k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
66.3k
    {
85
66.3k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 66.3k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
66.3k
    }
88
89
66.3k
    return EVMC_SUCCESS;
90
66.3k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)114>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
31.8k
{
47
31.8k
    static_assert(
48
31.8k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
31.8k
        "undefined instructions must not be handled by check_requirements()");
50
51
31.8k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
31.8k
    {
70
31.8k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
31.8k
            "unexpected instruction with multiple results");
72
31.8k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 31.7k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
31.8k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
31.8k
    {
85
31.8k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 31.7k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
31.8k
    }
88
89
31.7k
    return EVMC_SUCCESS;
90
31.8k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)115>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
2.10M
{
47
2.10M
    static_assert(
48
2.10M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
2.10M
        "undefined instructions must not be handled by check_requirements()");
50
51
2.10M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
2.10M
    {
70
2.10M
        static_assert(instr::traits[Op].stack_height_change == 1,
71
2.10M
            "unexpected instruction with multiple results");
72
2.10M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 2.10M]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
2.10M
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
2.10M
    {
85
2.10M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 36, False: 2.10M]
+
86
36
            return EVMC_OUT_OF_GAS;
87
2.10M
    }
88
89
2.10M
    return EVMC_SUCCESS;
90
2.10M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)116>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
45.1k
{
47
45.1k
    static_assert(
48
45.1k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
45.1k
        "undefined instructions must not be handled by check_requirements()");
50
51
45.1k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
45.1k
    {
70
45.1k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
45.1k
            "unexpected instruction with multiple results");
72
45.1k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 45.1k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
45.1k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
45.1k
    {
85
45.1k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 45.1k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
45.1k
    }
88
89
45.1k
    return EVMC_SUCCESS;
90
45.1k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)117>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
37.5k
{
47
37.5k
    static_assert(
48
37.5k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
37.5k
        "undefined instructions must not be handled by check_requirements()");
50
51
37.5k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
37.5k
    {
70
37.5k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
37.5k
            "unexpected instruction with multiple results");
72
37.5k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 37.4k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
37.5k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
37.5k
    {
85
37.5k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 37.5k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
37.5k
    }
88
89
37.5k
    return EVMC_SUCCESS;
90
37.5k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)118>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
38.4k
{
47
38.4k
    static_assert(
48
38.4k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
38.4k
        "undefined instructions must not be handled by check_requirements()");
50
51
38.4k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
38.4k
    {
70
38.4k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
38.4k
            "unexpected instruction with multiple results");
72
38.4k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 38.4k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
38.4k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
38.4k
    {
85
38.4k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 38.4k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
38.4k
    }
88
89
38.4k
    return EVMC_SUCCESS;
90
38.4k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)119>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
31.9k
{
47
31.9k
    static_assert(
48
31.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
31.9k
        "undefined instructions must not be handled by check_requirements()");
50
51
31.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
31.9k
    {
70
31.9k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
31.9k
            "unexpected instruction with multiple results");
72
31.9k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 31.9k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
31.9k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
31.9k
    {
85
31.9k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 31.9k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
31.9k
    }
88
89
31.9k
    return EVMC_SUCCESS;
90
31.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)120>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
30.3k
{
47
30.3k
    static_assert(
48
30.3k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
30.3k
        "undefined instructions must not be handled by check_requirements()");
50
51
30.3k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
30.3k
    {
70
30.3k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
30.3k
            "unexpected instruction with multiple results");
72
30.3k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 30.2k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
30.3k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
30.3k
    {
85
30.3k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 30.3k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
30.3k
    }
88
89
30.3k
    return EVMC_SUCCESS;
90
30.3k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)121>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
41.1k
{
47
41.1k
    static_assert(
48
41.1k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
41.1k
        "undefined instructions must not be handled by check_requirements()");
50
51
41.1k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
41.1k
    {
70
41.1k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
41.1k
            "unexpected instruction with multiple results");
72
41.1k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 41.0k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
41.1k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
41.1k
    {
85
41.1k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 41.1k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
41.1k
    }
88
89
41.1k
    return EVMC_SUCCESS;
90
41.1k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)122>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
42.2k
{
47
42.2k
    static_assert(
48
42.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
42.2k
        "undefined instructions must not be handled by check_requirements()");
50
51
42.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
42.2k
    {
70
42.2k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
42.2k
            "unexpected instruction with multiple results");
72
42.2k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 42.1k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
42.2k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
42.2k
    {
85
42.2k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 42.2k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
42.2k
    }
88
89
42.2k
    return EVMC_SUCCESS;
90
42.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)123>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
28.8k
{
47
28.8k
    static_assert(
48
28.8k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
28.8k
        "undefined instructions must not be handled by check_requirements()");
50
51
28.8k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
28.8k
    {
70
28.8k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
28.8k
            "unexpected instruction with multiple results");
72
28.8k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 28.8k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
28.8k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
28.8k
    {
85
28.8k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 28.8k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
28.8k
    }
88
89
28.8k
    return EVMC_SUCCESS;
90
28.8k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)124>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
34.5k
{
47
34.5k
    static_assert(
48
34.5k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
34.5k
        "undefined instructions must not be handled by check_requirements()");
50
51
34.5k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
34.5k
    {
70
34.5k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
34.5k
            "unexpected instruction with multiple results");
72
34.5k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 34.4k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
34.5k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
34.5k
    {
85
34.5k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 18, False: 34.5k]
+
86
18
            return EVMC_OUT_OF_GAS;
87
34.5k
    }
88
89
34.5k
    return EVMC_SUCCESS;
90
34.5k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)125>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
25.1k
{
47
25.1k
    static_assert(
48
25.1k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
25.1k
        "undefined instructions must not be handled by check_requirements()");
50
51
25.1k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
25.1k
    {
70
25.1k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
25.1k
            "unexpected instruction with multiple results");
72
25.1k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 25.0k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
25.1k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
25.1k
    {
85
25.1k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 25.1k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
25.1k
    }
88
89
25.1k
    return EVMC_SUCCESS;
90
25.1k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)126>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
92.0k
{
47
92.0k
    static_assert(
48
92.0k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
92.0k
        "undefined instructions must not be handled by check_requirements()");
50
51
92.0k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
92.0k
    {
70
92.0k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
92.0k
            "unexpected instruction with multiple results");
72
92.0k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 92.0k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
92.0k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
92.0k
    {
85
92.0k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 92.0k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
92.0k
    }
88
89
92.0k
    return EVMC_SUCCESS;
90
92.0k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)127>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
312k
{
47
312k
    static_assert(
48
312k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
312k
        "undefined instructions must not be handled by check_requirements()");
50
51
312k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
312k
    {
70
312k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
312k
            "unexpected instruction with multiple results");
72
312k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 58, False: 312k]
+
73
58
            return EVMC_STACK_OVERFLOW;
74
312k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
312k
    {
85
312k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 312k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
312k
    }
88
89
312k
    return EVMC_SUCCESS;
90
312k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)128>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
5.86M
{
47
5.86M
    static_assert(
48
5.86M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
5.86M
        "undefined instructions must not be handled by check_requirements()");
50
51
5.86M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
5.86M
    {
70
5.86M
        static_assert(instr::traits[Op].stack_height_change == 1,
71
5.86M
            "unexpected instruction with multiple results");
72
5.86M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 5.86M]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
5.86M
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
5.86M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
5.86M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
5.86M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 5.86M]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
5.86M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
5.86M
    {
85
5.86M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 5.86M]
+
86
14
            return EVMC_OUT_OF_GAS;
87
5.86M
    }
88
89
5.86M
    return EVMC_SUCCESS;
90
5.86M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)129>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
1.23M
{
47
1.23M
    static_assert(
48
1.23M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
1.23M
        "undefined instructions must not be handled by check_requirements()");
50
51
1.23M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
1.23M
    {
70
1.23M
        static_assert(instr::traits[Op].stack_height_change == 1,
71
1.23M
            "unexpected instruction with multiple results");
72
1.23M
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 1.23M]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
1.23M
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
1.23M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
1.23M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
1.23M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 1.23M]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
1.23M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
1.23M
    {
85
1.23M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 1.23M]
+
86
14
            return EVMC_OUT_OF_GAS;
87
1.23M
    }
88
89
1.23M
    return EVMC_SUCCESS;
90
1.23M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)130>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
619k
{
47
619k
    static_assert(
48
619k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
619k
        "undefined instructions must not be handled by check_requirements()");
50
51
619k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
619k
    {
70
619k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
619k
            "unexpected instruction with multiple results");
72
619k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 619k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
619k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
619k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
619k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
619k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 619k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
619k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
619k
    {
85
619k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 619k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
619k
    }
88
89
619k
    return EVMC_SUCCESS;
90
619k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)131>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
283k
{
47
283k
    static_assert(
48
283k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
283k
        "undefined instructions must not be handled by check_requirements()");
50
51
283k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
283k
    {
70
283k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
283k
            "unexpected instruction with multiple results");
72
283k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 283k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
283k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
283k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
283k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
283k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 283k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
283k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
283k
    {
85
283k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 283k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
283k
    }
88
89
283k
    return EVMC_SUCCESS;
90
283k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)132>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
123k
{
47
123k
    static_assert(
48
123k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
123k
        "undefined instructions must not be handled by check_requirements()");
50
51
123k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
123k
    {
70
123k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
123k
            "unexpected instruction with multiple results");
72
123k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 123k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
123k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
123k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
123k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
123k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 42, False: 123k]
+
80
42
            return EVMC_STACK_UNDERFLOW;
81
123k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
123k
    {
85
123k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 123k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
123k
    }
88
89
123k
    return EVMC_SUCCESS;
90
123k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)133>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
63.4k
{
47
63.4k
    static_assert(
48
63.4k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
63.4k
        "undefined instructions must not be handled by check_requirements()");
50
51
63.4k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
63.4k
    {
70
63.4k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
63.4k
            "unexpected instruction with multiple results");
72
63.4k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 63.4k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
63.4k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
63.4k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
63.4k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
63.4k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 63.4k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
63.4k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
63.4k
    {
85
63.4k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 63.4k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
63.4k
    }
88
89
63.4k
    return EVMC_SUCCESS;
90
63.4k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)134>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
52.5k
{
47
52.5k
    static_assert(
48
52.5k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
52.5k
        "undefined instructions must not be handled by check_requirements()");
50
51
52.5k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
52.5k
    {
70
52.5k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
52.5k
            "unexpected instruction with multiple results");
72
52.5k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 52.4k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
52.5k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
52.5k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
52.5k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
52.5k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 52.4k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
52.5k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
52.5k
    {
85
52.5k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 52.4k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
52.5k
    }
88
89
52.4k
    return EVMC_SUCCESS;
90
52.5k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)135>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
443k
{
47
443k
    static_assert(
48
443k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
443k
        "undefined instructions must not be handled by check_requirements()");
50
51
443k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
443k
    {
70
443k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
443k
            "unexpected instruction with multiple results");
72
443k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 443k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
443k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
443k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
443k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
443k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 443k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
443k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
443k
    {
85
443k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 443k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
443k
    }
88
89
443k
    return EVMC_SUCCESS;
90
443k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)136>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
26.7k
{
47
26.7k
    static_assert(
48
26.7k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
26.7k
        "undefined instructions must not be handled by check_requirements()");
50
51
26.7k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
26.7k
    {
70
26.7k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
26.7k
            "unexpected instruction with multiple results");
72
26.7k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 26.6k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
26.7k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
26.7k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
26.7k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
26.7k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 36, False: 26.6k]
+
80
36
            return EVMC_STACK_UNDERFLOW;
81
26.7k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
26.7k
    {
85
26.7k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 26.7k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
26.7k
    }
88
89
26.7k
    return EVMC_SUCCESS;
90
26.7k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)137>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
52.5k
{
47
52.5k
    static_assert(
48
52.5k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
52.5k
        "undefined instructions must not be handled by check_requirements()");
50
51
52.5k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
52.5k
    {
70
52.5k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
52.5k
            "unexpected instruction with multiple results");
72
52.5k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 52.5k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
52.5k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
52.5k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
52.5k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
52.5k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 52.5k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
52.5k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
52.5k
    {
85
52.5k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 18, False: 52.5k]
+
86
18
            return EVMC_OUT_OF_GAS;
87
52.5k
    }
88
89
52.5k
    return EVMC_SUCCESS;
90
52.5k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)138>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
24.6k
{
47
24.6k
    static_assert(
48
24.6k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
24.6k
        "undefined instructions must not be handled by check_requirements()");
50
51
24.6k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
24.6k
    {
70
24.6k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
24.6k
            "unexpected instruction with multiple results");
72
24.6k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 24.6k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
24.6k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
24.6k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
24.6k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
24.6k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 24.6k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
24.6k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
24.6k
    {
85
24.6k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 24.6k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
24.6k
    }
88
89
24.6k
    return EVMC_SUCCESS;
90
24.6k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)139>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
16.6k
{
47
16.6k
    static_assert(
48
16.6k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
16.6k
        "undefined instructions must not be handled by check_requirements()");
50
51
16.6k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
16.6k
    {
70
16.6k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
16.6k
            "unexpected instruction with multiple results");
72
16.6k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 16.6k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
16.6k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
16.6k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
16.6k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
16.6k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 36, False: 16.6k]
+
80
36
            return EVMC_STACK_UNDERFLOW;
81
16.6k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
16.6k
    {
85
16.6k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 16.6k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
16.6k
    }
88
89
16.6k
    return EVMC_SUCCESS;
90
16.6k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)140>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
30.2k
{
47
30.2k
    static_assert(
48
30.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
30.2k
        "undefined instructions must not be handled by check_requirements()");
50
51
30.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
30.2k
    {
70
30.2k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
30.2k
            "unexpected instruction with multiple results");
72
30.2k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 30.1k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
30.2k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
30.2k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
30.2k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
30.2k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 30.1k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
30.2k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
30.2k
    {
85
30.2k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 30.1k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
30.2k
    }
88
89
30.1k
    return EVMC_SUCCESS;
90
30.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)141>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
15.1k
{
47
15.1k
    static_assert(
48
15.1k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
15.1k
        "undefined instructions must not be handled by check_requirements()");
50
51
15.1k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
15.1k
    {
70
15.1k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
15.1k
            "unexpected instruction with multiple results");
72
15.1k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 15.0k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
15.1k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
15.1k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
15.1k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
15.1k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 30, False: 15.0k]
+
80
30
            return EVMC_STACK_UNDERFLOW;
81
15.1k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
15.1k
    {
85
15.1k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 15.0k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
15.1k
    }
88
89
15.0k
    return EVMC_SUCCESS;
90
15.1k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)142>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
25.1k
{
47
25.1k
    static_assert(
48
25.1k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
25.1k
        "undefined instructions must not be handled by check_requirements()");
50
51
25.1k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
25.1k
    {
70
25.1k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
25.1k
            "unexpected instruction with multiple results");
72
25.1k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 25.0k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
25.1k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
25.1k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
25.1k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
25.1k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 36, False: 25.0k]
+
80
36
            return EVMC_STACK_UNDERFLOW;
81
25.1k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
25.1k
    {
85
25.1k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 25.1k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
25.1k
    }
88
89
25.1k
    return EVMC_SUCCESS;
90
25.1k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)143>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
17.3k
{
47
17.3k
    static_assert(
48
17.3k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
17.3k
        "undefined instructions must not be handled by check_requirements()");
50
51
17.3k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
17.3k
    {
70
17.3k
        static_assert(instr::traits[Op].stack_height_change == 1,
71
17.3k
            "unexpected instruction with multiple results");
72
17.3k
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
  Branch (72:13): [True: 32, False: 17.3k]
+
73
32
            return EVMC_STACK_OVERFLOW;
74
17.3k
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
17.3k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
17.3k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
17.3k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 36, False: 17.3k]
+
80
36
            return EVMC_STACK_UNDERFLOW;
81
17.3k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
17.3k
    {
85
17.3k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 17.3k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
17.3k
    }
88
89
17.3k
    return EVMC_SUCCESS;
90
17.3k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)144>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
717k
{
47
717k
    static_assert(
48
717k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
717k
        "undefined instructions must not be handled by check_requirements()");
50
51
717k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
717k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
717k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
717k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 44, False: 717k]
+
80
44
            return EVMC_STACK_UNDERFLOW;
81
717k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
717k
    {
85
717k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 717k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
717k
    }
88
89
717k
    return EVMC_SUCCESS;
90
717k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)145>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
395k
{
47
395k
    static_assert(
48
395k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
395k
        "undefined instructions must not be handled by check_requirements()");
50
51
395k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
395k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
395k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
395k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 44, False: 395k]
+
80
44
            return EVMC_STACK_UNDERFLOW;
81
395k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
395k
    {
85
395k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 395k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
395k
    }
88
89
395k
    return EVMC_SUCCESS;
90
395k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)146>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
268k
{
47
268k
    static_assert(
48
268k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
268k
        "undefined instructions must not be handled by check_requirements()");
50
51
268k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
268k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
268k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
268k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 50, False: 268k]
+
80
50
            return EVMC_STACK_UNDERFLOW;
81
268k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
268k
    {
85
268k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 268k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
268k
    }
88
89
268k
    return EVMC_SUCCESS;
90
268k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)147>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
84.9k
{
47
84.9k
    static_assert(
48
84.9k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
84.9k
        "undefined instructions must not be handled by check_requirements()");
50
51
84.9k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
84.9k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
84.9k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
84.9k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 50, False: 84.9k]
+
80
50
            return EVMC_STACK_UNDERFLOW;
81
84.9k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
84.9k
    {
85
84.9k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 84.9k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
84.9k
    }
88
89
84.9k
    return EVMC_SUCCESS;
90
84.9k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)148>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
35.8k
{
47
35.8k
    static_assert(
48
35.8k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
35.8k
        "undefined instructions must not be handled by check_requirements()");
50
51
35.8k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
35.8k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
35.8k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
35.8k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 50, False: 35.8k]
+
80
50
            return EVMC_STACK_UNDERFLOW;
81
35.8k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
35.8k
    {
85
35.8k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 35.8k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
35.8k
    }
88
89
35.8k
    return EVMC_SUCCESS;
90
35.8k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)149>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
8.19k
{
47
8.19k
    static_assert(
48
8.19k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
8.19k
        "undefined instructions must not be handled by check_requirements()");
50
51
8.19k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
8.19k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
8.19k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
8.19k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 50, False: 8.14k]
+
80
50
            return EVMC_STACK_UNDERFLOW;
81
8.19k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
8.19k
    {
85
8.19k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 8.18k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
8.19k
    }
88
89
8.18k
    return EVMC_SUCCESS;
90
8.19k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)150>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
3.96k
{
47
3.96k
    static_assert(
48
3.96k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
3.96k
        "undefined instructions must not be handled by check_requirements()");
50
51
3.96k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
3.96k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
3.96k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
3.96k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 56, False: 3.90k]
+
80
56
            return EVMC_STACK_UNDERFLOW;
81
3.96k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
3.96k
    {
85
3.96k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 3.95k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
3.96k
    }
88
89
3.95k
    return EVMC_SUCCESS;
90
3.96k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)151>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
7.87k
{
47
7.87k
    static_assert(
48
7.87k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
7.87k
        "undefined instructions must not be handled by check_requirements()");
50
51
7.87k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
7.87k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
7.87k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
7.87k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 50, False: 7.82k]
+
80
50
            return EVMC_STACK_UNDERFLOW;
81
7.87k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
7.87k
    {
85
7.87k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 7.86k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
7.87k
    }
88
89
7.86k
    return EVMC_SUCCESS;
90
7.87k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)152>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
6.00k
{
47
6.00k
    static_assert(
48
6.00k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
6.00k
        "undefined instructions must not be handled by check_requirements()");
50
51
6.00k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
6.00k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
6.00k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
6.00k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 50, False: 5.95k]
+
80
50
            return EVMC_STACK_UNDERFLOW;
81
6.00k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
6.00k
    {
85
6.00k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 5.99k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
6.00k
    }
88
89
5.99k
    return EVMC_SUCCESS;
90
6.00k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)153>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
2.39k
{
47
2.39k
    static_assert(
48
2.39k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
2.39k
        "undefined instructions must not be handled by check_requirements()");
50
51
2.39k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
2.39k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
2.39k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
2.39k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 50, False: 2.34k]
+
80
50
            return EVMC_STACK_UNDERFLOW;
81
2.39k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
2.39k
    {
85
2.39k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 2.37k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
2.39k
    }
88
89
2.37k
    return EVMC_SUCCESS;
90
2.39k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)154>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
2.82k
{
47
2.82k
    static_assert(
48
2.82k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
2.82k
        "undefined instructions must not be handled by check_requirements()");
50
51
2.82k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
2.82k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
2.82k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
2.82k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 50, False: 2.77k]
+
80
50
            return EVMC_STACK_UNDERFLOW;
81
2.82k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
2.82k
    {
85
2.82k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 2.80k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
2.82k
    }
88
89
2.80k
    return EVMC_SUCCESS;
90
2.82k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)155>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
6.87k
{
47
6.87k
    static_assert(
48
6.87k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
6.87k
        "undefined instructions must not be handled by check_requirements()");
50
51
6.87k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
6.87k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
6.87k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
6.87k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 50, False: 6.82k]
+
80
50
            return EVMC_STACK_UNDERFLOW;
81
6.87k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
6.87k
    {
85
6.87k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 6.86k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
6.87k
    }
88
89
6.86k
    return EVMC_SUCCESS;
90
6.87k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)156>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
4.33k
{
47
4.33k
    static_assert(
48
4.33k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
4.33k
        "undefined instructions must not be handled by check_requirements()");
50
51
4.33k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
4.33k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
4.33k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
4.33k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 44, False: 4.28k]
+
80
44
            return EVMC_STACK_UNDERFLOW;
81
4.33k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
4.33k
    {
85
4.33k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 18, False: 4.31k]
+
86
18
            return EVMC_OUT_OF_GAS;
87
4.33k
    }
88
89
4.31k
    return EVMC_SUCCESS;
90
4.33k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)157>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
3.65k
{
47
3.65k
    static_assert(
48
3.65k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
3.65k
        "undefined instructions must not be handled by check_requirements()");
50
51
3.65k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
3.65k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
3.65k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
3.65k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 50, False: 3.60k]
+
80
50
            return EVMC_STACK_UNDERFLOW;
81
3.65k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
3.65k
    {
85
3.65k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 3.64k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
3.65k
    }
88
89
3.64k
    return EVMC_SUCCESS;
90
3.65k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)158>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
2.49k
{
47
2.49k
    static_assert(
48
2.49k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
2.49k
        "undefined instructions must not be handled by check_requirements()");
50
51
2.49k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
2.49k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
2.49k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
2.49k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 44, False: 2.45k]
+
80
44
            return EVMC_STACK_UNDERFLOW;
81
2.49k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
2.49k
    {
85
2.49k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 2.48k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
2.49k
    }
88
89
2.48k
    return EVMC_SUCCESS;
90
2.49k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)159>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
2.50k
{
47
2.50k
    static_assert(
48
2.50k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
2.50k
        "undefined instructions must not be handled by check_requirements()");
50
51
2.50k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
2.50k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
2.50k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
2.50k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 44, False: 2.45k]
+
80
44
            return EVMC_STACK_UNDERFLOW;
81
2.50k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
2.50k
    {
85
2.50k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 14, False: 2.48k]
+
86
14
            return EVMC_OUT_OF_GAS;
87
2.50k
    }
88
89
2.48k
    return EVMC_SUCCESS;
90
2.50k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)160>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
9.77k
{
47
9.77k
    static_assert(
48
9.77k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
9.77k
        "undefined instructions must not be handled by check_requirements()");
50
51
9.77k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
9.77k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
9.77k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
9.77k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 9.75k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
9.77k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
9.77k
    {
85
9.77k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 32, False: 9.73k]
+
86
32
            return EVMC_OUT_OF_GAS;
87
9.77k
    }
88
89
9.73k
    return EVMC_SUCCESS;
90
9.77k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)161>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
8.50k
{
47
8.50k
    static_assert(
48
8.50k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
8.50k
        "undefined instructions must not be handled by check_requirements()");
50
51
8.50k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
8.50k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
8.50k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
8.50k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 8.48k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
8.50k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
8.50k
    {
85
8.50k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 28, False: 8.47k]
+
86
28
            return EVMC_OUT_OF_GAS;
87
8.50k
    }
88
89
8.47k
    return EVMC_SUCCESS;
90
8.50k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)162>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
4.97k
{
47
4.97k
    static_assert(
48
4.97k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
4.97k
        "undefined instructions must not be handled by check_requirements()");
50
51
4.97k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
4.97k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
4.97k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
4.97k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 30, False: 4.94k]
+
80
30
            return EVMC_STACK_UNDERFLOW;
81
4.97k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
4.97k
    {
85
4.97k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 28, False: 4.95k]
+
86
28
            return EVMC_OUT_OF_GAS;
87
4.97k
    }
88
89
4.95k
    return EVMC_SUCCESS;
90
4.97k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)163>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
7.15k
{
47
7.15k
    static_assert(
48
7.15k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
7.15k
        "undefined instructions must not be handled by check_requirements()");
50
51
7.15k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
7.15k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
7.15k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
7.15k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 7.13k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
7.15k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
7.15k
    {
85
7.15k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 28, False: 7.12k]
+
86
28
            return EVMC_OUT_OF_GAS;
87
7.15k
    }
88
89
7.12k
    return EVMC_SUCCESS;
90
7.15k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)164>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
1.13k
{
47
1.13k
    static_assert(
48
1.13k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
1.13k
        "undefined instructions must not be handled by check_requirements()");
50
51
1.13k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
1.13k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
1.13k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
1.13k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 36, False: 1.10k]
+
80
36
            return EVMC_STACK_UNDERFLOW;
81
1.13k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
1.13k
    {
85
1.13k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 28, False: 1.10k]
+
86
28
            return EVMC_OUT_OF_GAS;
87
1.13k
    }
88
89
1.10k
    return EVMC_SUCCESS;
90
1.13k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)240>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
25.5k
{
47
25.5k
    static_assert(
48
25.5k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
25.5k
        "undefined instructions must not be handled by check_requirements()");
50
51
25.5k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
25.5k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
25.5k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
25.5k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 25.5k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
25.5k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
25.5k
    {
85
25.5k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 2.31k, False: 23.2k]
+
86
2.31k
            return EVMC_OUT_OF_GAS;
87
25.5k
    }
88
89
23.2k
    return EVMC_SUCCESS;
90
25.5k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)241>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
814k
{
47
814k
    static_assert(
48
814k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
814k
        "undefined instructions must not be handled by check_requirements()");
50
51
814k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
814k
    {
54
814k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
814k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
814k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
814k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
814k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 24, False: 814k]
+
80
24
            return EVMC_STACK_UNDERFLOW;
81
814k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
814k
    {
85
814k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 84, False: 814k]
+
86
84
            return EVMC_OUT_OF_GAS;
87
814k
    }
88
89
814k
    return EVMC_SUCCESS;
90
814k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)242>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
77.7k
{
47
77.7k
    static_assert(
48
77.7k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
77.7k
        "undefined instructions must not be handled by check_requirements()");
50
51
77.7k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
77.7k
    {
54
77.7k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
77.7k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
77.7k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
77.7k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
77.7k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 42, False: 77.6k]
+
80
42
            return EVMC_STACK_UNDERFLOW;
81
77.7k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
77.7k
    {
85
77.7k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 100, False: 77.6k]
+
86
100
            return EVMC_OUT_OF_GAS;
87
77.7k
    }
88
89
77.6k
    return EVMC_SUCCESS;
90
77.7k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)243>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
527k
{
47
527k
    static_assert(
48
527k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
527k
        "undefined instructions must not be handled by check_requirements()");
50
51
527k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
527k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
527k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
527k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 18, False: 527k]
+
80
18
            return EVMC_STACK_UNDERFLOW;
81
527k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
    {
85
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
86
            return EVMC_OUT_OF_GAS;
87
    }
88
89
527k
    return EVMC_SUCCESS;
90
527k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)244>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
73.2k
{
47
73.2k
    static_assert(
48
73.2k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
73.2k
        "undefined instructions must not be handled by check_requirements()");
50
51
73.2k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
73.2k
    {
54
73.2k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
73.2k
        {
61
73.2k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 19, False: 73.2k]
+
62
19
                return EVMC_UNDEFINED_INSTRUCTION;
63
73.2k
        }
64
73.2k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
73.2k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
73.2k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
73.2k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 30, False: 73.2k]
+
80
30
            return EVMC_STACK_UNDERFLOW;
81
73.2k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
73.2k
    {
85
73.2k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 90, False: 73.1k]
+
86
90
            return EVMC_OUT_OF_GAS;
87
73.2k
    }
88
89
73.1k
    return EVMC_SUCCESS;
90
73.2k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)245>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
15.6k
{
47
15.6k
    static_assert(
48
15.6k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
15.6k
        "undefined instructions must not be handled by check_requirements()");
50
51
15.6k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
15.6k
    {
54
15.6k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
15.6k
        {
61
15.6k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 83, False: 15.5k]
+
62
83
                return EVMC_UNDEFINED_INSTRUCTION;
63
15.6k
        }
64
15.6k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
15.6k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
15.6k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
15.6k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 12, False: 15.6k]
+
80
12
            return EVMC_STACK_UNDERFLOW;
81
15.6k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
15.6k
    {
85
15.6k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 1.97k, False: 13.6k]
+
86
1.97k
            return EVMC_OUT_OF_GAS;
87
15.6k
    }
88
89
13.6k
    return EVMC_SUCCESS;
90
15.6k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)250>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
2.99M
{
47
2.99M
    static_assert(
48
2.99M
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
2.99M
        "undefined instructions must not be handled by check_requirements()");
50
51
2.99M
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
2.99M
    {
54
2.99M
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
2.99M
        {
61
2.99M
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 45, False: 2.99M]
+
62
45
                return EVMC_UNDEFINED_INSTRUCTION;
63
2.99M
        }
64
2.99M
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
2.99M
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
2.99M
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
2.99M
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 12, False: 2.99M]
+
80
12
            return EVMC_STACK_UNDERFLOW;
81
2.99M
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
2.99M
    {
85
2.99M
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 122, False: 2.99M]
+
86
122
            return EVMC_OUT_OF_GAS;
87
2.99M
    }
88
89
2.99M
    return EVMC_SUCCESS;
90
2.99M
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)253>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
25.4k
{
47
25.4k
    static_assert(
48
25.4k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
25.4k
        "undefined instructions must not be handled by check_requirements()");
50
51
25.4k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
25.4k
    {
54
25.4k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
25.4k
        {
61
25.4k
            if (INTX_UNLIKELY(gas_cost < 0))
  Branch (61:17): [True: 45, False: 25.4k]
+
62
45
                return EVMC_UNDEFINED_INSTRUCTION;
63
25.4k
        }
64
25.4k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
25.4k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
25.4k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
25.4k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 50, False: 25.4k]
+
80
50
            return EVMC_STACK_UNDERFLOW;
81
25.4k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
25.4k
    {
85
25.4k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 0, False: 25.4k]
+
86
0
            return EVMC_OUT_OF_GAS;
87
25.4k
    }
88
89
25.4k
    return EVMC_SUCCESS;
90
25.4k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)254>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
2.03k
{
47
2.03k
    static_assert(
48
2.03k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
2.03k
        "undefined instructions must not be handled by check_requirements()");
50
51
2.03k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
    {
54
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
80
            return EVMC_STACK_UNDERFLOW;
81
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
    {
85
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
86
            return EVMC_OUT_OF_GAS;
87
    }
88
89
2.03k
    return EVMC_SUCCESS;
90
2.03k
}
baseline_execution.cpp:evmc_status_code evmone::baseline::(anonymous namespace)::check_requirements<(evmone::Opcode)255>(std::array<short, 256ul> const&, long&, intx::uint<256u> const*, intx::uint<256u> const*)
Line
Count
Source
46
421k
{
47
421k
    static_assert(
48
421k
        !instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] != instr::undefined,
49
421k
        "undefined instructions must not be handled by check_requirements()");
50
51
421k
    auto gas_cost = instr::gas_costs[EVMC_FRONTIER][Op];  // Init assuming const cost.
52
    if constexpr (!instr::has_const_gas_cost(Op))
53
421k
    {
54
421k
        gas_cost = cost_table[Op];  // If not, load the cost from the current revision cost table.
55
56
        // Negative cost marks an undefined instruction.
57
        // This check must be the first to produce the correct error code.
58
        // By definition not possible if defined since the first revision.
59
        if constexpr (instr::traits[Op].since != EVMC_FRONTIER)
60
        {
61
            if (INTX_UNLIKELY(gas_cost < 0))
62
                return EVMC_UNDEFINED_INSTRUCTION;
63
        }
64
421k
    }
65
66
    // Check stack requirements first. This order is not required,
67
    // but it is nicer because a complete gas check may need to inspect operands.
68
    if constexpr (instr::traits[Op].stack_height_change > 0)
69
    {
70
        static_assert(instr::traits[Op].stack_height_change == 1,
71
            "unexpected instruction with multiple results");
72
        if (INTX_UNLIKELY(stack_top == stack_bottom + StackSpace::limit))
73
            return EVMC_STACK_OVERFLOW;
74
    }
75
    if constexpr (instr::traits[Op].stack_height_required > 0)
76
421k
    {
77
        // Check stack underflow using pointer comparison <= (better optimization).
78
421k
        static constexpr auto min_offset = instr::traits[Op].stack_height_required - 1;
79
421k
        if (INTX_UNLIKELY(stack_top <= stack_bottom + min_offset))
  Branch (79:13): [True: 12, False: 421k]
+
80
12
            return EVMC_STACK_UNDERFLOW;
81
421k
    }
82
83
    if constexpr (!instr::has_const_gas_cost(Op) || instr::gas_costs[EVMC_FRONTIER][Op] > 0)
84
421k
    {
85
421k
        if (INTX_UNLIKELY((gas_left -= gas_cost) < 0))
  Branch (85:13): [True: 413k, False: 8.01k]
+
86
413k
            return EVMC_OUT_OF_GAS;
87
421k
    }
88
89
8.01k
    return EVMC_SUCCESS;
90
421k
}
91
92
93
/// The execution position.
94
struct Position
95
{
96
    code_iterator code_it;  ///< The position in the code.
97
    uint256* stack_end;     ///< The pointer to the stack end.
98
};
99
100
/// Helpers for invoking instruction implementations of different signatures.
101
/// @{
102
[[release_inline]] inline code_iterator invoke(void (*instr_fn)(StackTop) noexcept, Position pos,
103
    int64_t& /*gas*/, ExecutionState& /*state*/) noexcept
104
72.9M
{
105
72.9M
    instr_fn(pos.stack_end);
106
72.9M
    return pos.code_it + 1;
107
72.9M
}
108
109
[[release_inline]] inline code_iterator invoke(
110
    Result (*instr_fn)(StackTop, int64_t, ExecutionState&) noexcept, Position pos, int64_t& gas,
111
    ExecutionState& state) noexcept
112
56.9M
{
113
56.9M
    const auto o = instr_fn(pos.stack_end, gas, state);
114
56.9M
    gas = o.gas_left;
115
56.9M
    if (o.status != EVMC_SUCCESS)
  Branch (115:9): [True: 297k, False: 56.6M]
+
116
297k
    {
117
297k
        state.status = o.status;
118
297k
        return nullptr;
119
297k
    }
120
56.6M
    return pos.code_it + 1;
121
56.9M
}
122
123
[[release_inline]] inline code_iterator invoke(void (*instr_fn)(StackTop, ExecutionState&) noexcept,
124
    Position pos, int64_t& /*gas*/, ExecutionState& state) noexcept
125
4.77M
{
126
4.77M
    instr_fn(pos.stack_end, state);
127
4.77M
    return pos.code_it + 1;
128
4.77M
}
129
130
[[release_inline]] inline code_iterator invoke(
131
    code_iterator (*instr_fn)(StackTop, ExecutionState&, code_iterator) noexcept, Position pos,
132
    int64_t& /*gas*/, ExecutionState& state) noexcept
133
112M
{
134
112M
    return instr_fn(pos.stack_end, state, pos.code_it);
135
112M
}
136
137
[[release_inline]] inline code_iterator invoke(
138
    TermResult (*instr_fn)(StackTop, int64_t, ExecutionState&) noexcept, Position pos, int64_t& gas,
139
    ExecutionState& state) noexcept
140
1.85M
{
141
1.85M
    const auto result = instr_fn(pos.stack_end, gas, state);
142
1.85M
    gas = result.gas_left;
143
1.85M
    state.status = result.status;
144
1.85M
    return nullptr;
145
1.85M
}
146
147
/// A helper to invoke the instruction implementation of the given opcode Op.
148
template <Opcode Op>
149
[[release_inline]] inline Position invoke(const CostTable& cost_table, const uint256* stack_bottom,
150
    Position pos, int64_t& gas, ExecutionState& state) noexcept
151
249M
{
152
249M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
249M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 0, False: 1.29M]
+  Branch (153:9): [True: 382, False: 15.7M]
+
  Branch (153:9): [True: 50, False: 240k]
+
  Branch (153:9): [True: 32, False: 3.29M]
+
  Branch (153:9): [True: 38, False: 42.6k]
+
  Branch (153:9): [True: 38, False: 4.09k]
+
  Branch (153:9): [True: 32, False: 158k]
+
  Branch (153:9): [True: 32, False: 3.64k]
+
  Branch (153:9): [True: 32, False: 2.12k]
+
  Branch (153:9): [True: 32, False: 2.40k]
+
  Branch (153:9): [True: 80, False: 37.4k]
+
  Branch (153:9): [True: 38, False: 2.65k]
+
  Branch (153:9): [True: 48, False: 2.90M]
+
  Branch (153:9): [True: 32, False: 404k]
+
  Branch (153:9): [True: 32, False: 6.63k]
+
  Branch (153:9): [True: 32, False: 6.27k]
+
  Branch (153:9): [True: 38, False: 818k]
+
  Branch (153:9): [True: 40, False: 5.27M]
+
  Branch (153:9): [True: 32, False: 125k]
+
  Branch (153:9): [True: 32, False: 51.1k]
+
  Branch (153:9): [True: 32, False: 1.74k]
+
  Branch (153:9): [True: 38, False: 67.8k]
+
  Branch (153:9): [True: 32, False: 75.5k]
+
  Branch (153:9): [True: 111, False: 3.46M]
+
  Branch (153:9): [True: 109, False: 19.3k]
+
  Branch (153:9): [True: 109, False: 9.08k]
+
  Branch (153:9): [True: 521, False: 2.82k]
+
  Branch (153:9): [True: 44, False: 15.8k]
+
  Branch (153:9): [True: 46, False: 46.9k]
+
  Branch (153:9): [True: 38, False: 13.1k]
+
  Branch (153:9): [True: 46, False: 23.7k]
+
  Branch (153:9): [True: 52, False: 276k]
+
  Branch (153:9): [True: 46, False: 24.7k]
+
  Branch (153:9): [True: 38, False: 1.79M]
+
  Branch (153:9): [True: 46, False: 185k]
+
  Branch (153:9): [True: 64, False: 127k]
+
  Branch (153:9): [True: 46, False: 22.0k]
+
  Branch (153:9): [True: 38, False: 11.3k]
+
  Branch (153:9): [True: 46, False: 13.5k]
+
  Branch (153:9): [True: 440, False: 471k]
+
  Branch (153:9): [True: 56, False: 13.3k]
+
  Branch (153:9): [True: 116, False: 61.0k]
+
  Branch (153:9): [True: 100, False: 9.78k]
+
  Branch (153:9): [True: 180, False: 3.42k]
+
  Branch (153:9): [True: 32, False: 69.9k]
+
  Branch (153:9): [True: 46, False: 15.0k]
+
  Branch (153:9): [True: 46, False: 151k]
+
  Branch (153:9): [True: 46, False: 135k]
+
  Branch (153:9): [True: 46, False: 13.9k]
+
  Branch (153:9): [True: 46, False: 15.3k]
+
  Branch (153:9): [True: 352, False: 472]
+
  Branch (153:9): [True: 352, False: 1.61k]
+
  Branch (153:9): [True: 514, False: 564]
+
  Branch (153:9): [True: 754, False: 2.87k]
+
  Branch (153:9): [True: 770, False: 12.8k]
+
  Branch (153:9): [True: 142, False: 4.49M]
+
  Branch (153:9): [True: 38, False: 12.2M]
+
  Branch (153:9): [True: 82, False: 8.64M]
+
  Branch (153:9): [True: 32, False: 158k]
+
  Branch (153:9): [True: 36, False: 943k]
+
  Branch (153:9): [True: 18, False: 4.58M]
+
  Branch (153:9): [True: 78, False: 5.50M]
+
  Branch (153:9): [True: 20, False: 7.06M]
+
  Branch (153:9): [True: 102, False: 5.68M]
+
  Branch (153:9): [True: 46, False: 16.7k]
+
  Branch (153:9): [True: 56, False: 16.5M]
+
  Branch (153:9): [True: 56, False: 24.0M]
+
  Branch (153:9): [True: 772, False: 1.88M]
+
  Branch (153:9): [True: 826, False: 9.07M]
+
  Branch (153:9): [True: 808, False: 1.22k]
+
  Branch (153:9): [True: 736, False: 1.18M]
+
  Branch (153:9): [True: 3.77k, False: 79.7M]
+
  Branch (153:9): [True: 186, False: 9.93M]
+
  Branch (153:9): [True: 78, False: 1.31M]
+
  Branch (153:9): [True: 72, False: 120k]
+
  Branch (153:9): [True: 72, False: 49.6k]
+
  Branch (153:9): [True: 72, False: 49.8k]
+
  Branch (153:9): [True: 72, False: 46.7k]
+
  Branch (153:9): [True: 76, False: 47.2k]
+
  Branch (153:9): [True: 72, False: 41.9k]
+
  Branch (153:9): [True: 72, False: 30.9k]
+
  Branch (153:9): [True: 72, False: 28.9k]
+
  Branch (153:9): [True: 72, False: 40.5k]
+
  Branch (153:9): [True: 72, False: 38.8k]
+
  Branch (153:9): [True: 72, False: 34.1k]
+
  Branch (153:9): [True: 72, False: 29.1k]
+
  Branch (153:9): [True: 72, False: 48.7k]
+
  Branch (153:9): [True: 72, False: 21.3k]
+
  Branch (153:9): [True: 72, False: 66.3k]
+
  Branch (153:9): [True: 72, False: 31.7k]
+
  Branch (153:9): [True: 94, False: 2.10M]
+
  Branch (153:9): [True: 72, False: 45.1k]
+
  Branch (153:9): [True: 72, False: 37.4k]
+
  Branch (153:9): [True: 72, False: 38.4k]
+
  Branch (153:9): [True: 72, False: 31.9k]
+
  Branch (153:9): [True: 72, False: 30.2k]
+
  Branch (153:9): [True: 72, False: 41.0k]
+
  Branch (153:9): [True: 72, False: 42.1k]
+
  Branch (153:9): [True: 72, False: 28.8k]
+
  Branch (153:9): [True: 76, False: 34.4k]
+
  Branch (153:9): [True: 72, False: 25.0k]
+
  Branch (153:9): [True: 72, False: 92.0k]
+
  Branch (153:9): [True: 72, False: 312k]
+
  Branch (153:9): [True: 64, False: 5.86M]
+
  Branch (153:9): [True: 70, False: 1.23M]
+
  Branch (153:9): [True: 64, False: 619k]
+
  Branch (153:9): [True: 70, False: 282k]
+
  Branch (153:9): [True: 88, False: 123k]
+
  Branch (153:9): [True: 64, False: 63.3k]
+
  Branch (153:9): [True: 70, False: 52.4k]
+
  Branch (153:9): [True: 70, False: 443k]
+
  Branch (153:9): [True: 82, False: 26.6k]
+
  Branch (153:9): [True: 74, False: 52.5k]
+
  Branch (153:9): [True: 70, False: 24.6k]
+
  Branch (153:9): [True: 82, False: 16.5k]
+
  Branch (153:9): [True: 64, False: 30.1k]
+
  Branch (153:9): [True: 76, False: 15.0k]
+
  Branch (153:9): [True: 82, False: 25.0k]
+
  Branch (153:9): [True: 82, False: 17.2k]
+
  Branch (153:9): [True: 58, False: 717k]
+
  Branch (153:9): [True: 58, False: 395k]
+
  Branch (153:9): [True: 64, False: 268k]
+
  Branch (153:9): [True: 64, False: 84.8k]
+
  Branch (153:9): [True: 64, False: 35.8k]
+
  Branch (153:9): [True: 64, False: 8.13k]
+
  Branch (153:9): [True: 70, False: 3.89k]
+
  Branch (153:9): [True: 64, False: 7.81k]
+
  Branch (153:9): [True: 64, False: 5.94k]
+
  Branch (153:9): [True: 64, False: 2.32k]
+
  Branch (153:9): [True: 64, False: 2.75k]
+
  Branch (153:9): [True: 64, False: 6.81k]
+
  Branch (153:9): [True: 62, False: 4.26k]
+
  Branch (153:9): [True: 64, False: 3.59k]
+
  Branch (153:9): [True: 58, False: 2.43k]
+
  Branch (153:9): [True: 58, False: 2.44k]
+
  Branch (153:9): [True: 50, False: 9.72k]
+
  Branch (153:9): [True: 46, False: 8.46k]
+
  Branch (153:9): [True: 58, False: 4.92k]
+
  Branch (153:9): [True: 46, False: 7.10k]
+
  Branch (153:9): [True: 64, False: 1.07k]
+
  Branch (153:9): [True: 2.33k, False: 23.1k]
+
  Branch (153:9): [True: 108, False: 814k]
+
  Branch (153:9): [True: 142, False: 77.5k]
+
  Branch (153:9): [True: 18, False: 527k]
+
  Branch (153:9): [True: 139, False: 73.1k]
+
  Branch (153:9): [True: 2.07k, False: 13.5k]
+
  Branch (153:9): [True: 179, False: 2.99M]
+
  Branch (153:9): [True: 95, False: 25.3k]
+
  Branch (153:9): [True: 0, False: 2.03k]
+  Branch (153:9): [True: 413k, False: 7.99k]
+
154
437k
    {
155
437k
        state.status = status;
156
437k
        return {nullptr, pos.stack_end};
157
437k
    }
158
249M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
249M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
249M
    return {new_pos, new_stack_top};
161
249M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)0>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
1.29M
{
152
1.29M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
1.29M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 0, False: 1.29M]
+
154
0
    {
155
0
        state.status = status;
156
0
        return {nullptr, pos.stack_end};
157
0
    }
158
1.29M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
1.29M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
1.29M
    return {new_pos, new_stack_top};
161
1.29M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)1>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
15.7M
{
152
15.7M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
15.7M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 382, False: 15.7M]
+
154
382
    {
155
382
        state.status = status;
156
382
        return {nullptr, pos.stack_end};
157
382
    }
158
15.7M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
15.7M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
15.7M
    return {new_pos, new_stack_top};
161
15.7M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)2>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
240k
{
152
240k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
240k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 50, False: 240k]
+
154
50
    {
155
50
        state.status = status;
156
50
        return {nullptr, pos.stack_end};
157
50
    }
158
240k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
240k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
240k
    return {new_pos, new_stack_top};
161
240k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)3>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
3.29M
{
152
3.29M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
3.29M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 3.29M]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
3.29M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
3.29M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
3.29M
    return {new_pos, new_stack_top};
161
3.29M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)4>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
42.6k
{
152
42.6k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
42.6k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 38, False: 42.6k]
+
154
38
    {
155
38
        state.status = status;
156
38
        return {nullptr, pos.stack_end};
157
38
    }
158
42.6k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
42.6k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
42.6k
    return {new_pos, new_stack_top};
161
42.6k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)5>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
4.13k
{
152
4.13k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
4.13k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 38, False: 4.09k]
+
154
38
    {
155
38
        state.status = status;
156
38
        return {nullptr, pos.stack_end};
157
38
    }
158
4.09k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
4.09k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
4.09k
    return {new_pos, new_stack_top};
161
4.13k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)6>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
158k
{
152
158k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
158k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 158k]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
158k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
158k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
158k
    return {new_pos, new_stack_top};
161
158k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)7>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
3.67k
{
152
3.67k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
3.67k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 3.64k]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
3.64k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
3.64k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
3.64k
    return {new_pos, new_stack_top};
161
3.67k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)8>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
2.15k
{
152
2.15k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
2.15k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 2.12k]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
2.12k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
2.12k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
2.12k
    return {new_pos, new_stack_top};
161
2.15k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)9>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
2.43k
{
152
2.43k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
2.43k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 2.40k]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
2.40k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
2.40k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
2.40k
    return {new_pos, new_stack_top};
161
2.43k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)10>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
37.5k
{
152
37.5k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
37.5k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 80, False: 37.4k]
+
154
80
    {
155
80
        state.status = status;
156
80
        return {nullptr, pos.stack_end};
157
80
    }
158
37.4k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
37.4k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
37.4k
    return {new_pos, new_stack_top};
161
37.5k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)11>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
2.68k
{
152
2.68k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
2.68k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 38, False: 2.65k]
+
154
38
    {
155
38
        state.status = status;
156
38
        return {nullptr, pos.stack_end};
157
38
    }
158
2.65k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
2.65k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
2.65k
    return {new_pos, new_stack_top};
161
2.68k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)16>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
2.90M
{
152
2.90M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
2.90M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 48, False: 2.90M]
+
154
48
    {
155
48
        state.status = status;
156
48
        return {nullptr, pos.stack_end};
157
48
    }
158
2.90M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
2.90M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
2.90M
    return {new_pos, new_stack_top};
161
2.90M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)17>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
404k
{
152
404k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
404k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 404k]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
404k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
404k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
404k
    return {new_pos, new_stack_top};
161
404k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)18>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
6.67k
{
152
6.67k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
6.67k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 6.63k]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
6.63k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
6.63k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
6.63k
    return {new_pos, new_stack_top};
161
6.67k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)19>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
6.31k
{
152
6.31k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
6.31k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 6.27k]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
6.27k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
6.27k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
6.27k
    return {new_pos, new_stack_top};
161
6.31k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)20>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
818k
{
152
818k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
818k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 38, False: 818k]
+
154
38
    {
155
38
        state.status = status;
156
38
        return {nullptr, pos.stack_end};
157
38
    }
158
818k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
818k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
818k
    return {new_pos, new_stack_top};
161
818k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)21>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
5.27M
{
152
5.27M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
5.27M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 40, False: 5.27M]
+
154
40
    {
155
40
        state.status = status;
156
40
        return {nullptr, pos.stack_end};
157
40
    }
158
5.27M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
5.27M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
5.27M
    return {new_pos, new_stack_top};
161
5.27M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)22>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
125k
{
152
125k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
125k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 125k]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
125k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
125k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
125k
    return {new_pos, new_stack_top};
161
125k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)23>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
51.1k
{
152
51.1k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
51.1k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 51.1k]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
51.1k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
51.1k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
51.1k
    return {new_pos, new_stack_top};
161
51.1k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)24>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
1.77k
{
152
1.77k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
1.77k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 1.74k]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
1.74k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
1.74k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
1.74k
    return {new_pos, new_stack_top};
161
1.77k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)25>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
67.8k
{
152
67.8k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
67.8k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 38, False: 67.8k]
+
154
38
    {
155
38
        state.status = status;
156
38
        return {nullptr, pos.stack_end};
157
38
    }
158
67.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
67.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
67.8k
    return {new_pos, new_stack_top};
161
67.8k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)26>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
75.5k
{
152
75.5k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
75.5k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 75.5k]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
75.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
75.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
75.5k
    return {new_pos, new_stack_top};
161
75.5k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)27>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
3.46M
{
152
3.46M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
3.46M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 111, False: 3.46M]
+
154
111
    {
155
111
        state.status = status;
156
111
        return {nullptr, pos.stack_end};
157
111
    }
158
3.46M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
3.46M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
3.46M
    return {new_pos, new_stack_top};
161
3.46M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)28>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
19.4k
{
152
19.4k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
19.4k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 109, False: 19.3k]
+
154
109
    {
155
109
        state.status = status;
156
109
        return {nullptr, pos.stack_end};
157
109
    }
158
19.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
19.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
19.3k
    return {new_pos, new_stack_top};
161
19.4k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)29>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
9.19k
{
152
9.19k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
9.19k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 109, False: 9.08k]
+
154
109
    {
155
109
        state.status = status;
156
109
        return {nullptr, pos.stack_end};
157
109
    }
158
9.08k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
9.08k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
9.08k
    return {new_pos, new_stack_top};
161
9.19k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)30>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
3.34k
{
152
3.34k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
3.34k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 521, False: 2.82k]
+
154
521
    {
155
521
        state.status = status;
156
521
        return {nullptr, pos.stack_end};
157
521
    }
158
2.82k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
2.82k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
2.82k
    return {new_pos, new_stack_top};
161
3.34k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)32>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
15.9k
{
152
15.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
15.9k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 44, False: 15.8k]
+
154
44
    {
155
44
        state.status = status;
156
44
        return {nullptr, pos.stack_end};
157
44
    }
158
15.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
15.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
15.8k
    return {new_pos, new_stack_top};
161
15.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)48>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
46.9k
{
152
46.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
46.9k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 46.9k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
46.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
46.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
46.9k
    return {new_pos, new_stack_top};
161
46.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)49>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
13.2k
{
152
13.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
13.2k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 38, False: 13.1k]
+
154
38
    {
155
38
        state.status = status;
156
38
        return {nullptr, pos.stack_end};
157
38
    }
158
13.1k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
13.1k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
13.1k
    return {new_pos, new_stack_top};
161
13.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)50>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
23.7k
{
152
23.7k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
23.7k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 23.7k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
23.7k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
23.7k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
23.7k
    return {new_pos, new_stack_top};
161
23.7k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)51>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
276k
{
152
276k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
276k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 52, False: 276k]
+
154
52
    {
155
52
        state.status = status;
156
52
        return {nullptr, pos.stack_end};
157
52
    }
158
276k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
276k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
276k
    return {new_pos, new_stack_top};
161
276k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)52>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
24.8k
{
152
24.8k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
24.8k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 24.7k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
24.7k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
24.7k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
24.7k
    return {new_pos, new_stack_top};
161
24.8k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)53>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
1.79M
{
152
1.79M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
1.79M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 38, False: 1.79M]
+
154
38
    {
155
38
        state.status = status;
156
38
        return {nullptr, pos.stack_end};
157
38
    }
158
1.79M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
1.79M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
1.79M
    return {new_pos, new_stack_top};
161
1.79M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)54>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
185k
{
152
185k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
185k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 185k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
185k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
185k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
185k
    return {new_pos, new_stack_top};
161
185k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)55>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
127k
{
152
127k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
127k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 127k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
127k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
127k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
127k
    return {new_pos, new_stack_top};
161
127k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)56>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
22.0k
{
152
22.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
22.0k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 22.0k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
22.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
22.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
22.0k
    return {new_pos, new_stack_top};
161
22.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)57>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
11.4k
{
152
11.4k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
11.4k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 38, False: 11.3k]
+
154
38
    {
155
38
        state.status = status;
156
38
        return {nullptr, pos.stack_end};
157
38
    }
158
11.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
11.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
11.3k
    return {new_pos, new_stack_top};
161
11.4k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)58>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
13.5k
{
152
13.5k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
13.5k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 13.5k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
13.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
13.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
13.5k
    return {new_pos, new_stack_top};
161
13.5k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)59>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
471k
{
152
471k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
471k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 440, False: 471k]
+
154
440
    {
155
440
        state.status = status;
156
440
        return {nullptr, pos.stack_end};
157
440
    }
158
471k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
471k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
471k
    return {new_pos, new_stack_top};
161
471k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)60>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
13.3k
{
152
13.3k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
13.3k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 56, False: 13.3k]
+
154
56
    {
155
56
        state.status = status;
156
56
        return {nullptr, pos.stack_end};
157
56
    }
158
13.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
13.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
13.3k
    return {new_pos, new_stack_top};
161
13.3k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)61>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
61.1k
{
152
61.1k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
61.1k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 116, False: 61.0k]
+
154
116
    {
155
116
        state.status = status;
156
116
        return {nullptr, pos.stack_end};
157
116
    }
158
61.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
61.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
61.0k
    return {new_pos, new_stack_top};
161
61.1k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)62>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
9.88k
{
152
9.88k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
9.88k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 100, False: 9.78k]
+
154
100
    {
155
100
        state.status = status;
156
100
        return {nullptr, pos.stack_end};
157
100
    }
158
9.78k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
9.78k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
9.78k
    return {new_pos, new_stack_top};
161
9.88k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)63>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
3.60k
{
152
3.60k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
3.60k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 180, False: 3.42k]
+
154
180
    {
155
180
        state.status = status;
156
180
        return {nullptr, pos.stack_end};
157
180
    }
158
3.42k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
3.42k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
3.42k
    return {new_pos, new_stack_top};
161
3.60k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)64>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
70.0k
{
152
70.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
70.0k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 69.9k]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
69.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
69.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
69.9k
    return {new_pos, new_stack_top};
161
70.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)65>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
15.0k
{
152
15.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
15.0k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 15.0k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
15.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
15.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
15.0k
    return {new_pos, new_stack_top};
161
15.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)66>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
151k
{
152
151k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
151k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 151k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
151k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
151k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
151k
    return {new_pos, new_stack_top};
161
151k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)67>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
135k
{
152
135k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
135k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 135k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
135k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
135k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
135k
    return {new_pos, new_stack_top};
161
135k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)68>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
13.9k
{
152
13.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
13.9k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 13.9k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
13.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
13.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
13.9k
    return {new_pos, new_stack_top};
161
13.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)69>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
15.3k
{
152
15.3k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
15.3k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 15.3k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
15.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
15.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
15.3k
    return {new_pos, new_stack_top};
161
15.3k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)70>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
824
{
152
824
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
824
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 352, False: 472]
+
154
352
    {
155
352
        state.status = status;
156
352
        return {nullptr, pos.stack_end};
157
352
    }
158
472
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
472
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
472
    return {new_pos, new_stack_top};
161
824
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)71>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
1.96k
{
152
1.96k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
1.96k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 352, False: 1.61k]
+
154
352
    {
155
352
        state.status = status;
156
352
        return {nullptr, pos.stack_end};
157
352
    }
158
1.61k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
1.61k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
1.61k
    return {new_pos, new_stack_top};
161
1.96k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)72>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
1.07k
{
152
1.07k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
1.07k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 514, False: 564]
+
154
514
    {
155
514
        state.status = status;
156
514
        return {nullptr, pos.stack_end};
157
514
    }
158
564
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
564
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
564
    return {new_pos, new_stack_top};
161
1.07k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)73>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
3.63k
{
152
3.63k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
3.63k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 754, False: 2.87k]
+
154
754
    {
155
754
        state.status = status;
156
754
        return {nullptr, pos.stack_end};
157
754
    }
158
2.87k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
2.87k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
2.87k
    return {new_pos, new_stack_top};
161
3.63k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)74>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
13.6k
{
152
13.6k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
13.6k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 770, False: 12.8k]
+
154
770
    {
155
770
        state.status = status;
156
770
        return {nullptr, pos.stack_end};
157
770
    }
158
12.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
12.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
12.8k
    return {new_pos, new_stack_top};
161
13.6k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)80>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
4.49M
{
152
4.49M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
4.49M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 142, False: 4.49M]
+
154
142
    {
155
142
        state.status = status;
156
142
        return {nullptr, pos.stack_end};
157
142
    }
158
4.49M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
4.49M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
4.49M
    return {new_pos, new_stack_top};
161
4.49M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)81>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
12.2M
{
152
12.2M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
12.2M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 38, False: 12.2M]
+
154
38
    {
155
38
        state.status = status;
156
38
        return {nullptr, pos.stack_end};
157
38
    }
158
12.2M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
12.2M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
12.2M
    return {new_pos, new_stack_top};
161
12.2M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)82>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
8.64M
{
152
8.64M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
8.64M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 82, False: 8.64M]
+
154
82
    {
155
82
        state.status = status;
156
82
        return {nullptr, pos.stack_end};
157
82
    }
158
8.64M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
8.64M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
8.64M
    return {new_pos, new_stack_top};
161
8.64M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)83>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
158k
{
152
158k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
158k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 32, False: 158k]
+
154
32
    {
155
32
        state.status = status;
156
32
        return {nullptr, pos.stack_end};
157
32
    }
158
158k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
158k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
158k
    return {new_pos, new_stack_top};
161
158k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)84>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
943k
{
152
943k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
943k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 36, False: 943k]
+
154
36
    {
155
36
        state.status = status;
156
36
        return {nullptr, pos.stack_end};
157
36
    }
158
943k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
943k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
943k
    return {new_pos, new_stack_top};
161
943k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)85>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
4.58M
{
152
4.58M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
4.58M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 18, False: 4.58M]
+
154
18
    {
155
18
        state.status = status;
156
18
        return {nullptr, pos.stack_end};
157
18
    }
158
4.58M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
4.58M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
4.58M
    return {new_pos, new_stack_top};
161
4.58M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)86>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
5.50M
{
152
5.50M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
5.50M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 78, False: 5.50M]
+
154
78
    {
155
78
        state.status = status;
156
78
        return {nullptr, pos.stack_end};
157
78
    }
158
5.50M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
5.50M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
5.50M
    return {new_pos, new_stack_top};
161
5.50M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)87>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
7.06M
{
152
7.06M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
7.06M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 20, False: 7.06M]
+
154
20
    {
155
20
        state.status = status;
156
20
        return {nullptr, pos.stack_end};
157
20
    }
158
7.06M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
7.06M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
7.06M
    return {new_pos, new_stack_top};
161
7.06M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)88>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
5.68M
{
152
5.68M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
5.68M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 102, False: 5.68M]
+
154
102
    {
155
102
        state.status = status;
156
102
        return {nullptr, pos.stack_end};
157
102
    }
158
5.68M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
5.68M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
5.68M
    return {new_pos, new_stack_top};
161
5.68M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)89>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
16.7k
{
152
16.7k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
16.7k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 16.7k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
16.7k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
16.7k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
16.7k
    return {new_pos, new_stack_top};
161
16.7k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)90>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
16.5M
{
152
16.5M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
16.5M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 56, False: 16.5M]
+
154
56
    {
155
56
        state.status = status;
156
56
        return {nullptr, pos.stack_end};
157
56
    }
158
16.5M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
16.5M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
16.5M
    return {new_pos, new_stack_top};
161
16.5M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)91>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
24.0M
{
152
24.0M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
24.0M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 56, False: 24.0M]
+
154
56
    {
155
56
        state.status = status;
156
56
        return {nullptr, pos.stack_end};
157
56
    }
158
24.0M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
24.0M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
24.0M
    return {new_pos, new_stack_top};
161
24.0M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)92>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
1.88M
{
152
1.88M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
1.88M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 772, False: 1.88M]
+
154
772
    {
155
772
        state.status = status;
156
772
        return {nullptr, pos.stack_end};
157
772
    }
158
1.88M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
1.88M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
1.88M
    return {new_pos, new_stack_top};
161
1.88M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)93>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
9.07M
{
152
9.07M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
9.07M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 826, False: 9.07M]
+
154
826
    {
155
826
        state.status = status;
156
826
        return {nullptr, pos.stack_end};
157
826
    }
158
9.07M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
9.07M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
9.07M
    return {new_pos, new_stack_top};
161
9.07M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)94>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
2.02k
{
152
2.02k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
2.02k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 808, False: 1.22k]
+
154
808
    {
155
808
        state.status = status;
156
808
        return {nullptr, pos.stack_end};
157
808
    }
158
1.22k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
1.22k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
1.22k
    return {new_pos, new_stack_top};
161
2.02k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)95>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
1.18M
{
152
1.18M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
1.18M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 736, False: 1.18M]
+
154
736
    {
155
736
        state.status = status;
156
736
        return {nullptr, pos.stack_end};
157
736
    }
158
1.18M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
1.18M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
1.18M
    return {new_pos, new_stack_top};
161
1.18M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)96>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
79.7M
{
152
79.7M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
79.7M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 3.77k, False: 79.7M]
+
154
3.77k
    {
155
3.77k
        state.status = status;
156
3.77k
        return {nullptr, pos.stack_end};
157
3.77k
    }
158
79.7M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
79.7M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
79.7M
    return {new_pos, new_stack_top};
161
79.7M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)97>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
9.93M
{
152
9.93M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
9.93M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 186, False: 9.93M]
+
154
186
    {
155
186
        state.status = status;
156
186
        return {nullptr, pos.stack_end};
157
186
    }
158
9.93M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
9.93M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
9.93M
    return {new_pos, new_stack_top};
161
9.93M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)98>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
1.31M
{
152
1.31M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
1.31M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 78, False: 1.31M]
+
154
78
    {
155
78
        state.status = status;
156
78
        return {nullptr, pos.stack_end};
157
78
    }
158
1.31M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
1.31M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
1.31M
    return {new_pos, new_stack_top};
161
1.31M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)99>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
120k
{
152
120k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
120k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 120k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
120k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
120k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
120k
    return {new_pos, new_stack_top};
161
120k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)100>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
49.7k
{
152
49.7k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
49.7k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 49.6k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
49.6k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
49.6k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
49.6k
    return {new_pos, new_stack_top};
161
49.7k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)101>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
49.9k
{
152
49.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
49.9k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 49.8k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
49.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
49.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
49.8k
    return {new_pos, new_stack_top};
161
49.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)102>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
46.7k
{
152
46.7k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
46.7k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 46.7k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
46.7k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
46.7k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
46.7k
    return {new_pos, new_stack_top};
161
46.7k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)103>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
47.2k
{
152
47.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
47.2k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 76, False: 47.2k]
+
154
76
    {
155
76
        state.status = status;
156
76
        return {nullptr, pos.stack_end};
157
76
    }
158
47.2k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
47.2k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
47.2k
    return {new_pos, new_stack_top};
161
47.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)104>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
42.0k
{
152
42.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
42.0k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 41.9k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
41.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
41.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
41.9k
    return {new_pos, new_stack_top};
161
42.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)105>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
31.0k
{
152
31.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
31.0k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 30.9k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
30.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
30.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
30.9k
    return {new_pos, new_stack_top};
161
31.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)106>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
29.0k
{
152
29.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
29.0k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 28.9k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
28.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
28.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
28.9k
    return {new_pos, new_stack_top};
161
29.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)107>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
40.6k
{
152
40.6k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
40.6k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 40.5k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
40.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
40.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
40.5k
    return {new_pos, new_stack_top};
161
40.6k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)108>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
38.9k
{
152
38.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
38.9k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 38.8k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
38.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
38.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
38.8k
    return {new_pos, new_stack_top};
161
38.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)109>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
34.2k
{
152
34.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
34.2k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 34.1k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
34.1k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
34.1k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
34.1k
    return {new_pos, new_stack_top};
161
34.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)110>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
29.2k
{
152
29.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
29.2k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 29.1k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
29.1k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
29.1k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
29.1k
    return {new_pos, new_stack_top};
161
29.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)111>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
48.8k
{
152
48.8k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
48.8k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 48.7k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
48.7k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
48.7k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
48.7k
    return {new_pos, new_stack_top};
161
48.8k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)112>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
21.4k
{
152
21.4k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
21.4k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 21.3k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
21.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
21.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
21.3k
    return {new_pos, new_stack_top};
161
21.4k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)113>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
66.3k
{
152
66.3k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
66.3k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 66.3k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
66.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
66.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
66.3k
    return {new_pos, new_stack_top};
161
66.3k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)114>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
31.8k
{
152
31.8k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
31.8k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 31.7k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
31.7k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
31.7k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
31.7k
    return {new_pos, new_stack_top};
161
31.8k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)115>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
2.10M
{
152
2.10M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
2.10M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 94, False: 2.10M]
+
154
94
    {
155
94
        state.status = status;
156
94
        return {nullptr, pos.stack_end};
157
94
    }
158
2.10M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
2.10M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
2.10M
    return {new_pos, new_stack_top};
161
2.10M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)116>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
45.1k
{
152
45.1k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
45.1k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 45.1k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
45.1k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
45.1k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
45.1k
    return {new_pos, new_stack_top};
161
45.1k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)117>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
37.5k
{
152
37.5k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
37.5k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 37.4k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
37.4k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
37.4k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
37.4k
    return {new_pos, new_stack_top};
161
37.5k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)118>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
38.4k
{
152
38.4k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
38.4k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 38.4k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
38.4k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
38.4k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
38.4k
    return {new_pos, new_stack_top};
161
38.4k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)119>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
31.9k
{
152
31.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
31.9k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 31.9k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
31.9k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
31.9k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
31.9k
    return {new_pos, new_stack_top};
161
31.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)120>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
30.3k
{
152
30.3k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
30.3k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 30.2k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
30.2k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
30.2k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
30.2k
    return {new_pos, new_stack_top};
161
30.3k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)121>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
41.1k
{
152
41.1k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
41.1k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 41.0k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
41.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
41.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
41.0k
    return {new_pos, new_stack_top};
161
41.1k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)122>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
42.2k
{
152
42.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
42.2k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 42.1k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
42.1k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
42.1k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
42.1k
    return {new_pos, new_stack_top};
161
42.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)123>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
28.8k
{
152
28.8k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
28.8k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 28.8k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
28.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
28.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
28.8k
    return {new_pos, new_stack_top};
161
28.8k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)124>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
34.5k
{
152
34.5k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
34.5k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 76, False: 34.4k]
+
154
76
    {
155
76
        state.status = status;
156
76
        return {nullptr, pos.stack_end};
157
76
    }
158
34.4k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
34.4k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
34.4k
    return {new_pos, new_stack_top};
161
34.5k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)125>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
25.1k
{
152
25.1k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
25.1k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 25.0k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
25.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
25.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
25.0k
    return {new_pos, new_stack_top};
161
25.1k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)126>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
92.0k
{
152
92.0k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
92.0k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 92.0k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
92.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
92.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
92.0k
    return {new_pos, new_stack_top};
161
92.0k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)127>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
312k
{
152
312k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
312k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 72, False: 312k]
+
154
72
    {
155
72
        state.status = status;
156
72
        return {nullptr, pos.stack_end};
157
72
    }
158
312k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
312k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
312k
    return {new_pos, new_stack_top};
161
312k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)128>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
5.86M
{
152
5.86M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
5.86M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 5.86M]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
5.86M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
5.86M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
5.86M
    return {new_pos, new_stack_top};
161
5.86M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)129>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
1.23M
{
152
1.23M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
1.23M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 70, False: 1.23M]
+
154
70
    {
155
70
        state.status = status;
156
70
        return {nullptr, pos.stack_end};
157
70
    }
158
1.23M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
1.23M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
1.23M
    return {new_pos, new_stack_top};
161
1.23M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)130>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
619k
{
152
619k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
619k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 619k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
619k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
619k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
619k
    return {new_pos, new_stack_top};
161
619k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)131>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
283k
{
152
283k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
283k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 70, False: 282k]
+
154
70
    {
155
70
        state.status = status;
156
70
        return {nullptr, pos.stack_end};
157
70
    }
158
282k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
282k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
282k
    return {new_pos, new_stack_top};
161
283k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)132>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
123k
{
152
123k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
123k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 88, False: 123k]
+
154
88
    {
155
88
        state.status = status;
156
88
        return {nullptr, pos.stack_end};
157
88
    }
158
123k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
123k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
123k
    return {new_pos, new_stack_top};
161
123k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)133>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
63.4k
{
152
63.4k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
63.4k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 63.3k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
63.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
63.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
63.3k
    return {new_pos, new_stack_top};
161
63.4k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)134>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
52.5k
{
152
52.5k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
52.5k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 70, False: 52.4k]
+
154
70
    {
155
70
        state.status = status;
156
70
        return {nullptr, pos.stack_end};
157
70
    }
158
52.4k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
52.4k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
52.4k
    return {new_pos, new_stack_top};
161
52.5k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)135>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
443k
{
152
443k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
443k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 70, False: 443k]
+
154
70
    {
155
70
        state.status = status;
156
70
        return {nullptr, pos.stack_end};
157
70
    }
158
443k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
443k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
443k
    return {new_pos, new_stack_top};
161
443k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)136>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
26.7k
{
152
26.7k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
26.7k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 82, False: 26.6k]
+
154
82
    {
155
82
        state.status = status;
156
82
        return {nullptr, pos.stack_end};
157
82
    }
158
26.6k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
26.6k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
26.6k
    return {new_pos, new_stack_top};
161
26.7k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)137>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
52.5k
{
152
52.5k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
52.5k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 74, False: 52.5k]
+
154
74
    {
155
74
        state.status = status;
156
74
        return {nullptr, pos.stack_end};
157
74
    }
158
52.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
52.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
52.5k
    return {new_pos, new_stack_top};
161
52.5k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)138>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
24.6k
{
152
24.6k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
24.6k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 70, False: 24.6k]
+
154
70
    {
155
70
        state.status = status;
156
70
        return {nullptr, pos.stack_end};
157
70
    }
158
24.6k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
24.6k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
24.6k
    return {new_pos, new_stack_top};
161
24.6k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)139>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
16.6k
{
152
16.6k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
16.6k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 82, False: 16.5k]
+
154
82
    {
155
82
        state.status = status;
156
82
        return {nullptr, pos.stack_end};
157
82
    }
158
16.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
16.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
16.5k
    return {new_pos, new_stack_top};
161
16.6k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)140>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
30.2k
{
152
30.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
30.2k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 30.1k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
30.1k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
30.1k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
30.1k
    return {new_pos, new_stack_top};
161
30.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)141>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
15.1k
{
152
15.1k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
15.1k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 76, False: 15.0k]
+
154
76
    {
155
76
        state.status = status;
156
76
        return {nullptr, pos.stack_end};
157
76
    }
158
15.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
15.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
15.0k
    return {new_pos, new_stack_top};
161
15.1k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)142>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
25.1k
{
152
25.1k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
25.1k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 82, False: 25.0k]
+
154
82
    {
155
82
        state.status = status;
156
82
        return {nullptr, pos.stack_end};
157
82
    }
158
25.0k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
25.0k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
25.0k
    return {new_pos, new_stack_top};
161
25.1k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)143>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
17.3k
{
152
17.3k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
17.3k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 82, False: 17.2k]
+
154
82
    {
155
82
        state.status = status;
156
82
        return {nullptr, pos.stack_end};
157
82
    }
158
17.2k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
17.2k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
17.2k
    return {new_pos, new_stack_top};
161
17.3k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)144>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
717k
{
152
717k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
717k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 58, False: 717k]
+
154
58
    {
155
58
        state.status = status;
156
58
        return {nullptr, pos.stack_end};
157
58
    }
158
717k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
717k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
717k
    return {new_pos, new_stack_top};
161
717k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)145>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
395k
{
152
395k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
395k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 58, False: 395k]
+
154
58
    {
155
58
        state.status = status;
156
58
        return {nullptr, pos.stack_end};
157
58
    }
158
395k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
395k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
395k
    return {new_pos, new_stack_top};
161
395k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)146>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
268k
{
152
268k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
268k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 268k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
268k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
268k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
268k
    return {new_pos, new_stack_top};
161
268k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)147>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
84.9k
{
152
84.9k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
84.9k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 84.8k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
84.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
84.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
84.8k
    return {new_pos, new_stack_top};
161
84.9k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)148>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
35.8k
{
152
35.8k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
35.8k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 35.8k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
35.8k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
35.8k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
35.8k
    return {new_pos, new_stack_top};
161
35.8k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)149>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
8.19k
{
152
8.19k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
8.19k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 8.13k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
8.13k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
8.13k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
8.13k
    return {new_pos, new_stack_top};
161
8.19k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)150>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
3.96k
{
152
3.96k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
3.96k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 70, False: 3.89k]
+
154
70
    {
155
70
        state.status = status;
156
70
        return {nullptr, pos.stack_end};
157
70
    }
158
3.89k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
3.89k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
3.89k
    return {new_pos, new_stack_top};
161
3.96k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)151>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
7.87k
{
152
7.87k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
7.87k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 7.81k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
7.81k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
7.81k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
7.81k
    return {new_pos, new_stack_top};
161
7.87k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)152>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
6.00k
{
152
6.00k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
6.00k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 5.94k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
5.94k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
5.94k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
5.94k
    return {new_pos, new_stack_top};
161
6.00k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)153>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
2.39k
{
152
2.39k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
2.39k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 2.32k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
2.32k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
2.32k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
2.32k
    return {new_pos, new_stack_top};
161
2.39k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)154>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
2.82k
{
152
2.82k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
2.82k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 2.75k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
2.75k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
2.75k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
2.75k
    return {new_pos, new_stack_top};
161
2.82k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)155>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
6.87k
{
152
6.87k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
6.87k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 6.81k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
6.81k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
6.81k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
6.81k
    return {new_pos, new_stack_top};
161
6.87k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)156>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
4.33k
{
152
4.33k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
4.33k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 62, False: 4.26k]
+
154
62
    {
155
62
        state.status = status;
156
62
        return {nullptr, pos.stack_end};
157
62
    }
158
4.26k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
4.26k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
4.26k
    return {new_pos, new_stack_top};
161
4.33k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)157>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
3.65k
{
152
3.65k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
3.65k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 3.59k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
3.59k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
3.59k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
3.59k
    return {new_pos, new_stack_top};
161
3.65k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)158>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
2.49k
{
152
2.49k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
2.49k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 58, False: 2.43k]
+
154
58
    {
155
58
        state.status = status;
156
58
        return {nullptr, pos.stack_end};
157
58
    }
158
2.43k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
2.43k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
2.43k
    return {new_pos, new_stack_top};
161
2.49k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)159>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
2.50k
{
152
2.50k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
2.50k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 58, False: 2.44k]
+
154
58
    {
155
58
        state.status = status;
156
58
        return {nullptr, pos.stack_end};
157
58
    }
158
2.44k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
2.44k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
2.44k
    return {new_pos, new_stack_top};
161
2.50k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)160>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
9.77k
{
152
9.77k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
9.77k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 50, False: 9.72k]
+
154
50
    {
155
50
        state.status = status;
156
50
        return {nullptr, pos.stack_end};
157
50
    }
158
9.72k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
9.72k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
9.72k
    return {new_pos, new_stack_top};
161
9.77k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)161>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
8.50k
{
152
8.50k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
8.50k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 8.46k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
8.46k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
8.46k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
8.46k
    return {new_pos, new_stack_top};
161
8.50k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)162>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
4.97k
{
152
4.97k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
4.97k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 58, False: 4.92k]
+
154
58
    {
155
58
        state.status = status;
156
58
        return {nullptr, pos.stack_end};
157
58
    }
158
4.92k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
4.92k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
4.92k
    return {new_pos, new_stack_top};
161
4.97k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)163>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
7.15k
{
152
7.15k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
7.15k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 46, False: 7.10k]
+
154
46
    {
155
46
        state.status = status;
156
46
        return {nullptr, pos.stack_end};
157
46
    }
158
7.10k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
7.10k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
7.10k
    return {new_pos, new_stack_top};
161
7.15k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)164>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
1.13k
{
152
1.13k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
1.13k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 64, False: 1.07k]
+
154
64
    {
155
64
        state.status = status;
156
64
        return {nullptr, pos.stack_end};
157
64
    }
158
1.07k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
1.07k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
1.07k
    return {new_pos, new_stack_top};
161
1.13k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)240>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
25.5k
{
152
25.5k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
25.5k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 2.33k, False: 23.1k]
+
154
2.33k
    {
155
2.33k
        state.status = status;
156
2.33k
        return {nullptr, pos.stack_end};
157
2.33k
    }
158
23.1k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
23.1k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
23.1k
    return {new_pos, new_stack_top};
161
25.5k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)241>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
814k
{
152
814k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
814k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 108, False: 814k]
+
154
108
    {
155
108
        state.status = status;
156
108
        return {nullptr, pos.stack_end};
157
108
    }
158
814k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
814k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
814k
    return {new_pos, new_stack_top};
161
814k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)242>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
77.7k
{
152
77.7k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
77.7k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 142, False: 77.5k]
+
154
142
    {
155
142
        state.status = status;
156
142
        return {nullptr, pos.stack_end};
157
142
    }
158
77.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
77.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
77.5k
    return {new_pos, new_stack_top};
161
77.7k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)243>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
527k
{
152
527k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
527k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 18, False: 527k]
+
154
18
    {
155
18
        state.status = status;
156
18
        return {nullptr, pos.stack_end};
157
18
    }
158
527k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
527k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
527k
    return {new_pos, new_stack_top};
161
527k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)244>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
73.2k
{
152
73.2k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
73.2k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 139, False: 73.1k]
+
154
139
    {
155
139
        state.status = status;
156
139
        return {nullptr, pos.stack_end};
157
139
    }
158
73.1k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
73.1k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
73.1k
    return {new_pos, new_stack_top};
161
73.2k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)245>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
15.6k
{
152
15.6k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
15.6k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 2.07k, False: 13.5k]
+
154
2.07k
    {
155
2.07k
        state.status = status;
156
2.07k
        return {nullptr, pos.stack_end};
157
2.07k
    }
158
13.5k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
13.5k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
13.5k
    return {new_pos, new_stack_top};
161
15.6k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)250>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
2.99M
{
152
2.99M
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
2.99M
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 179, False: 2.99M]
+
154
179
    {
155
179
        state.status = status;
156
179
        return {nullptr, pos.stack_end};
157
179
    }
158
2.99M
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
2.99M
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
2.99M
    return {new_pos, new_stack_top};
161
2.99M
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)253>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
25.4k
{
152
25.4k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
25.4k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 95, False: 25.3k]
+
154
95
    {
155
95
        state.status = status;
156
95
        return {nullptr, pos.stack_end};
157
95
    }
158
25.3k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
25.3k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
25.3k
    return {new_pos, new_stack_top};
161
25.4k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)254>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
2.03k
{
152
2.03k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
2.03k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 0, False: 2.03k]
+
154
0
    {
155
0
        state.status = status;
156
0
        return {nullptr, pos.stack_end};
157
0
    }
158
2.03k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
2.03k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
2.03k
    return {new_pos, new_stack_top};
161
2.03k
}
baseline_execution.cpp:evmone::baseline::(anonymous namespace)::Position evmone::baseline::(anonymous namespace)::invoke<(evmone::Opcode)255>(std::array<short, 256ul> const&, intx::uint<256u> const*, evmone::baseline::(anonymous namespace)::Position, long&, evmone::ExecutionState&)
Line
Count
Source
151
421k
{
152
421k
    if (const auto status = check_requirements<Op>(cost_table, gas, pos.stack_end, stack_bottom);
153
421k
        status != EVMC_SUCCESS)
  Branch (153:9): [True: 413k, False: 7.99k]
+
154
413k
    {
155
413k
        state.status = status;
156
413k
        return {nullptr, pos.stack_end};
157
413k
    }
158
7.99k
    const auto new_pos = invoke(instr::core::impl<Op>, pos, gas, state);
159
7.99k
    const auto new_stack_top = pos.stack_end + instr::traits[Op].stack_height_change;
160
7.99k
    return {new_pos, new_stack_top};
161
421k
}
162
163
164
template <bool TracingEnabled>
165
int64_t dispatch(const CostTable& cost_table, ExecutionState& state, int64_t gas,
166
    const uint8_t* code, Tracer* tracer = nullptr) noexcept
167
0
{
168
0
    const auto stack_bottom = state.stack_space.bottom();
169
170
    // Code iterator and stack top pointer for interpreter loop.
171
0
    Position position{code, stack_bottom};
172
173
0
    while (true)  // Guaranteed to terminate because padded code ends with STOP.
  Branch (173:12): [True: 0, Folded]
+
  Branch (173:12): [True: 0, Folded]
+
174
0
    {
175
        if constexpr (TracingEnabled)
176
0
        {
177
0
            const auto offset = static_cast<uint32_t>(position.code_it - code);
178
0
            const auto stack_height = static_cast<int>(position.stack_end - stack_bottom);
179
0
            if (offset < state.original_code.size())  // Skip STOP from code padding.
  Branch (179:17): [True: 0, False: 0]
+
180
0
            {
181
0
                tracer->notify_instruction_start(
182
0
                    offset, position.stack_end - 1, stack_height, gas, state);
183
0
            }
184
0
        }
185
186
0
        const auto op = *position.code_it;
187
0
        switch (op)
188
0
        {
189
0
#define ON_OPCODE(OPCODE)                                                                     \
190
0
    case OPCODE:                                                                              \
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
  Branch (190:5): [True: 0, False: 0]
+
191
0
        ASM_COMMENT(OPCODE);                                                                  \
192
0
        if (const auto next = invoke<OPCODE>(cost_table, stack_bottom, position, gas, state); \
193
0
            next.code_it == nullptr)                                                          \
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
  Branch (193:13): [True: 0, False: 0]
+
194
0
        {                                                                                     \
195
0
            return gas;                                                                       \
196
0
        }                                                                                     \
197
0
        else                                                                                  \
198
0
        {                                                                                     \
199
            /* Update current position only when no error,                                    \
200
               this improves compiler optimization. */                                        \
201
0
            position = next;                                                                  \
202
0
        }                                                                                     \
203
0
        break;
204
205
0
            MAP_OPCODES
206
0
#undef ON_OPCODE
207
208
0
        default:
  Branch (208:9): [True: 0, False: 0]
+
  Branch (208:9): [True: 0, False: 0]
+
209
0
            state.status = EVMC_UNDEFINED_INSTRUCTION;
210
0
            return gas;
211
0
        }
212
0
    }
213
0
    intx::unreachable();
214
0
}
Unexecuted instantiation: baseline_execution.cpp:long evmone::baseline::(anonymous namespace)::dispatch<true>(std::array<short, 256ul> const&, evmone::ExecutionState&, long, unsigned char const*, evmone::Tracer*)
Unexecuted instantiation: baseline_execution.cpp:long evmone::baseline::(anonymous namespace)::dispatch<false>(std::array<short, 256ul> const&, evmone::ExecutionState&, long, unsigned char const*, evmone::Tracer*)
215
216
#if EVMONE_CGOTO_SUPPORTED
217
int64_t dispatch_cgoto(
218
    const CostTable& cost_table, ExecutionState& state, int64_t gas, const uint8_t* code) noexcept
219
2.65M
{
220
2.65M
#pragma GCC diagnostic ignored "-Wpedantic"
221
222
2.65M
    static constexpr void* cgoto_table[] = {
223
397M
#define ON_OPCODE(OPCODE) &&TARGET_##OPCODE,
224
2.65M
#undef ON_OPCODE_UNDEFINED
225
280M
#define ON_OPCODE_UNDEFINED(_) &&TARGET_OP_UNDEFINED,
226
2.65M
        MAP_OPCODES
227
2.65M
#undef ON_OPCODE
228
2.65M
#undef ON_OPCODE_UNDEFINED
229
2.65M
#define ON_OPCODE_UNDEFINED ON_OPCODE_UNDEFINED_DEFAULT
230
2.65M
    };
231
2.65M
    static_assert(std::size(cgoto_table) == 256);
232
233
2.65M
    const auto stack_bottom = state.stack_space.bottom();
234
235
    // Code iterator and stack top pointer for interpreter loop.
236
2.65M
    Position position{code, stack_bottom};
237
238
2.65M
    goto* cgoto_table[*position.code_it];
239
240
2.65M
#define ON_OPCODE(OPCODE)                                                                 \
241
249M
    TARGET_##OPCODE : ASM_COMMENT(OPCODE);                                                \
242
249M
    if (const auto next = invoke<OPCODE>(cost_table, stack_bottom, position, gas, state); \
243
249M
        next.code_it == nullptr)                                                          \
  Branch (243:9): [True: 1.29M, False: 0]
+  Branch (243:9): [True: 382, False: 15.7M]
+  Branch (243:9): [True: 50, False: 240k]
+  Branch (243:9): [True: 32, False: 3.29M]
+  Branch (243:9): [True: 38, False: 42.6k]
+  Branch (243:9): [True: 38, False: 4.09k]
+  Branch (243:9): [True: 32, False: 158k]
+  Branch (243:9): [True: 32, False: 3.64k]
+  Branch (243:9): [True: 32, False: 2.12k]
+  Branch (243:9): [True: 32, False: 2.40k]
+  Branch (243:9): [True: 332, False: 37.1k]
+  Branch (243:9): [True: 38, False: 2.65k]
+  Branch (243:9): [True: 48, False: 2.90M]
+  Branch (243:9): [True: 32, False: 404k]
+  Branch (243:9): [True: 32, False: 6.63k]
+  Branch (243:9): [True: 32, False: 6.27k]
+  Branch (243:9): [True: 38, False: 818k]
+  Branch (243:9): [True: 40, False: 5.27M]
+  Branch (243:9): [True: 32, False: 125k]
+  Branch (243:9): [True: 32, False: 51.1k]
+  Branch (243:9): [True: 32, False: 1.74k]
+  Branch (243:9): [True: 38, False: 67.8k]
+  Branch (243:9): [True: 32, False: 75.5k]
+  Branch (243:9): [True: 111, False: 3.46M]
+  Branch (243:9): [True: 109, False: 19.3k]
+  Branch (243:9): [True: 109, False: 9.08k]
+  Branch (243:9): [True: 521, False: 2.82k]
+  Branch (243:9): [True: 2.90k, False: 13.0k]
+  Branch (243:9): [True: 46, False: 46.9k]
+  Branch (243:9): [True: 50, False: 13.1k]
+  Branch (243:9): [True: 46, False: 23.7k]
+  Branch (243:9): [True: 52, False: 276k]
+  Branch (243:9): [True: 46, False: 24.7k]
+  Branch (243:9): [True: 38, False: 1.79M]
+  Branch (243:9): [True: 46, False: 185k]
+  Branch (243:9): [True: 178, False: 127k]
+  Branch (243:9): [True: 46, False: 22.0k]
+  Branch (243:9): [True: 152, False: 11.2k]
+  Branch (243:9): [True: 46, False: 13.5k]
+  Branch (243:9): [True: 596, False: 471k]
+  Branch (243:9): [True: 176, False: 13.2k]
+  Branch (243:9): [True: 116, False: 61.0k]
+  Branch (243:9): [True: 796, False: 9.09k]
+  Branch (243:9): [True: 186, False: 3.41k]
+  Branch (243:9): [True: 32, False: 69.9k]
+  Branch (243:9): [True: 46, False: 15.0k]
+  Branch (243:9): [True: 46, False: 151k]
+  Branch (243:9): [True: 46, False: 135k]
+  Branch (243:9): [True: 46, False: 13.9k]
+  Branch (243:9): [True: 46, False: 15.3k]
+  Branch (243:9): [True: 352, False: 472]
+  Branch (243:9): [True: 352, False: 1.61k]
+  Branch (243:9): [True: 514, False: 564]
+  Branch (243:9): [True: 754, False: 2.87k]
+  Branch (243:9): [True: 770, False: 12.8k]
+  Branch (243:9): [True: 142, False: 4.49M]
+  Branch (243:9): [True: 704, False: 12.2M]
+  Branch (243:9): [True: 780, False: 8.63M]
+  Branch (243:9): [True: 644, False: 158k]
+  Branch (243:9): [True: 59, False: 943k]
+  Branch (243:9): [True: 286k, False: 4.29M]
+  Branch (243:9): [True: 550, False: 5.50M]
+  Branch (243:9): [True: 2.65k, False: 7.06M]
+  Branch (243:9): [True: 102, False: 5.68M]
+  Branch (243:9): [True: 46, False: 16.7k]
+  Branch (243:9): [True: 56, False: 16.5M]
+  Branch (243:9): [True: 56, False: 24.0M]
+  Branch (243:9): [True: 772, False: 1.88M]
+  Branch (243:9): [True: 910, False: 9.07M]
+  Branch (243:9): [True: 988, False: 1.04k]
+  Branch (243:9): [True: 736, False: 1.18M]
+  Branch (243:9): [True: 3.77k, False: 79.7M]
+  Branch (243:9): [True: 186, False: 9.93M]
+  Branch (243:9): [True: 78, False: 1.31M]
+  Branch (243:9): [True: 72, False: 120k]
+  Branch (243:9): [True: 72, False: 49.6k]
+  Branch (243:9): [True: 72, False: 49.8k]
+  Branch (243:9): [True: 72, False: 46.7k]
+  Branch (243:9): [True: 76, False: 47.2k]
+  Branch (243:9): [True: 72, False: 41.9k]
+  Branch (243:9): [True: 72, False: 30.9k]
+  Branch (243:9): [True: 72, False: 28.9k]
+  Branch (243:9): [True: 72, False: 40.5k]
+  Branch (243:9): [True: 72, False: 38.8k]
+  Branch (243:9): [True: 72, False: 34.1k]
+  Branch (243:9): [True: 72, False: 29.1k]
+  Branch (243:9): [True: 72, False: 48.7k]
+  Branch (243:9): [True: 72, False: 21.3k]
+  Branch (243:9): [True: 72, False: 66.3k]
+  Branch (243:9): [True: 72, False: 31.7k]
+  Branch (243:9): [True: 94, False: 2.10M]
+  Branch (243:9): [True: 72, False: 45.1k]
+  Branch (243:9): [True: 72, False: 37.4k]
+  Branch (243:9): [True: 72, False: 38.4k]
+  Branch (243:9): [True: 72, False: 31.9k]
+  Branch (243:9): [True: 72, False: 30.2k]
+  Branch (243:9): [True: 72, False: 41.0k]
+  Branch (243:9): [True: 72, False: 42.1k]
+  Branch (243:9): [True: 72, False: 28.8k]
+  Branch (243:9): [True: 76, False: 34.4k]
+  Branch (243:9): [True: 72, False: 25.0k]
+  Branch (243:9): [True: 72, False: 92.0k]
+  Branch (243:9): [True: 72, False: 312k]
+  Branch (243:9): [True: 64, False: 5.86M]
+  Branch (243:9): [True: 70, False: 1.23M]
+  Branch (243:9): [True: 64, False: 619k]
+  Branch (243:9): [True: 70, False: 282k]
+  Branch (243:9): [True: 88, False: 123k]
+  Branch (243:9): [True: 64, False: 63.3k]
+  Branch (243:9): [True: 70, False: 52.4k]
+  Branch (243:9): [True: 70, False: 443k]
+  Branch (243:9): [True: 82, False: 26.6k]
+  Branch (243:9): [True: 74, False: 52.5k]
+  Branch (243:9): [True: 70, False: 24.6k]
+  Branch (243:9): [True: 82, False: 16.5k]
+  Branch (243:9): [True: 64, False: 30.1k]
+  Branch (243:9): [True: 76, False: 15.0k]
+  Branch (243:9): [True: 82, False: 25.0k]
+  Branch (243:9): [True: 82, False: 17.2k]
+  Branch (243:9): [True: 58, False: 717k]
+  Branch (243:9): [True: 58, False: 395k]
+  Branch (243:9): [True: 64, False: 268k]
+  Branch (243:9): [True: 64, False: 84.8k]
+  Branch (243:9): [True: 64, False: 35.8k]
+  Branch (243:9): [True: 64, False: 8.13k]
+  Branch (243:9): [True: 70, False: 3.89k]
+  Branch (243:9): [True: 64, False: 7.81k]
+  Branch (243:9): [True: 64, False: 5.94k]
+  Branch (243:9): [True: 64, False: 2.32k]
+  Branch (243:9): [True: 64, False: 2.75k]
+  Branch (243:9): [True: 64, False: 6.81k]
+  Branch (243:9): [True: 62, False: 4.26k]
+  Branch (243:9): [True: 64, False: 3.59k]
+  Branch (243:9): [True: 58, False: 2.43k]
+  Branch (243:9): [True: 58, False: 2.44k]
+  Branch (243:9): [True: 373, False: 9.39k]
+  Branch (243:9): [True: 254, False: 8.25k]
+  Branch (243:9): [True: 234, False: 4.74k]
+  Branch (243:9): [True: 220, False: 6.93k]
+  Branch (243:9): [True: 238, False: 898]
+  Branch (243:9): [True: 2.57k, False: 22.9k]
+  Branch (243:9): [True: 912, False: 813k]
+  Branch (243:9): [True: 778, False: 76.9k]
+  Branch (243:9): [True: 527k, False: 0]
+  Branch (243:9): [True: 531, False: 72.7k]
+  Branch (243:9): [True: 2.25k, False: 13.4k]
+  Branch (243:9): [True: 573, False: 2.99M]
+  Branch (243:9): [True: 25.4k, False: 0]
+  Branch (243:9): [True: 2.03k, False: 0]
+  Branch (243:9): [True: 421k, False: 0]
+
244
249M
    {                                                                                     \
245
2.59M
        return gas;                                                                       \
246
2.59M
    }                                                                                     \
247
249M
    else                                                                                  \
248
249M
    {                                                                                     \
249
        /* Update current position only when no error,                                    \
250
           this improves compiler optimization. */                                        \
251
247M
        position = next;                                                                  \
252
247M
    }                                                                                     \
253
249M
    
goto* cgoto_table[*position.code_it];247M
254
255
496M
    
MAP_OPCODES2.65M
256
496M
#undef ON_OPCODE
257
258
496M
TARGET_OP_UNDEFINED:
259
55.1k
    state.status = EVMC_UNDEFINED_INSTRUCTION;
260
55.1k
    return gas;
261
496M
}
262
#endif
263
}  // namespace
264
265
evmc_result execute(VM& vm, const evmc_host_interface& host, evmc_host_context* ctx,
266
    evmc_revision rev, const evmc_message& msg, const CodeAnalysis& analysis) noexcept
267
2.65M
{
268
2.65M
    const auto code = analysis.executable_code();
269
2.65M
    const auto code_begin = code.data();
270
2.65M
    auto gas = msg.gas;
271
272
2.65M
    auto& state = vm.get_execution_state(static_cast<size_t>(msg.depth));
273
2.65M
    state.reset(msg, rev, host, ctx, analysis.raw_code());
274
275
2.65M
    state.analysis.baseline = &analysis;  // Assign code analysis for instruction implementations.
276
277
2.65M
    const auto& cost_table = get_baseline_cost_table(state.rev);
278
279
2.65M
    auto* tracer = vm.get_tracer();
280
2.65M
    if (INTX_UNLIKELY(tracer != nullptr))
  Branch (280:9): [True: 0, False: 2.65M]
+
281
0
    {
282
0
        tracer->notify_execution_start(state.rev, *state.msg, code);
283
0
        gas = dispatch<true>(cost_table, state, gas, code_begin, tracer);
284
0
    }
285
2.65M
    else
286
2.65M
    {
287
2.65M
#if EVMONE_CGOTO_SUPPORTED
288
2.65M
        if (vm.cgoto)
  Branch (288:13): [True: 2.65M, False: 0]
+
289
2.65M
            gas = dispatch_cgoto(cost_table, state, gas, code_begin);
290
0
        else
291
0
#endif
292
0
            gas = dispatch<false>(cost_table, state, gas, code_begin);
293
2.65M
    }
294
295
2.65M
    const auto gas_left = (state.status == EVMC_SUCCESS || 
state.status == EVMC_REVERT820k
) ?
gas1.85M
:
0795k
;
  Branch (295:28): [True: 1.83M, False: 820k]
+  Branch (295:60): [True: 25.2k, False: 795k]
+
  MC/DC Decision Region (295:28) to (295:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (295:28)
+     Condition C2 --> (295:60)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
296
2.65M
    const auto gas_refund = (state.status == EVMC_SUCCESS) ? 
state.gas_refund1.83M
:
0820k
;
  Branch (296:29): [True: 1.83M, False: 820k]
+
297
298
2.65M
    assert(state.output_size != 0 || state.output_offset == 0);
299
2.65M
    const auto result = evmc::make_result(state.status, gas_left, gas_refund,
300
2.65M
        state.output_size != 0 ? 
&state.memory[state.output_offset]454k
:
nullptr2.19M
, state.output_size);
  Branch (300:9): [True: 454k, False: 2.19M]
+
301
302
2.65M
    if (INTX_UNLIKELY(tracer != nullptr))
  Branch (302:9): [True: 0, False: 2.65M]
+
303
0
        tracer->notify_execution_end(result);
304
305
2.65M
    return result;
306
2.65M
}
307
308
evmc_result execute(evmc_vm* c_vm, const evmc_host_interface* host, evmc_host_context* ctx,
309
    evmc_revision rev, const evmc_message* msg, const uint8_t* code, size_t code_size) noexcept
310
2.65M
{
311
2.65M
    auto vm = static_cast<VM*>(c_vm);
312
2.65M
    const bytes_view container{code, code_size};
313
314
2.65M
    const auto code_analysis = analyze(container);
315
2.65M
    return execute(*vm, *host, ctx, rev, *msg, code_analysis);
316
2.65M
}
317
}  // namespace evmone::baseline
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline_instruction_table.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline_instruction_table.cpp.html new file mode 100644 index 0000000000..bad5bb55e5 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/baseline_instruction_table.cpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone/baseline_instruction_table.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2020 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "baseline_instruction_table.hpp"
6
#include "instructions_traits.hpp"
7
8
namespace evmone::baseline
9
{
10
namespace
11
{
12
consteval auto build_cost_tables() noexcept
13
{
14
    std::array<CostTable, EVMC_MAX_REVISION + 1> tables{};
15
    for (size_t r = EVMC_FRONTIER; r <= EVMC_MAX_REVISION; ++r)
16
    {
17
        auto& table = tables[r];
18
        for (size_t op = 0; op < table.size(); ++op)
19
        {
20
            const auto& tr = instr::traits[op];
21
            const auto since = tr.since;
22
            table[op] = (since && r >= *since) ? instr::gas_costs[r][op] : instr::undefined;
23
        }
24
    }
25
    return tables;
26
}
27
28
constexpr auto COST_TABLES = build_cost_tables();
29
}  // namespace
30
31
const CostTable& get_baseline_cost_table(evmc_revision rev) noexcept
32
2.65M
{
33
2.65M
    return COST_TABLES[rev];
34
2.65M
}
35
}  // namespace evmone::baseline
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/delegation.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/delegation.cpp.html new file mode 100644 index 0000000000..9e8a780e77 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/delegation.cpp.html @@ -0,0 +1,2 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone/delegation.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2025 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#include "delegation.hpp"
5
#include <cassert>
6
7
namespace evmone
8
{
9
std::optional<evmc::address> get_delegate_address(
10
    const evmc::HostInterface& host, const evmc::address& addr) noexcept
11
2.35M
{
12
    // Load the code prefix up to the delegation designation size.
13
    // The HostInterface::copy_code() copies up to the addr's code size
14
    // and returns the number of bytes copied.
15
2.35M
    uint8_t designation_buffer[std::size(DELEGATION_MAGIC) + sizeof(evmc::address)];
16
2.35M
    const auto size = host.copy_code(addr, 0, designation_buffer, std::size(designation_buffer));
17
2.35M
    const bytes_view designation{designation_buffer, size};
18
19
2.35M
    if (!is_code_delegated(designation))
  Branch (19:9): [True: 2.35M, False: 3.37k]
+
20
2.35M
        return {};
21
22
    // Copy the delegate address from the designation buffer.
23
3.37k
    evmc::address delegate_address;
24
    // Assume the designation with the valid magic has also valid length.
25
    assert(designation.size() == std::size(designation_buffer));
26
3.37k
    std::ranges::copy(designation.substr(std::size(DELEGATION_MAGIC)), delegate_address.bytes);
27
3.37k
    return delegate_address;
28
2.35M
}
29
}  // namespace evmone
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/delegation.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/delegation.hpp.html new file mode 100644 index 0000000000..352bb2768e --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/delegation.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone/delegation.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2025 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <evmc/bytes.hpp>
7
#include <evmc/evmc.hpp>
8
#include <evmc/utils.h>
9
10
namespace evmone
11
{
12
using evmc::bytes_view;
13
14
/// Prefix of code for delegated accounts
15
/// defined by [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702)
16
constexpr uint8_t DELEGATION_MAGIC_BYTES[] = {0xef, 0x01, 0x00};
17
constexpr bytes_view DELEGATION_MAGIC{DELEGATION_MAGIC_BYTES, std::size(DELEGATION_MAGIC_BYTES)};
18
19
/// Check if code contains EIP-7702 delegation designator
20
constexpr bool is_code_delegated(bytes_view code) noexcept
21
2.95M
{
22
2.95M
    return code.starts_with(DELEGATION_MAGIC);
23
2.95M
}
24
25
/// Get EIP-7702 delegate address from the code of addr, if it is delegated.
26
EVMC_EXPORT std::optional<evmc::address> get_delegate_address(
27
    const evmc::HostInterface& host, const evmc::address& addr) noexcept;
28
}  // namespace evmone
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/execution_state.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/execution_state.hpp.html new file mode 100644 index 0000000000..1112252c25 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/execution_state.hpp.html @@ -0,0 +1,7 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone/execution_state.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2019 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <evmc/evmc.hpp>
7
#include <intx/intx.hpp>
8
#include <exception>
9
#include <memory>
10
#include <string>
11
#include <vector>
12
13
namespace evmone
14
{
15
namespace advanced
16
{
17
struct AdvancedCodeAnalysis;
18
}
19
namespace baseline
20
{
21
class CodeAnalysis;
22
}
23
24
using evmc::bytes;
25
using evmc::bytes_view;
26
using intx::uint256;
27
28
29
/// Provides memory for EVM stack.
30
class StackSpace
31
{
32
    struct Storage
33
    {
34
        /// The maximum number of EVM stack items.
35
        static constexpr auto limit = 1024;
36
37
        /// Stack space items are aligned to 256 bits for better packing in cache lines.
38
        static constexpr auto alignment = sizeof(uint256);
39
40
        alignas(alignment) uint256 items[limit];
41
    };
42
43
    /// The storage allocated for maximum possible number of items.
44
    std::unique_ptr<Storage> m_stack_space = std::make_unique<Storage>();
45
46
public:
47
    static constexpr auto limit = Storage::limit;
48
49
    /// Returns the pointer to the "bottom", i.e. below the stack space.
50
2.65M
    [[nodiscard]] uint256* bottom() noexcept { return &m_stack_space->items[0]; }
51
};
52
53
54
/// The EVM memory.
55
///
56
/// The implementations uses initial allocation of 4k and then grows capacity with 2x factor.
57
/// Some benchmarks have been done to confirm 4k is ok-ish value.
58
class Memory
59
{
60
    /// The size of allocation "page".
61
    static constexpr size_t page_size = 4 * 1024;
62
63
    struct FreeDeleter
64
    {
65
1.82k
        void operator()(uint8_t* p) const noexcept { std::free(p); }
66
    };
67
68
    /// Owned pointer to allocated memory.
69
    std::unique_ptr<uint8_t[], FreeDeleter> m_data;
70
71
    /// The "virtual" size of the memory.
72
    size_t m_size = 0;
73
74
    /// The size of allocated memory. The initialization value is the initial capacity.
75
    size_t m_capacity = page_size;
76
77
0
    [[noreturn, gnu::cold]] static void handle_out_of_memory() noexcept { std::terminate(); }
78
79
    void allocate_capacity() noexcept
80
6.54k
    {
81
6.54k
        m_data.reset(static_cast<uint8_t*>(std::realloc(m_data.release(), m_capacity)));
82
6.54k
        if (!m_data) [[unlikely]]
  Branch (82:13): [True: 0, False: 6.54k]
+
83
0
            handle_out_of_memory();
84
6.54k
    }
85
86
public:
87
    /// Creates Memory object with initial capacity allocation.
88
1.82k
    Memory() noexcept { allocate_capacity(); }
89
90
24.9M
    uint8_t& operator[](size_t index) noexcept { return m_data[index]; }
91
92
27.1M
    [[nodiscard]] size_t size() const noexcept { return m_size; }
93
94
    /// Grows the memory to the given size. The extent is filled with zeros.
95
    ///
96
    /// @param new_size  New memory size. Must be larger than the current size and multiple of 32.
97
    void grow(size_t new_size) noexcept
98
1.73M
    {
99
        // Restriction for future changes. EVM always has memory size as multiple of 32 bytes.
100
1.73M
        INTX_REQUIRE(new_size % 32 == 0);
  Branch (100:9): [True: 1.73M, False: 0]
+
101
102
        // Allow only growing memory. Include hint for optimizing compiler.
103
1.73M
        INTX_REQUIRE(new_size > m_size);
  Branch (103:9): [True: 1.73M, False: 0]
+
104
105
1.73M
        if (new_size > m_capacity)
  Branch (105:13): [True: 4.71k, False: 1.73M]
+
106
4.71k
        {
107
4.71k
            m_capacity *= 2;  // Double the capacity.
108
109
4.71k
            if (m_capacity < new_size)  // If not enough.
  Branch (109:17): [True: 1.66k, False: 3.04k]
+
110
1.66k
            {
111
                // Set capacity to required size rounded to multiple of page_size.
112
1.66k
                m_capacity = ((new_size + (page_size - 1)) / page_size) * page_size;
113
1.66k
            }
114
115
4.71k
            allocate_capacity();
116
4.71k
        }
117
1.73M
        std::memset(&m_data[m_size], 0, new_size - m_size);
118
1.73M
        m_size = new_size;
119
1.73M
    }
120
121
    /// Virtually clears the memory by setting its size to 0. The capacity stays unchanged.
122
2.65M
    void clear() noexcept { m_size = 0; }
123
};
124
125
/// Initcode read from Initcode Transaction (EIP-7873).
126
struct TransactionInitcode
127
{
128
    /// Initcode bytes.
129
    bytes_view code;
130
    /// Result of initcode validation, if it was validated.
131
    /// std::nullopt if initcode was not validated yet.
132
    std::optional<bool> is_valid;
133
};
134
135
/// Generic execution state for generic instructions implementations.
136
// NOLINTNEXTLINE(clang-analyzer-optin.performance.Padding)
137
class ExecutionState
138
{
139
public:
140
    int64_t gas_refund = 0;
141
    Memory memory;
142
    const evmc_message* msg = nullptr;
143
    evmc::HostContext host;
144
    evmc_revision rev = {};
145
    bytes return_data;
146
147
    /// Reference to original EVM code.
148
    bytes_view original_code;
149
150
    evmc_status_code status = EVMC_SUCCESS;
151
    size_t output_offset = 0;
152
    size_t output_size = 0;
153
154
private:
155
    evmc_tx_context m_tx = {};
156
157
public:
158
    /// Pointer to code analysis.
159
    /// This should be set and used internally by execute() function of a particular interpreter.
160
    union
161
    {
162
        const baseline::CodeAnalysis* baseline = nullptr;
163
        const advanced::AdvancedCodeAnalysis* advanced;
164
    } analysis{};
165
166
    /// Stack space allocation.
167
    ///
168
    /// This is the last field to make other fields' offsets of reasonable values.
169
    StackSpace stack_space;
170
171
1.82k
    ExecutionState() noexcept = default;
172
173
    ExecutionState(const evmc_message& message, evmc_revision revision,
174
        const evmc_host_interface& host_interface, evmc_host_context* host_ctx,
175
        bytes_view _code) noexcept
176
0
      : msg{&message}, host{host_interface, host_ctx}, rev{revision}, original_code{_code}
177
0
    {}
178
179
    /// Resets the contents of the ExecutionState so that it could be reused.
180
    void reset(const evmc_message& message, evmc_revision revision,
181
        const evmc_host_interface& host_interface, evmc_host_context* host_ctx,
182
        bytes_view _code) noexcept
183
2.65M
    {
184
2.65M
        gas_refund = 0;
185
2.65M
        memory.clear();
186
2.65M
        msg = &message;
187
2.65M
        host = {host_interface, host_ctx};
188
2.65M
        rev = revision;
189
2.65M
        return_data.clear();
190
2.65M
        original_code = _code;
191
2.65M
        status = EVMC_SUCCESS;
192
2.65M
        output_offset = 0;
193
2.65M
        output_size = 0;
194
2.65M
        m_tx = {};
195
2.65M
    }
196
197
13.7M
    [[nodiscard]] bool in_static_mode() const { return (msg->flags & EVMC_STATIC) != 0; }
198
199
    const evmc_tx_context& get_tx_context() noexcept
200
455k
    {
201
455k
        if (INTX_UNLIKELY(m_tx.block_timestamp == 0))
  Branch (201:13): [True: 173k, False: 281k]
+
202
173k
            m_tx = host.get_tx_context();
203
455k
        return m_tx;
204
455k
    }
205
};
206
}  // namespace evmone
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions.hpp.html new file mode 100644 index 0000000000..92a5aa00f7 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions.hpp.html @@ -0,0 +1,346 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone/instructions.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2019 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include "baseline.hpp"
7
#include "execution_state.hpp"
8
#include "instructions_traits.hpp"
9
#include "instructions_xmacro.hpp"
10
#include <evmone_precompiles/keccak.hpp>
11
12
namespace evmone
13
{
14
using code_iterator = const uint8_t*;
15
16
/// Represents the pointer to the stack top item
17
/// and allows retrieving stack items and manipulating the pointer.
18
class StackTop
19
{
20
    uint256* m_end;  ///< Pointer to the stack end (1 slot above the stack top item).
21
22
public:
23
    explicit(false) StackTop(uint256* end) noexcept
24
249M
      : m_end{std::assume_aligned<sizeof(uint256)>(end)}
25
249M
    {}
26
27
    /// Returns the pointer to the stack end (the stack slot above the top item).
28
0
    [[nodiscard]] uint256* end() noexcept { return m_end; }
29
30
    /// Returns the reference to the stack item by index, where 0 means the top item
31
    /// and positive index values the items further down the stack.
32
    /// Using [-1] is also valid, but .push() should be used instead.
33
30.9M
    [[nodiscard]] uint256& operator[](int index) noexcept { return m_end[-1 - index]; }
34
35
    /// Returns the reference to the stack top item.
36
148M
    [[nodiscard]] uint256& top() noexcept { return m_end[-1]; }
37
38
    /// Returns the current top item and move the stack top pointer down.
39
    /// The value is returned by reference because the stack slot remains valid.
40
112M
    [[nodiscard]] uint256& pop() noexcept { return *--m_end; }
41
42
    /// Assigns the value to the stack top and moves the stack top pointer up.
43
131M
    void push(const uint256& value) noexcept { *m_end++ = value; }
44
};
45
46
47
/// Instruction execution result.
48
struct Result
49
{
50
    evmc_status_code status;
51
    int64_t gas_left;
52
};
53
54
/// Instruction result indicating that execution terminates unconditionally.
55
struct TermResult : Result
56
{};
57
58
constexpr auto max_buffer_size = std::numeric_limits<uint32_t>::max();
59
60
/// The size of the EVM 256-bit word.
61
constexpr auto word_size = 32;
62
63
/// Returns number of words what would fit to provided number of bytes,
64
/// i.e. it rounds up the number bytes to number of words.
65
constexpr int64_t num_words(uint64_t size_in_bytes) noexcept
66
1.95M
{
67
1.95M
    return static_cast<int64_t>((size_in_bytes + (word_size - 1)) / word_size);
68
1.95M
}
69
70
/// Computes gas cost of copying the given amount of bytes to/from EVM memory.
71
constexpr int64_t copy_cost(uint64_t size_in_bytes) noexcept
72
162k
{
73
162k
    constexpr auto WordCopyCost = 3;
74
162k
    return num_words(size_in_bytes) * WordCopyCost;
75
162k
}
76
77
/// Grows EVM memory and checks its cost.
78
///
79
/// This function should not be inlined because this may affect other inlining decisions:
80
/// - making check_memory() too costly to inline,
81
/// - making mload()/mstore()/mstore8() too costly to inline.
82
///
83
/// TODO: This function should be moved to Memory class.
84
[[gnu::noinline]] inline int64_t grow_memory(
85
    int64_t gas_left, Memory& memory, uint64_t new_size) noexcept
86
1.73M
{
87
    // This implementation recomputes memory.size(). This value is already known to the caller
88
    // and can be passed as a parameter, but this make no difference to the performance.
89
90
1.73M
    const auto new_words = num_words(new_size);
91
1.73M
    const auto current_words = static_cast<int64_t>(memory.size() / word_size);
92
1.73M
    const auto new_cost = 3 * new_words + new_words * new_words / 512;
93
1.73M
    const auto current_cost = 3 * current_words + current_words * current_words / 512;
94
1.73M
    const auto cost = new_cost - current_cost;
95
96
1.73M
    gas_left -= cost;
97
1.73M
    if (gas_left >= 0) [[likely]]
  Branch (97:9): [True: 1.73M, False: 3.87k]
+
98
1.73M
        memory.grow(static_cast<size_t>(new_words * word_size));
99
1.73M
    return gas_left;
100
1.73M
}
101
102
/// Check memory requirements of a reasonable size.
103
inline bool check_memory(
104
    int64_t& gas_left, Memory& memory, const uint256& offset, uint64_t size) noexcept
105
25.4M
{
106
    // TODO: This should be done in intx.
107
    // There is "branchless" variant of this using | instead of ||, but benchmarks difference
108
    // is within noise. This should be decided when moving the implementation to intx.
109
25.4M
    if (((offset[3] | offset[2] | offset[1]) != 0) || 
(offset[0] > max_buffer_size)25.4M
)
  Branch (109:9): [True: 468, False: 25.4M]
+  Branch (109:55): [True: 636, False: 25.4M]
+
  MC/DC Decision Region (109:9) to (109:84)
+
+  Number of Conditions: 2
+     Condition C1 --> (109:9)
+     Condition C2 --> (109:55)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
110
1.10k
        return false;
111
112
25.4M
    const auto new_size = static_cast<uint64_t>(offset) + size;
113
25.4M
    if (new_size > memory.size())
  Branch (113:9): [True: 1.73M, False: 23.6M]
+
114
1.73M
    {
115
1.73M
        gas_left = grow_memory(gas_left, memory, new_size);
116
1.73M
        if (gas_left < 0) [[unlikely]]
  Branch (116:13): [True: 3.87k, False: 1.73M]
+
117
3.87k
            return false;
118
1.73M
    }
119
120
25.4M
    return true;
121
25.4M
}
122
123
/// Check memory requirements for "copy" instructions.
124
inline bool check_memory(
125
    int64_t& gas_left, Memory& memory, const uint256& offset, const uint256& size) noexcept
126
8.72M
{
127
8.72M
    if (size == 0)  // Copy of size 0 is always valid (even if offset is huge).
  Branch (127:9): [True: 4.33M, False: 4.38M]
+
128
4.33M
        return true;
129
130
    // This check has 3 same word checks with the check above.
131
    // However, compilers do decent although not perfect job unifying common instructions.
132
    // TODO: This should be done in intx.
133
4.38M
    if (((size[3] | size[2] | size[1]) != 0) || 
(size[0] > max_buffer_size)4.38M
)
  Branch (133:9): [True: 604, False: 4.38M]
+  Branch (133:49): [True: 1.14k, False: 4.38M]
+
  MC/DC Decision Region (133:9) to (133:76)
+
+  Number of Conditions: 2
+     Condition C1 --> (133:9)
+     Condition C2 --> (133:49)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
134
1.74k
        return false;
135
136
4.38M
    return check_memory(gas_left, memory, offset, static_cast<uint64_t>(size));
137
4.38M
}
138
139
namespace instr::core
140
{
141
142
/// The "core" instruction implementations.
143
///
144
/// These are minimal EVM instruction implementations which assume:
145
/// - the stack requirements (overflow, underflow) have already been checked,
146
/// - the "base" gas const has already been charged,
147
/// - the `stack` pointer points to the EVM stack top element.
148
/// Moreover, these implementations _do not_ inform about new stack height
149
/// after execution. The adjustment must be performed by the caller.
150
28.5M
inline void noop(StackTop /*stack*/) noexcept {}
151
inline constexpr auto pop = noop;
152
inline constexpr auto jumpdest = noop;
153
154
template <evmc_status_code Status>
155
inline TermResult stop_impl(
156
    StackTop /*stack*/, int64_t gas_left, ExecutionState& /*state*/) noexcept
157
1.29M
{
158
1.29M
    return {Status, gas_left};
159
1.29M
}
evmone::TermResult evmone::instr::core::stop_impl<(evmc_status_code)0>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
157
1.29M
{
158
1.29M
    return {Status, gas_left};
159
1.29M
}
evmone::TermResult evmone::instr::core::stop_impl<(evmc_status_code)4>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
157
2.03k
{
158
2.03k
    return {Status, gas_left};
159
2.03k
}
160
inline constexpr auto stop = stop_impl<EVMC_SUCCESS>;
161
inline constexpr auto invalid = stop_impl<EVMC_INVALID_INSTRUCTION>;
162
163
inline void add(StackTop stack) noexcept
164
15.7M
{
165
15.7M
    stack.top() += stack.pop();
166
15.7M
}
167
168
inline void mul(StackTop stack) noexcept
169
240k
{
170
240k
    stack.top() *= stack.pop();
171
240k
}
172
173
inline void sub(StackTop stack) noexcept
174
3.29M
{
175
3.29M
    stack[1] = stack[0] - stack[1];
176
3.29M
}
177
178
inline void div(StackTop stack) noexcept
179
42.6k
{
180
42.6k
    auto& v = stack[1];
181
42.6k
    v = v != 0 ? 
stack[0] / v42.5k
:
0108
;
  Branch (181:9): [True: 42.5k, False: 108]
+
182
42.6k
}
183
184
inline void sdiv(StackTop stack) noexcept
185
4.09k
{
186
4.09k
    auto& v = stack[1];
187
4.09k
    v = v != 0 ? 
intx::sdivrem(stack[0], v).quot3.96k
:
0132
;
  Branch (187:9): [True: 3.96k, False: 132]
+
188
4.09k
}
189
190
inline void mod(StackTop stack) noexcept
191
158k
{
192
158k
    auto& v = stack[1];
193
158k
    v = v != 0 ? 
stack[0] % v158k
:
0108
;
  Branch (193:9): [True: 158k, False: 108]
+
194
158k
}
195
196
inline void smod(StackTop stack) noexcept
197
3.64k
{
198
3.64k
    auto& v = stack[1];
199
3.64k
    v = v != 0 ? 
intx::sdivrem(stack[0], v).rem3.52k
:
0114
;
  Branch (199:9): [True: 3.52k, False: 114]
+
200
3.64k
}
201
202
inline void addmod(StackTop stack) noexcept
203
2.12k
{
204
2.12k
    const auto& x = stack.pop();
205
2.12k
    const auto& y = stack.pop();
206
2.12k
    auto& m = stack.top();
207
2.12k
    m = m != 0 ? 
intx::addmod(x, y, m)1.83k
:
0294
;
  Branch (207:9): [True: 1.83k, False: 294]
+
208
2.12k
}
209
210
inline void mulmod(StackTop stack) noexcept
211
2.40k
{
212
2.40k
    const auto& x = stack[0];
213
2.40k
    const auto& y = stack[1];
214
2.40k
    auto& m = stack[2];
215
2.40k
    m = m != 0 ? 
intx::mulmod(x, y, m)2.11k
:
0282
;
  Branch (215:9): [True: 2.11k, False: 282]
+
216
2.40k
}
217
218
inline Result exp(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
219
37.4k
{
220
37.4k
    const auto& base = stack.pop();
221
37.4k
    auto& exponent = stack.top();
222
223
37.4k
    const auto exponent_significant_bytes =
224
37.4k
        static_cast<int>(intx::count_significant_bytes(exponent));
225
37.4k
    const auto exponent_cost = state.rev >= EVMC_SPURIOUS_DRAGON ? 
5037.3k
:
1086
;
  Branch (225:32): [True: 37.3k, False: 86]
+
226
37.4k
    const auto additional_cost = exponent_significant_bytes * exponent_cost;
227
37.4k
    if ((gas_left -= additional_cost) < 0)
  Branch (227:9): [True: 252, False: 37.1k]
+
228
252
        return {EVMC_OUT_OF_GAS, gas_left};
229
230
37.1k
    exponent = intx::exp(base, exponent);
231
37.1k
    return {EVMC_SUCCESS, gas_left};
232
37.4k
}
233
234
inline void signextend(StackTop stack) noexcept
235
2.65k
{
236
2.65k
    const auto& ext = stack.pop();
237
2.65k
    auto& x = stack.top();
238
239
2.65k
    if (ext < 31)  // For 31 we also don't need to do anything.
  Branch (239:9): [True: 1.18k, False: 1.46k]
+
240
1.18k
    {
241
1.18k
        const auto e = ext[0];  // uint256 -> uint64.
242
1.18k
        const auto sign_word_index =
243
1.18k
            static_cast<size_t>(e / sizeof(e));      // Index of the word with the sign bit.
244
1.18k
        const auto sign_byte_index = e % sizeof(e);  // Index of the sign byte in the sign word.
245
1.18k
        auto& sign_word = x[sign_word_index];
246
247
1.18k
        const auto sign_byte_offset = sign_byte_index * 8;
248
1.18k
        const auto sign_byte = sign_word >> sign_byte_offset;  // Move sign byte to position 0.
249
250
        // Sign-extend the "sign" byte and move it to the right position. Value bits are zeros.
251
1.18k
        const auto sext_byte = static_cast<uint64_t>(int64_t{static_cast<int8_t>(sign_byte)});
252
1.18k
        const auto sext = sext_byte << sign_byte_offset;
253
254
1.18k
        const auto sign_mask = ~uint64_t{0} << sign_byte_offset;
255
1.18k
        const auto value = sign_word & ~sign_mask;  // Reset extended bytes.
256
1.18k
        sign_word = sext | value;                   // Combine the result word.
257
258
        // Produce bits (all zeros or ones) for extended words. This is done by SAR of
259
        // the sign-extended byte. Shift by any value 7-63 would work.
260
1.18k
        const auto sign_ex = static_cast<uint64_t>(static_cast<int64_t>(sext_byte) >> 8);
261
262
4.72k
        for (size_t i = 3; i > sign_word_index; 
--i3.53k
)
  Branch (262:28): [True: 3.53k, False: 1.18k]
+
263
3.53k
            x[i] = sign_ex;  // Clear extended words.
264
1.18k
    }
265
2.65k
}
266
267
inline void lt(StackTop stack) noexcept
268
2.90M
{
269
2.90M
    const auto& x = stack.pop();
270
2.90M
    stack[0] = x < stack[0];
271
2.90M
}
272
273
inline void gt(StackTop stack) noexcept
274
404k
{
275
404k
    const auto& x = stack.pop();
276
404k
    stack[0] = stack[0] < x;  // Arguments are swapped and < is used.
277
404k
}
278
279
inline void slt(StackTop stack) noexcept
280
6.63k
{
281
6.63k
    const auto& x = stack.pop();
282
6.63k
    stack[0] = slt(x, stack[0]);
283
6.63k
}
284
285
inline void sgt(StackTop stack) noexcept
286
6.27k
{
287
6.27k
    const auto& x = stack.pop();
288
6.27k
    stack[0] = slt(stack[0], x);  // Arguments are swapped and SLT is used.
289
6.27k
}
290
291
inline void eq(StackTop stack) noexcept
292
818k
{
293
818k
    stack[1] = stack[0] == stack[1];
294
818k
}
295
296
inline void iszero(StackTop stack) noexcept
297
5.27M
{
298
5.27M
    stack.top() = stack.top() == 0;
299
5.27M
}
300
301
inline void and_(StackTop stack) noexcept
302
125k
{
303
125k
    stack.top() &= stack.pop();
304
125k
}
305
306
inline void or_(StackTop stack) noexcept
307
51.1k
{
308
51.1k
    stack.top() |= stack.pop();
309
51.1k
}
310
311
inline void xor_(StackTop stack) noexcept
312
1.74k
{
313
1.74k
    stack.top() ^= stack.pop();
314
1.74k
}
315
316
inline void not_(StackTop stack) noexcept
317
67.8k
{
318
67.8k
    stack.top() = ~stack.top();
319
67.8k
}
320
321
inline void byte(StackTop stack) noexcept
322
75.5k
{
323
75.5k
    const auto& n = stack.pop();
324
75.5k
    auto& x = stack.top();
325
326
75.5k
    const bool n_valid = n < 32;
327
75.5k
    const uint64_t byte_mask = (n_valid ? 
0xff75.4k
:
080
);
  Branch (327:33): [True: 75.4k, False: 80]
+
328
329
75.5k
    const auto index = 31 - static_cast<unsigned>(n[0] % 32);
330
75.5k
    const auto word = x[index / 8];
331
75.5k
    const auto byte_index = index % 8;
332
75.5k
    const auto byte = (word >> (byte_index * 8)) & byte_mask;
333
75.5k
    x = byte;
334
75.5k
}
335
336
inline void shl(StackTop stack) noexcept
337
3.46M
{
338
3.46M
    stack.top() <<= stack.pop();
339
3.46M
}
340
341
inline void shr(StackTop stack) noexcept
342
19.3k
{
343
19.3k
    stack.top() >>= stack.pop();
344
19.3k
}
345
346
inline void sar(StackTop stack) noexcept
347
9.08k
{
348
9.08k
    const auto& y = stack.pop();
349
9.08k
    auto& x = stack.top();
350
351
9.08k
    const bool is_neg = static_cast<int64_t>(x[3]) < 0;  // Inspect the top bit (words are LE).
352
9.08k
    const auto sign_mask = is_neg ? 
~uint256{}2.56k
:
uint256{}6.52k
;
  Branch (352:28): [True: 2.56k, False: 6.52k]
+
353
354
9.08k
    const auto mask_shift = (y < 256) ? 
(256 - y[0])3.62k
:
05.46k
;
  Branch (354:29): [True: 3.62k, False: 5.46k]
+
355
9.08k
    x = (x >> y) | (sign_mask << mask_shift);
356
9.08k
}
357
358
inline void clz(StackTop stack) noexcept
359
2.82k
{
360
2.82k
    stack.top() = clz(stack.top());
361
2.82k
}
362
363
inline Result keccak256(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
364
15.8k
{
365
15.8k
    const auto& index = stack.pop();
366
15.8k
    auto& size = stack.top();
367
368
15.8k
    if (!check_memory(gas_left, state.memory, index, size))
  Branch (368:9): [True: 2.26k, False: 13.6k]
+
369
2.26k
        return {EVMC_OUT_OF_GAS, gas_left};
370
371
13.6k
    const auto i = static_cast<size_t>(index);
372
13.6k
    const auto s = static_cast<size_t>(size);
373
13.6k
    const auto w = num_words(s);
374
13.6k
    const auto cost = w * 6;
375
13.6k
    if ((gas_left -= cost) < 0)
  Branch (375:9): [True: 600, False: 13.0k]
+
376
600
        return {EVMC_OUT_OF_GAS, gas_left};
377
378
13.0k
    auto data = s != 0 ? 
&state.memory[i]12.1k
:
nullptr889
;
  Branch (378:17): [True: 12.1k, False: 889]
+
379
13.0k
    size = intx::be::load<uint256>(ethash::keccak256(data, s));
380
13.0k
    return {EVMC_SUCCESS, gas_left};
381
13.6k
}
382
383
384
inline void address(StackTop stack, ExecutionState& state) noexcept
385
46.9k
{
386
46.9k
    stack.push(intx::be::load<uint256>(state.msg->recipient));
387
46.9k
}
388
389
inline Result balance(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
390
13.1k
{
391
13.1k
    auto& x = stack.top();
392
13.1k
    const auto addr = intx::be::trunc<evmc::address>(x);
393
394
13.1k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(addr) == EVMC_ACCESS_COLD12.9k
)
  Branch (394:9): [True: 12.9k, False: 218]
+  Branch (394:37): [True: 6.80k, False: 6.14k]
+
  MC/DC Decision Region (394:9) to (394:88)
+
+  Number of Conditions: 2
+     Condition C1 --> (394:9)
+     Condition C2 --> (394:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
395
6.80k
    {
396
6.80k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
  Branch (396:13): [True: 12, False: 6.79k]
+
397
12
            return {EVMC_OUT_OF_GAS, gas_left};
398
6.80k
    }
399
400
13.1k
    x = intx::be::load<uint256>(state.host.get_balance(addr));
401
13.1k
    return {EVMC_SUCCESS, gas_left};
402
13.1k
}
403
404
inline void origin(StackTop stack, ExecutionState& state) noexcept
405
23.7k
{
406
23.7k
    stack.push(intx::be::load<uint256>(state.get_tx_context().tx_origin));
407
23.7k
}
408
409
inline void caller(StackTop stack, ExecutionState& state) noexcept
410
276k
{
411
276k
    stack.push(intx::be::load<uint256>(state.msg->sender));
412
276k
}
413
414
inline void callvalue(StackTop stack, ExecutionState& state) noexcept
415
24.7k
{
416
24.7k
    stack.push(intx::be::load<uint256>(state.msg->value));
417
24.7k
}
418
419
inline void calldataload(StackTop stack, ExecutionState& state) noexcept
420
1.79M
{
421
1.79M
    auto& index = stack.top();
422
423
1.79M
    if (state.msg->input_size < index)
  Branch (423:9): [True: 8.08k, False: 1.78M]
+
424
8.08k
        index = 0;
425
1.78M
    else
426
1.78M
    {
427
1.78M
        const auto begin = static_cast<size_t>(index);
428
1.78M
        const auto end = std::min(begin + 32, state.msg->input_size);
429
430
1.78M
        uint8_t data[32] = {};
431
49.4M
        for (size_t i = 0; i < (end - begin); 
++i47.6M
)
  Branch (431:28): [True: 47.6M, False: 1.78M]
+
432
47.6M
            data[i] = state.msg->input_data[begin + i];
433
434
1.78M
        index = intx::be::load<uint256>(data);
435
1.78M
    }
436
1.79M
}
437
438
inline void calldatasize(StackTop stack, ExecutionState& state) noexcept
439
185k
{
440
185k
    stack.push(state.msg->input_size);
441
185k
}
442
443
inline Result calldatacopy(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
444
127k
{
445
127k
    const auto& mem_index = stack.pop();
446
127k
    const auto& input_index = stack.pop();
447
127k
    const auto& size = stack.pop();
448
449
127k
    if (!check_memory(gas_left, state.memory, mem_index, size))
  Branch (449:9): [True: 108, False: 127k]
+
450
108
        return {EVMC_OUT_OF_GAS, gas_left};
451
452
127k
    auto dst = static_cast<size_t>(mem_index);
453
127k
    auto src = state.msg->input_size < input_index ? 
state.msg->input_size240
:
  Branch (453:16): [True: 240, False: 127k]
+
454
127k
                                                     
static_cast<size_t>(input_index)127k
;
455
127k
    auto s = static_cast<size_t>(size);
456
127k
    auto copy_size = std::min(s, state.msg->input_size - src);
457
458
127k
    if (const auto cost = copy_cost(s); (gas_left -= cost) < 0)
  Branch (458:41): [True: 6, False: 127k]
+
459
6
        return {EVMC_OUT_OF_GAS, gas_left};
460
461
127k
    if (copy_size > 0)
  Branch (461:9): [True: 119k, False: 8.00k]
+
462
119k
        std::memcpy(&state.memory[dst], &state.msg->input_data[src], copy_size);
463
464
127k
    if (s - copy_size > 0)
  Branch (464:9): [True: 7.30k, False: 120k]
+
465
7.30k
        std::memset(&state.memory[dst + copy_size], 0, s - copy_size);
466
467
127k
    return {EVMC_SUCCESS, gas_left};
468
127k
}
469
470
inline void codesize(StackTop stack, ExecutionState& state) noexcept
471
22.0k
{
472
22.0k
    stack.push(state.original_code.size());
473
22.0k
}
474
475
inline Result codecopy(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
476
11.3k
{
477
    // TODO: Similar to calldatacopy().
478
479
11.3k
    const auto& mem_index = stack.pop();
480
11.3k
    const auto& input_index = stack.pop();
481
11.3k
    const auto& size = stack.pop();
482
483
11.3k
    if (!check_memory(gas_left, state.memory, mem_index, size))
  Branch (483:9): [True: 108, False: 11.2k]
+
484
108
        return {EVMC_OUT_OF_GAS, gas_left};
485
486
11.2k
    const auto code_size = state.original_code.size();
487
11.2k
    const auto dst = static_cast<size_t>(mem_index);
488
11.2k
    const auto src = code_size < input_index ? 
code_size186
:
static_cast<size_t>(input_index)11.1k
;
  Branch (488:22): [True: 186, False: 11.1k]
+
489
11.2k
    const auto s = static_cast<size_t>(size);
490
11.2k
    const auto copy_size = std::min(s, code_size - src);
491
492
11.2k
    if (const auto cost = copy_cost(s); (gas_left -= cost) < 0)
  Branch (492:41): [True: 6, False: 11.2k]
+
493
6
        return {EVMC_OUT_OF_GAS, gas_left};
494
495
    // TODO: Add unit tests for each combination of conditions.
496
11.2k
    if (copy_size > 0)
  Branch (496:9): [True: 10.9k, False: 366]
+
497
10.9k
        std::memcpy(&state.memory[dst], &state.original_code[src], copy_size);
498
499
11.2k
    if (s - copy_size > 0)
  Branch (499:9): [True: 905, False: 10.3k]
+
500
905
        std::memset(&state.memory[dst + copy_size], 0, s - copy_size);
501
502
11.2k
    return {EVMC_SUCCESS, gas_left};
503
11.2k
}
504
505
506
inline void gasprice(StackTop stack, ExecutionState& state) noexcept
507
13.5k
{
508
13.5k
    stack.push(intx::be::load<uint256>(state.get_tx_context().tx_gas_price));
509
13.5k
}
510
511
inline void basefee(StackTop stack, ExecutionState& state) noexcept
512
564
{
513
564
    stack.push(intx::be::load<uint256>(state.get_tx_context().block_base_fee));
514
564
}
515
516
inline void blobhash(StackTop stack, ExecutionState& state) noexcept
517
2.87k
{
518
2.87k
    auto& index = stack.top();
519
2.87k
    const auto& tx = state.get_tx_context();
520
521
2.87k
    index = (index < tx.blob_hashes_count) ?
  Branch (521:13): [True: 2.07k, False: 797]
+
522
2.07k
                intx::be::load<uint256>(tx.blob_hashes[static_cast<size_t>(index)]) :
523
2.87k
                
0797
;
524
2.87k
}
525
526
inline void blobbasefee(StackTop stack, ExecutionState& state) noexcept
527
12.8k
{
528
12.8k
    stack.push(intx::be::load<uint256>(state.get_tx_context().blob_base_fee));
529
12.8k
}
530
531
inline Result extcodesize(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
532
471k
{
533
471k
    auto& x = stack.top();
534
471k
    const auto addr = intx::be::trunc<evmc::address>(x);
535
536
471k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(addr) == EVMC_ACCESS_COLD468k
)
  Branch (536:9): [True: 468k, False: 3.06k]
+  Branch (536:37): [True: 4.77k, False: 463k]
+
  MC/DC Decision Region (536:9) to (536:88)
+
+  Number of Conditions: 2
+     Condition C1 --> (536:9)
+     Condition C2 --> (536:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
537
4.77k
    {
538
4.77k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
  Branch (538:13): [True: 156, False: 4.62k]
+
539
156
            return {EVMC_OUT_OF_GAS, gas_left};
540
4.77k
    }
541
542
471k
    x = state.host.get_code_size(addr);
543
471k
    return {EVMC_SUCCESS, gas_left};
544
471k
}
545
546
inline Result extcodecopy(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
547
13.3k
{
548
13.3k
    const auto addr = intx::be::trunc<evmc::address>(stack.pop());
549
13.3k
    const auto& mem_index = stack.pop();
550
13.3k
    const auto& input_index = stack.pop();
551
13.3k
    const auto& size = stack.pop();
552
553
13.3k
    if (!check_memory(gas_left, state.memory, mem_index, size))
  Branch (553:9): [True: 96, False: 13.2k]
+
554
96
        return {EVMC_OUT_OF_GAS, gas_left};
555
556
13.2k
    const auto s = static_cast<size_t>(size);
557
13.2k
    if (const auto cost = copy_cost(s); (gas_left -= cost) < 0)
  Branch (557:41): [True: 18, False: 13.2k]
+
558
18
        return {EVMC_OUT_OF_GAS, gas_left};
559
560
13.2k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(addr) == EVMC_ACCESS_COLD11.2k
)
  Branch (560:9): [True: 11.2k, False: 1.92k]
+  Branch (560:37): [True: 1.05k, False: 10.2k]
+
  MC/DC Decision Region (560:9) to (560:88)
+
+  Number of Conditions: 2
+     Condition C1 --> (560:9)
+     Condition C2 --> (560:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
561
1.05k
    {
562
1.05k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
  Branch (562:13): [True: 6, False: 1.04k]
+
563
6
            return {EVMC_OUT_OF_GAS, gas_left};
564
1.05k
    }
565
566
13.2k
    if (s > 0)
  Branch (566:9): [True: 12.9k, False: 230]
+
567
12.9k
    {
568
12.9k
        const auto src =
569
12.9k
            (max_buffer_size < input_index) ? 
max_buffer_size66
:
static_cast<size_t>(input_index)12.9k
;
  Branch (569:13): [True: 66, False: 12.9k]
+
570
12.9k
        const auto dst = static_cast<size_t>(mem_index);
571
12.9k
        const auto num_bytes_copied = state.host.copy_code(addr, src, &state.memory[dst], s);
572
12.9k
        if (const auto num_bytes_to_clear = s - num_bytes_copied; num_bytes_to_clear > 0)
  Branch (572:67): [True: 1.48k, False: 11.5k]
+
573
1.48k
            std::memset(&state.memory[dst + num_bytes_copied], 0, num_bytes_to_clear);
574
12.9k
    }
575
576
13.2k
    return {EVMC_SUCCESS, gas_left};
577
13.2k
}
578
579
inline void returndatasize(StackTop stack, ExecutionState& state) noexcept
580
61.0k
{
581
61.0k
    stack.push(state.return_data.size());
582
61.0k
}
583
584
inline Result returndatacopy(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
585
9.78k
{
586
9.78k
    const auto& mem_index = stack.pop();
587
9.78k
    const auto& input_index = stack.pop();
588
9.78k
    const auto& size = stack.pop();
589
590
9.78k
    if (!check_memory(gas_left, state.memory, mem_index, size))
  Branch (590:9): [True: 204, False: 9.58k]
+
591
204
        return {EVMC_OUT_OF_GAS, gas_left};
592
593
9.58k
    auto dst = static_cast<size_t>(mem_index);
594
9.58k
    auto s = static_cast<size_t>(size);
595
596
9.58k
    if (state.return_data.size() < input_index)
  Branch (596:9): [True: 252, False: 9.33k]
+
597
252
        return {EVMC_INVALID_MEMORY_ACCESS, gas_left};
598
9.33k
    auto src = static_cast<size_t>(input_index);
599
600
9.33k
    if (src + s > state.return_data.size())
  Branch (600:9): [True: 234, False: 9.09k]
+
601
234
        return {EVMC_INVALID_MEMORY_ACCESS, gas_left};
602
603
9.09k
    if (const auto cost = copy_cost(s); (gas_left -= cost) < 0)
  Branch (603:41): [True: 6, False: 9.09k]
+
604
6
        return {EVMC_OUT_OF_GAS, gas_left};
605
606
9.09k
    if (s > 0)
  Branch (606:9): [True: 7.31k, False: 1.77k]
+
607
7.31k
        std::memcpy(&state.memory[dst], &state.return_data[src], s);
608
609
9.09k
    return {EVMC_SUCCESS, gas_left};
610
9.09k
}
611
612
inline Result extcodehash(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
613
3.42k
{
614
3.42k
    auto& x = stack.top();
615
3.42k
    const auto addr = intx::be::trunc<evmc::address>(x);
616
617
3.42k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(addr) == EVMC_ACCESS_COLD3.29k
)
  Branch (617:9): [True: 3.29k, False: 129]
+  Branch (617:37): [True: 815, False: 2.47k]
+
  MC/DC Decision Region (617:9) to (617:88)
+
+  Number of Conditions: 2
+     Condition C1 --> (617:9)
+     Condition C2 --> (617:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
618
815
    {
619
815
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
  Branch (619:13): [True: 6, False: 809]
+
620
6
            return {EVMC_OUT_OF_GAS, gas_left};
621
815
    }
622
623
3.41k
    x = intx::be::load<uint256>(state.host.get_code_hash(addr));
624
3.41k
    return {EVMC_SUCCESS, gas_left};
625
3.42k
}
626
627
628
inline void blockhash(StackTop stack, ExecutionState& state) noexcept
629
69.9k
{
630
69.9k
    auto& number = stack.top();
631
632
69.9k
    const auto upper_bound = state.get_tx_context().block_number;
633
69.9k
    const auto lower_bound = std::max(upper_bound - 256, decltype(upper_bound){0});
634
69.9k
    const auto n = static_cast<int64_t>(number);
635
69.9k
    const auto header =
636
69.9k
        (number < upper_bound && 
n >= lower_bound69.8k
) ?
state.host.get_block_hash(n)69.7k
:
evmc::bytes32{}214
;
  Branch (636:10): [True: 69.8k, False: 132]
+  Branch (636:34): [True: 69.7k, False: 82]
+
  MC/DC Decision Region (636:10) to (636:50)
+
+  Number of Conditions: 2
+     Condition C1 --> (636:10)
+     Condition C2 --> (636:34)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
637
69.9k
    number = intx::be::load<uint256>(header);
638
69.9k
}
639
640
inline void coinbase(StackTop stack, ExecutionState& state) noexcept
641
15.0k
{
642
15.0k
    stack.push(intx::be::load<uint256>(state.get_tx_context().block_coinbase));
643
15.0k
}
644
645
inline void timestamp(StackTop stack, ExecutionState& state) noexcept
646
151k
{
647
    // TODO: Add tests for negative timestamp?
648
151k
    stack.push(static_cast<uint64_t>(state.get_tx_context().block_timestamp));
649
151k
}
650
651
inline void number(StackTop stack, ExecutionState& state) noexcept
652
135k
{
653
    // TODO: Add tests for negative block number?
654
135k
    stack.push(static_cast<uint64_t>(state.get_tx_context().block_number));
655
135k
}
656
657
inline void prevrandao(StackTop stack, ExecutionState& state) noexcept
658
13.9k
{
659
13.9k
    stack.push(intx::be::load<uint256>(state.get_tx_context().block_prev_randao));
660
13.9k
}
661
662
inline void gaslimit(StackTop stack, ExecutionState& state) noexcept
663
15.3k
{
664
15.3k
    stack.push(static_cast<uint64_t>(state.get_tx_context().block_gas_limit));
665
15.3k
}
666
667
inline void chainid(StackTop stack, ExecutionState& state) noexcept
668
472
{
669
472
    stack.push(intx::be::load<uint256>(state.get_tx_context().chain_id));
670
472
}
671
672
inline void selfbalance(StackTop stack, ExecutionState& state) noexcept
673
1.61k
{
674
    // TODO: introduce selfbalance in EVMC?
675
1.61k
    stack.push(intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)));
676
1.61k
}
677
678
inline Result mload(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
679
12.2M
{
680
12.2M
    auto& index = stack.top();
681
682
12.2M
    if (!check_memory(gas_left, state.memory, index, 32))
  Branch (682:9): [True: 666, False: 12.2M]
+
683
666
        return {EVMC_OUT_OF_GAS, gas_left};
684
685
12.2M
    index = intx::be::unsafe::load<uint256>(&state.memory[static_cast<size_t>(index)]);
686
12.2M
    return {EVMC_SUCCESS, gas_left};
687
12.2M
}
688
689
inline Result mstore(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
690
8.64M
{
691
8.64M
    const auto& index = stack.pop();
692
8.64M
    const auto& value = stack.pop();
693
694
8.64M
    if (!check_memory(gas_left, state.memory, index, 32))
  Branch (694:9): [True: 698, False: 8.63M]
+
695
698
        return {EVMC_OUT_OF_GAS, gas_left};
696
697
8.63M
    intx::be::unsafe::store(&state.memory[static_cast<size_t>(index)], value);
698
8.63M
    return {EVMC_SUCCESS, gas_left};
699
8.64M
}
700
701
inline Result mstore8(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
702
158k
{
703
158k
    const auto& index = stack.pop();
704
158k
    const auto& value = stack.pop();
705
706
158k
    if (!check_memory(gas_left, state.memory, index, 1))
  Branch (706:9): [True: 612, False: 158k]
+
707
612
        return {EVMC_OUT_OF_GAS, gas_left};
708
709
158k
    state.memory[static_cast<size_t>(index)] = static_cast<uint8_t>(value);
710
158k
    return {EVMC_SUCCESS, gas_left};
711
158k
}
712
713
Result sload(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
714
715
Result sstore(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
716
717
/// Internal jump implementation for JUMP/JUMPI instructions.
718
inline code_iterator jump_impl(ExecutionState& state, const uint256& dst) noexcept
719
7.13M
{
720
7.13M
    const auto hi_part_is_nonzero = (dst[3] | dst[2] | dst[1]) != 0;
721
7.13M
    if (hi_part_is_nonzero || 
!state.analysis.baseline->check_jumpdest(dst[0])7.13M
) [[unlikely]]
  Branch (721:9): [True: 12, False: 7.13M]
+  Branch (721:31): [True: 3.09k, False: 7.13M]
+
  MC/DC Decision Region (721:9) to (721:79)
+
+  Number of Conditions: 2
+     Condition C1 --> (721:9)
+     Condition C2 --> (721:31)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
722
3.11k
    {
723
3.11k
        state.status = EVMC_BAD_JUMP_DESTINATION;
724
3.11k
        return nullptr;
725
3.11k
    }
726
727
7.13M
    return &state.analysis.baseline->executable_code()[static_cast<size_t>(dst[0])];
728
7.13M
}
729
730
/// JUMP instruction implementation using baseline::CodeAnalysis.
731
inline code_iterator jump(StackTop stack, ExecutionState& state, code_iterator /*pos*/) noexcept
732
5.50M
{
733
5.50M
    return jump_impl(state, stack.pop());
734
5.50M
}
735
736
/// JUMPI instruction implementation using baseline::CodeAnalysis.
737
inline code_iterator jumpi(StackTop stack, ExecutionState& state, code_iterator pos) noexcept
738
7.06M
{
739
7.06M
    const auto& dst = stack.pop();
740
7.06M
    const auto& cond = stack.pop();
741
7.06M
    return cond ? 
jump_impl(state, dst)1.63M
:
pos + 15.43M
;
  Branch (741:12): [True: 1.63M, False: 5.43M]
+
742
7.06M
}
743
744
inline code_iterator pc(StackTop stack, ExecutionState& state, code_iterator pos) noexcept
745
5.68M
{
746
5.68M
    stack.push(static_cast<uint64_t>(pos - state.analysis.baseline->executable_code().data()));
747
5.68M
    return pos + 1;
748
5.68M
}
749
750
inline void msize(StackTop stack, ExecutionState& state) noexcept
751
16.7k
{
752
16.7k
    stack.push(state.memory.size());
753
16.7k
}
754
755
inline Result gas(StackTop stack, int64_t gas_left, ExecutionState& /*state*/) noexcept
756
16.5M
{
757
16.5M
    stack.push(gas_left);
758
16.5M
    return {EVMC_SUCCESS, gas_left};
759
16.5M
}
760
761
inline void tload(StackTop stack, ExecutionState& state) noexcept
762
1.88M
{
763
1.88M
    auto& x = stack.top();
764
1.88M
    const auto key = intx::be::store<evmc::bytes32>(x);
765
1.88M
    const auto value = state.host.get_transient_storage(state.msg->recipient, key);
766
1.88M
    x = intx::be::load<uint256>(value);
767
1.88M
}
768
769
inline Result tstore(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
770
9.07M
{
771
9.07M
    if (state.in_static_mode())
  Branch (771:9): [True: 84, False: 9.07M]
+
772
84
        return {EVMC_STATIC_MODE_VIOLATION, 0};
773
774
9.07M
    const auto key = intx::be::store<evmc::bytes32>(stack.pop());
775
9.07M
    const auto value = intx::be::store<evmc::bytes32>(stack.pop());
776
9.07M
    state.host.set_transient_storage(state.msg->recipient, key, value);
777
9.07M
    return {EVMC_SUCCESS, gas_left};
778
9.07M
}
779
780
inline void push0(StackTop stack) noexcept
781
1.18M
{
782
1.18M
    stack.push({});
783
1.18M
}
784
785
786
template <size_t Len>
787
inline uint64_t load_partial_push_data(code_iterator pos) noexcept
788
520k
{
789
520k
    static_assert(Len > 4 && Len < 8);
790
791
    // It loads up to 3 additional bytes.
792
520k
    return intx::be::unsafe::load<uint64_t>(pos) >> (8 * (sizeof(uint64_t) - Len));
793
520k
}
unsigned long evmone::instr::core::load_partial_push_data<5ul>(unsigned char const*)
Line
Count
Source
788
168k
{
789
168k
    static_assert(Len > 4 && Len < 8);
790
791
    // It loads up to 3 additional bytes.
792
168k
    return intx::be::unsafe::load<uint64_t>(pos) >> (8 * (sizeof(uint64_t) - Len));
793
168k
}
unsigned long evmone::instr::core::load_partial_push_data<6ul>(unsigned char const*)
Line
Count
Source
788
146k
{
789
146k
    static_assert(Len > 4 && Len < 8);
790
791
    // It loads up to 3 additional bytes.
792
146k
    return intx::be::unsafe::load<uint64_t>(pos) >> (8 * (sizeof(uint64_t) - Len));
793
146k
}
unsigned long evmone::instr::core::load_partial_push_data<7ul>(unsigned char const*)
Line
Count
Source
788
206k
{
789
206k
    static_assert(Len > 4 && Len < 8);
790
791
    // It loads up to 3 additional bytes.
792
206k
    return intx::be::unsafe::load<uint64_t>(pos) >> (8 * (sizeof(uint64_t) - Len));
793
206k
}
794
795
template <>
796
inline uint64_t load_partial_push_data<1>(code_iterator pos) noexcept
797
79.8M
{
798
79.8M
    return pos[0];
799
79.8M
}
800
801
template <>
802
inline uint64_t load_partial_push_data<2>(code_iterator pos) noexcept
803
10.0M
{
804
10.0M
    return intx::be::unsafe::load<uint16_t>(pos);
805
10.0M
}
806
807
template <>
808
inline uint64_t load_partial_push_data<3>(code_iterator pos) noexcept
809
1.42M
{
810
    // It loads 1 additional byte.
811
1.42M
    return intx::be::unsafe::load<uint32_t>(pos) >> 8;
812
1.42M
}
813
814
template <>
815
inline uint64_t load_partial_push_data<4>(code_iterator pos) noexcept
816
2.29M
{
817
2.29M
    return intx::be::unsafe::load<uint32_t>(pos);
818
2.29M
}
819
820
/// PUSH instruction implementation.
821
/// @tparam Len The number of push data bytes, e.g. PUSH3 is push<3>.
822
///
823
/// It assumes that at least 32 bytes of data are available, so code padding is required.
824
template <size_t Len>
825
inline code_iterator push(StackTop stack, ExecutionState& /*state*/, code_iterator pos) noexcept
826
94.5M
{
827
94.5M
    using word_type = uint256::word_type;
828
94.5M
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
94.5M
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
94.5M
    stack.push({});
832
94.5M
    auto& r = stack.top();
833
94.5M
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
94.1M
    {
838
94.1M
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
94.1M
        pos += NUM_PARTIAL_BYTES;
840
94.1M
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
3.32M
    {
845
10.6M
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i7.30M
)
  Branch (845:28): [True: 47.2k, False: 47.2k]
+  Branch (845:28): [True: 41.9k, False: 41.9k]
+  Branch (845:28): [True: 30.9k, False: 30.9k]
+  Branch (845:28): [True: 28.9k, False: 28.9k]
+  Branch (845:28): [True: 40.5k, False: 40.5k]
+  Branch (845:28): [True: 38.8k, False: 38.8k]
+  Branch (845:28): [True: 34.1k, False: 34.1k]
+  Branch (845:28): [True: 29.1k, False: 29.1k]
+  Branch (845:28): [True: 97.5k, False: 48.7k]
+  Branch (845:28): [True: 42.7k, False: 21.3k]
+  Branch (845:28): [True: 132k, False: 66.3k]
+  Branch (845:28): [True: 63.4k, False: 31.7k]
+  Branch (845:28): [True: 4.21M, False: 2.10M]
+  Branch (845:28): [True: 90.2k, False: 45.1k]
+  Branch (845:28): [True: 74.9k, False: 37.4k]
+  Branch (845:28): [True: 76.8k, False: 38.4k]
+  Branch (845:28): [True: 95.7k, False: 31.9k]
+  Branch (845:28): [True: 90.7k, False: 30.2k]
+  Branch (845:28): [True: 123k, False: 41.0k]
+  Branch (845:28): [True: 126k, False: 42.1k]
+  Branch (845:28): [True: 86.4k, False: 28.8k]
+  Branch (845:28): [True: 103k, False: 34.4k]
+  Branch (845:28): [True: 75.1k, False: 25.0k]
+  Branch (845:28): [True: 276k, False: 92.0k]
+  Branch (845:28): [True: 1.25M, False: 312k]
+
846
7.30M
        {
847
7.30M
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
7.30M
            pos += sizeof(word_type);
849
7.30M
        }
850
3.32M
    }
851
852
94.5M
    return pos;
853
94.5M
}
unsigned char const* evmone::instr::core::push<1ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
79.7M
{
827
79.7M
    using word_type = uint256::word_type;
828
79.7M
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
79.7M
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
79.7M
    stack.push({});
832
79.7M
    auto& r = stack.top();
833
79.7M
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
79.7M
    {
838
79.7M
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
79.7M
        pos += NUM_PARTIAL_BYTES;
840
79.7M
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
    {
845
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
846
        {
847
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
            pos += sizeof(word_type);
849
        }
850
    }
851
852
79.7M
    return pos;
853
79.7M
}
unsigned char const* evmone::instr::core::push<2ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
9.93M
{
827
9.93M
    using word_type = uint256::word_type;
828
9.93M
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
9.93M
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
9.93M
    stack.push({});
832
9.93M
    auto& r = stack.top();
833
9.93M
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
9.93M
    {
838
9.93M
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
9.93M
        pos += NUM_PARTIAL_BYTES;
840
9.93M
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
    {
845
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
846
        {
847
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
            pos += sizeof(word_type);
849
        }
850
    }
851
852
9.93M
    return pos;
853
9.93M
}
unsigned char const* evmone::instr::core::push<3ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
1.31M
{
827
1.31M
    using word_type = uint256::word_type;
828
1.31M
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
1.31M
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
1.31M
    stack.push({});
832
1.31M
    auto& r = stack.top();
833
1.31M
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
1.31M
    {
838
1.31M
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
1.31M
        pos += NUM_PARTIAL_BYTES;
840
1.31M
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
    {
845
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
846
        {
847
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
            pos += sizeof(word_type);
849
        }
850
    }
851
852
1.31M
    return pos;
853
1.31M
}
unsigned char const* evmone::instr::core::push<4ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
120k
{
827
120k
    using word_type = uint256::word_type;
828
120k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
120k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
120k
    stack.push({});
832
120k
    auto& r = stack.top();
833
120k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
120k
    {
838
120k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
120k
        pos += NUM_PARTIAL_BYTES;
840
120k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
    {
845
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
846
        {
847
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
            pos += sizeof(word_type);
849
        }
850
    }
851
852
120k
    return pos;
853
120k
}
unsigned char const* evmone::instr::core::push<5ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
49.6k
{
827
49.6k
    using word_type = uint256::word_type;
828
49.6k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
49.6k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
49.6k
    stack.push({});
832
49.6k
    auto& r = stack.top();
833
49.6k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
49.6k
    {
838
49.6k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
49.6k
        pos += NUM_PARTIAL_BYTES;
840
49.6k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
    {
845
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
846
        {
847
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
            pos += sizeof(word_type);
849
        }
850
    }
851
852
49.6k
    return pos;
853
49.6k
}
unsigned char const* evmone::instr::core::push<6ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
49.8k
{
827
49.8k
    using word_type = uint256::word_type;
828
49.8k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
49.8k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
49.8k
    stack.push({});
832
49.8k
    auto& r = stack.top();
833
49.8k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
49.8k
    {
838
49.8k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
49.8k
        pos += NUM_PARTIAL_BYTES;
840
49.8k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
    {
845
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
846
        {
847
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
            pos += sizeof(word_type);
849
        }
850
    }
851
852
49.8k
    return pos;
853
49.8k
}
unsigned char const* evmone::instr::core::push<7ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
46.7k
{
827
46.7k
    using word_type = uint256::word_type;
828
46.7k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
46.7k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
46.7k
    stack.push({});
832
46.7k
    auto& r = stack.top();
833
46.7k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
46.7k
    {
838
46.7k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
46.7k
        pos += NUM_PARTIAL_BYTES;
840
46.7k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
    {
845
        for (size_t i = 0; i < NUM_FULL_WORDS; ++i)
846
        {
847
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
            pos += sizeof(word_type);
849
        }
850
    }
851
852
46.7k
    return pos;
853
46.7k
}
unsigned char const* evmone::instr::core::push<8ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
47.2k
{
827
47.2k
    using word_type = uint256::word_type;
828
47.2k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
47.2k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
47.2k
    stack.push({});
832
47.2k
    auto& r = stack.top();
833
47.2k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
    {
838
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
        pos += NUM_PARTIAL_BYTES;
840
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
47.2k
    {
845
94.4k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i47.2k
)
  Branch (845:28): [True: 47.2k, False: 47.2k]
+
846
47.2k
        {
847
47.2k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
47.2k
            pos += sizeof(word_type);
849
47.2k
        }
850
47.2k
    }
851
852
47.2k
    return pos;
853
47.2k
}
unsigned char const* evmone::instr::core::push<9ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
41.9k
{
827
41.9k
    using word_type = uint256::word_type;
828
41.9k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
41.9k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
41.9k
    stack.push({});
832
41.9k
    auto& r = stack.top();
833
41.9k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
41.9k
    {
838
41.9k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
41.9k
        pos += NUM_PARTIAL_BYTES;
840
41.9k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
41.9k
    {
845
83.9k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i41.9k
)
  Branch (845:28): [True: 41.9k, False: 41.9k]
+
846
41.9k
        {
847
41.9k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
41.9k
            pos += sizeof(word_type);
849
41.9k
        }
850
41.9k
    }
851
852
41.9k
    return pos;
853
41.9k
}
unsigned char const* evmone::instr::core::push<10ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
30.9k
{
827
30.9k
    using word_type = uint256::word_type;
828
30.9k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
30.9k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
30.9k
    stack.push({});
832
30.9k
    auto& r = stack.top();
833
30.9k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
30.9k
    {
838
30.9k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
30.9k
        pos += NUM_PARTIAL_BYTES;
840
30.9k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
30.9k
    {
845
61.8k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i30.9k
)
  Branch (845:28): [True: 30.9k, False: 30.9k]
+
846
30.9k
        {
847
30.9k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
30.9k
            pos += sizeof(word_type);
849
30.9k
        }
850
30.9k
    }
851
852
30.9k
    return pos;
853
30.9k
}
unsigned char const* evmone::instr::core::push<11ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
28.9k
{
827
28.9k
    using word_type = uint256::word_type;
828
28.9k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
28.9k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
28.9k
    stack.push({});
832
28.9k
    auto& r = stack.top();
833
28.9k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
28.9k
    {
838
28.9k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
28.9k
        pos += NUM_PARTIAL_BYTES;
840
28.9k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
28.9k
    {
845
57.8k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i28.9k
)
  Branch (845:28): [True: 28.9k, False: 28.9k]
+
846
28.9k
        {
847
28.9k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
28.9k
            pos += sizeof(word_type);
849
28.9k
        }
850
28.9k
    }
851
852
28.9k
    return pos;
853
28.9k
}
unsigned char const* evmone::instr::core::push<12ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
40.5k
{
827
40.5k
    using word_type = uint256::word_type;
828
40.5k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
40.5k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
40.5k
    stack.push({});
832
40.5k
    auto& r = stack.top();
833
40.5k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
40.5k
    {
838
40.5k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
40.5k
        pos += NUM_PARTIAL_BYTES;
840
40.5k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
40.5k
    {
845
81.1k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i40.5k
)
  Branch (845:28): [True: 40.5k, False: 40.5k]
+
846
40.5k
        {
847
40.5k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
40.5k
            pos += sizeof(word_type);
849
40.5k
        }
850
40.5k
    }
851
852
40.5k
    return pos;
853
40.5k
}
unsigned char const* evmone::instr::core::push<13ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
38.8k
{
827
38.8k
    using word_type = uint256::word_type;
828
38.8k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
38.8k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
38.8k
    stack.push({});
832
38.8k
    auto& r = stack.top();
833
38.8k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
38.8k
    {
838
38.8k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
38.8k
        pos += NUM_PARTIAL_BYTES;
840
38.8k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
38.8k
    {
845
77.7k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i38.8k
)
  Branch (845:28): [True: 38.8k, False: 38.8k]
+
846
38.8k
        {
847
38.8k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
38.8k
            pos += sizeof(word_type);
849
38.8k
        }
850
38.8k
    }
851
852
38.8k
    return pos;
853
38.8k
}
unsigned char const* evmone::instr::core::push<14ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
34.1k
{
827
34.1k
    using word_type = uint256::word_type;
828
34.1k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
34.1k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
34.1k
    stack.push({});
832
34.1k
    auto& r = stack.top();
833
34.1k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
34.1k
    {
838
34.1k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
34.1k
        pos += NUM_PARTIAL_BYTES;
840
34.1k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
34.1k
    {
845
68.3k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i34.1k
)
  Branch (845:28): [True: 34.1k, False: 34.1k]
+
846
34.1k
        {
847
34.1k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
34.1k
            pos += sizeof(word_type);
849
34.1k
        }
850
34.1k
    }
851
852
34.1k
    return pos;
853
34.1k
}
unsigned char const* evmone::instr::core::push<15ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
29.1k
{
827
29.1k
    using word_type = uint256::word_type;
828
29.1k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
29.1k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
29.1k
    stack.push({});
832
29.1k
    auto& r = stack.top();
833
29.1k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
29.1k
    {
838
29.1k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
29.1k
        pos += NUM_PARTIAL_BYTES;
840
29.1k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
29.1k
    {
845
58.2k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i29.1k
)
  Branch (845:28): [True: 29.1k, False: 29.1k]
+
846
29.1k
        {
847
29.1k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
29.1k
            pos += sizeof(word_type);
849
29.1k
        }
850
29.1k
    }
851
852
29.1k
    return pos;
853
29.1k
}
unsigned char const* evmone::instr::core::push<16ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
48.7k
{
827
48.7k
    using word_type = uint256::word_type;
828
48.7k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
48.7k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
48.7k
    stack.push({});
832
48.7k
    auto& r = stack.top();
833
48.7k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
    {
838
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
        pos += NUM_PARTIAL_BYTES;
840
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
48.7k
    {
845
146k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i97.5k
)
  Branch (845:28): [True: 97.5k, False: 48.7k]
+
846
97.5k
        {
847
97.5k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
97.5k
            pos += sizeof(word_type);
849
97.5k
        }
850
48.7k
    }
851
852
48.7k
    return pos;
853
48.7k
}
unsigned char const* evmone::instr::core::push<17ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
21.3k
{
827
21.3k
    using word_type = uint256::word_type;
828
21.3k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
21.3k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
21.3k
    stack.push({});
832
21.3k
    auto& r = stack.top();
833
21.3k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
21.3k
    {
838
21.3k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
21.3k
        pos += NUM_PARTIAL_BYTES;
840
21.3k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
21.3k
    {
845
64.0k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i42.7k
)
  Branch (845:28): [True: 42.7k, False: 21.3k]
+
846
42.7k
        {
847
42.7k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
42.7k
            pos += sizeof(word_type);
849
42.7k
        }
850
21.3k
    }
851
852
21.3k
    return pos;
853
21.3k
}
unsigned char const* evmone::instr::core::push<18ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
66.3k
{
827
66.3k
    using word_type = uint256::word_type;
828
66.3k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
66.3k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
66.3k
    stack.push({});
832
66.3k
    auto& r = stack.top();
833
66.3k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
66.3k
    {
838
66.3k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
66.3k
        pos += NUM_PARTIAL_BYTES;
840
66.3k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
66.3k
    {
845
198k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i132k
)
  Branch (845:28): [True: 132k, False: 66.3k]
+
846
132k
        {
847
132k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
132k
            pos += sizeof(word_type);
849
132k
        }
850
66.3k
    }
851
852
66.3k
    return pos;
853
66.3k
}
unsigned char const* evmone::instr::core::push<19ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
31.7k
{
827
31.7k
    using word_type = uint256::word_type;
828
31.7k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
31.7k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
31.7k
    stack.push({});
832
31.7k
    auto& r = stack.top();
833
31.7k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
31.7k
    {
838
31.7k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
31.7k
        pos += NUM_PARTIAL_BYTES;
840
31.7k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
31.7k
    {
845
95.1k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i63.4k
)
  Branch (845:28): [True: 63.4k, False: 31.7k]
+
846
63.4k
        {
847
63.4k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
63.4k
            pos += sizeof(word_type);
849
63.4k
        }
850
31.7k
    }
851
852
31.7k
    return pos;
853
31.7k
}
unsigned char const* evmone::instr::core::push<20ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
2.10M
{
827
2.10M
    using word_type = uint256::word_type;
828
2.10M
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
2.10M
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
2.10M
    stack.push({});
832
2.10M
    auto& r = stack.top();
833
2.10M
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
2.10M
    {
838
2.10M
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
2.10M
        pos += NUM_PARTIAL_BYTES;
840
2.10M
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
2.10M
    {
845
6.31M
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i4.21M
)
  Branch (845:28): [True: 4.21M, False: 2.10M]
+
846
4.21M
        {
847
4.21M
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
4.21M
            pos += sizeof(word_type);
849
4.21M
        }
850
2.10M
    }
851
852
2.10M
    return pos;
853
2.10M
}
unsigned char const* evmone::instr::core::push<21ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
45.1k
{
827
45.1k
    using word_type = uint256::word_type;
828
45.1k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
45.1k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
45.1k
    stack.push({});
832
45.1k
    auto& r = stack.top();
833
45.1k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
45.1k
    {
838
45.1k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
45.1k
        pos += NUM_PARTIAL_BYTES;
840
45.1k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
45.1k
    {
845
135k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i90.2k
)
  Branch (845:28): [True: 90.2k, False: 45.1k]
+
846
90.2k
        {
847
90.2k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
90.2k
            pos += sizeof(word_type);
849
90.2k
        }
850
45.1k
    }
851
852
45.1k
    return pos;
853
45.1k
}
unsigned char const* evmone::instr::core::push<22ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
37.4k
{
827
37.4k
    using word_type = uint256::word_type;
828
37.4k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
37.4k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
37.4k
    stack.push({});
832
37.4k
    auto& r = stack.top();
833
37.4k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
37.4k
    {
838
37.4k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
37.4k
        pos += NUM_PARTIAL_BYTES;
840
37.4k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
37.4k
    {
845
112k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i74.9k
)
  Branch (845:28): [True: 74.9k, False: 37.4k]
+
846
74.9k
        {
847
74.9k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
74.9k
            pos += sizeof(word_type);
849
74.9k
        }
850
37.4k
    }
851
852
37.4k
    return pos;
853
37.4k
}
unsigned char const* evmone::instr::core::push<23ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
38.4k
{
827
38.4k
    using word_type = uint256::word_type;
828
38.4k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
38.4k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
38.4k
    stack.push({});
832
38.4k
    auto& r = stack.top();
833
38.4k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
38.4k
    {
838
38.4k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
38.4k
        pos += NUM_PARTIAL_BYTES;
840
38.4k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
38.4k
    {
845
115k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i76.8k
)
  Branch (845:28): [True: 76.8k, False: 38.4k]
+
846
76.8k
        {
847
76.8k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
76.8k
            pos += sizeof(word_type);
849
76.8k
        }
850
38.4k
    }
851
852
38.4k
    return pos;
853
38.4k
}
unsigned char const* evmone::instr::core::push<24ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
31.9k
{
827
31.9k
    using word_type = uint256::word_type;
828
31.9k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
31.9k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
31.9k
    stack.push({});
832
31.9k
    auto& r = stack.top();
833
31.9k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
    {
838
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
        pos += NUM_PARTIAL_BYTES;
840
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
31.9k
    {
845
127k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i95.7k
)
  Branch (845:28): [True: 95.7k, False: 31.9k]
+
846
95.7k
        {
847
95.7k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
95.7k
            pos += sizeof(word_type);
849
95.7k
        }
850
31.9k
    }
851
852
31.9k
    return pos;
853
31.9k
}
unsigned char const* evmone::instr::core::push<25ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
30.2k
{
827
30.2k
    using word_type = uint256::word_type;
828
30.2k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
30.2k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
30.2k
    stack.push({});
832
30.2k
    auto& r = stack.top();
833
30.2k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
30.2k
    {
838
30.2k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
30.2k
        pos += NUM_PARTIAL_BYTES;
840
30.2k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
30.2k
    {
845
120k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i90.7k
)
  Branch (845:28): [True: 90.7k, False: 30.2k]
+
846
90.7k
        {
847
90.7k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
90.7k
            pos += sizeof(word_type);
849
90.7k
        }
850
30.2k
    }
851
852
30.2k
    return pos;
853
30.2k
}
unsigned char const* evmone::instr::core::push<26ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
41.0k
{
827
41.0k
    using word_type = uint256::word_type;
828
41.0k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
41.0k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
41.0k
    stack.push({});
832
41.0k
    auto& r = stack.top();
833
41.0k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
41.0k
    {
838
41.0k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
41.0k
        pos += NUM_PARTIAL_BYTES;
840
41.0k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
41.0k
    {
845
164k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i123k
)
  Branch (845:28): [True: 123k, False: 41.0k]
+
846
123k
        {
847
123k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
123k
            pos += sizeof(word_type);
849
123k
        }
850
41.0k
    }
851
852
41.0k
    return pos;
853
41.0k
}
unsigned char const* evmone::instr::core::push<27ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
42.1k
{
827
42.1k
    using word_type = uint256::word_type;
828
42.1k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
42.1k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
42.1k
    stack.push({});
832
42.1k
    auto& r = stack.top();
833
42.1k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
42.1k
    {
838
42.1k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
42.1k
        pos += NUM_PARTIAL_BYTES;
840
42.1k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
42.1k
    {
845
168k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i126k
)
  Branch (845:28): [True: 126k, False: 42.1k]
+
846
126k
        {
847
126k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
126k
            pos += sizeof(word_type);
849
126k
        }
850
42.1k
    }
851
852
42.1k
    return pos;
853
42.1k
}
unsigned char const* evmone::instr::core::push<28ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
28.8k
{
827
28.8k
    using word_type = uint256::word_type;
828
28.8k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
28.8k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
28.8k
    stack.push({});
832
28.8k
    auto& r = stack.top();
833
28.8k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
28.8k
    {
838
28.8k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
28.8k
        pos += NUM_PARTIAL_BYTES;
840
28.8k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
28.8k
    {
845
115k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i86.4k
)
  Branch (845:28): [True: 86.4k, False: 28.8k]
+
846
86.4k
        {
847
86.4k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
86.4k
            pos += sizeof(word_type);
849
86.4k
        }
850
28.8k
    }
851
852
28.8k
    return pos;
853
28.8k
}
unsigned char const* evmone::instr::core::push<29ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
34.4k
{
827
34.4k
    using word_type = uint256::word_type;
828
34.4k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
34.4k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
34.4k
    stack.push({});
832
34.4k
    auto& r = stack.top();
833
34.4k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
34.4k
    {
838
34.4k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
34.4k
        pos += NUM_PARTIAL_BYTES;
840
34.4k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
34.4k
    {
845
137k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i103k
)
  Branch (845:28): [True: 103k, False: 34.4k]
+
846
103k
        {
847
103k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
103k
            pos += sizeof(word_type);
849
103k
        }
850
34.4k
    }
851
852
34.4k
    return pos;
853
34.4k
}
unsigned char const* evmone::instr::core::push<30ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
25.0k
{
827
25.0k
    using word_type = uint256::word_type;
828
25.0k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
25.0k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
25.0k
    stack.push({});
832
25.0k
    auto& r = stack.top();
833
25.0k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
25.0k
    {
838
25.0k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
25.0k
        pos += NUM_PARTIAL_BYTES;
840
25.0k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
25.0k
    {
845
100k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i75.1k
)
  Branch (845:28): [True: 75.1k, False: 25.0k]
+
846
75.1k
        {
847
75.1k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
75.1k
            pos += sizeof(word_type);
849
75.1k
        }
850
25.0k
    }
851
852
25.0k
    return pos;
853
25.0k
}
unsigned char const* evmone::instr::core::push<31ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
92.0k
{
827
92.0k
    using word_type = uint256::word_type;
828
92.0k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
92.0k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
92.0k
    stack.push({});
832
92.0k
    auto& r = stack.top();
833
92.0k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
92.0k
    {
838
92.0k
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
92.0k
        pos += NUM_PARTIAL_BYTES;
840
92.0k
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
92.0k
    {
845
368k
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i276k
)
  Branch (845:28): [True: 276k, False: 92.0k]
+
846
276k
        {
847
276k
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
276k
            pos += sizeof(word_type);
849
276k
        }
850
92.0k
    }
851
852
92.0k
    return pos;
853
92.0k
}
unsigned char const* evmone::instr::core::push<32ul>(evmone::StackTop, evmone::ExecutionState&, unsigned char const*)
Line
Count
Source
826
312k
{
827
312k
    using word_type = uint256::word_type;
828
312k
    static constexpr auto NUM_FULL_WORDS = Len / sizeof(word_type);
829
312k
    static constexpr auto NUM_PARTIAL_BYTES = Len % sizeof(word_type);
830
831
312k
    stack.push({});
832
312k
    auto& r = stack.top();
833
312k
    pos += 1;  // Skip the opcode.
834
835
    // Load the top partial word.
836
    if constexpr (NUM_PARTIAL_BYTES != 0)
837
    {
838
        r[NUM_FULL_WORDS] = load_partial_push_data<NUM_PARTIAL_BYTES>(pos);
839
        pos += NUM_PARTIAL_BYTES;
840
    }
841
842
    // Load full words.
843
    if constexpr (NUM_FULL_WORDS != 0)
844
312k
    {
845
1.56M
        for (size_t i = 0; i < NUM_FULL_WORDS; 
++i1.25M
)
  Branch (845:28): [True: 1.25M, False: 312k]
+
846
1.25M
        {
847
1.25M
            r[NUM_FULL_WORDS - 1 - i] = intx::be::unsafe::load<word_type>(pos);
848
1.25M
            pos += sizeof(word_type);
849
1.25M
        }
850
312k
    }
851
852
312k
    return pos;
853
312k
}
854
855
/// DUP instruction implementation.
856
/// @tparam N  The number as in the instruction definition, e.g. DUP3 is dup<3>.
857
template <int N>
858
inline void dup(StackTop stack) noexcept
859
8.89M
{
860
8.89M
    static_assert(N >= 1 && N <= 16);
861
8.89M
    stack.push(stack[N - 1]);
862
8.89M
}
void evmone::instr::core::dup<1>(evmone::StackTop)
Line
Count
Source
859
5.86M
{
860
5.86M
    static_assert(N >= 1 && N <= 16);
861
5.86M
    stack.push(stack[N - 1]);
862
5.86M
}
void evmone::instr::core::dup<2>(evmone::StackTop)
Line
Count
Source
859
1.23M
{
860
1.23M
    static_assert(N >= 1 && N <= 16);
861
1.23M
    stack.push(stack[N - 1]);
862
1.23M
}
void evmone::instr::core::dup<3>(evmone::StackTop)
Line
Count
Source
859
619k
{
860
619k
    static_assert(N >= 1 && N <= 16);
861
619k
    stack.push(stack[N - 1]);
862
619k
}
void evmone::instr::core::dup<4>(evmone::StackTop)
Line
Count
Source
859
282k
{
860
282k
    static_assert(N >= 1 && N <= 16);
861
282k
    stack.push(stack[N - 1]);
862
282k
}
void evmone::instr::core::dup<5>(evmone::StackTop)
Line
Count
Source
859
123k
{
860
123k
    static_assert(N >= 1 && N <= 16);
861
123k
    stack.push(stack[N - 1]);
862
123k
}
void evmone::instr::core::dup<6>(evmone::StackTop)
Line
Count
Source
859
63.3k
{
860
63.3k
    static_assert(N >= 1 && N <= 16);
861
63.3k
    stack.push(stack[N - 1]);
862
63.3k
}
void evmone::instr::core::dup<7>(evmone::StackTop)
Line
Count
Source
859
52.4k
{
860
52.4k
    static_assert(N >= 1 && N <= 16);
861
52.4k
    stack.push(stack[N - 1]);
862
52.4k
}
void evmone::instr::core::dup<8>(evmone::StackTop)
Line
Count
Source
859
443k
{
860
443k
    static_assert(N >= 1 && N <= 16);
861
443k
    stack.push(stack[N - 1]);
862
443k
}
void evmone::instr::core::dup<9>(evmone::StackTop)
Line
Count
Source
859
26.6k
{
860
26.6k
    static_assert(N >= 1 && N <= 16);
861
26.6k
    stack.push(stack[N - 1]);
862
26.6k
}
void evmone::instr::core::dup<10>(evmone::StackTop)
Line
Count
Source
859
52.5k
{
860
52.5k
    static_assert(N >= 1 && N <= 16);
861
52.5k
    stack.push(stack[N - 1]);
862
52.5k
}
void evmone::instr::core::dup<11>(evmone::StackTop)
Line
Count
Source
859
24.6k
{
860
24.6k
    static_assert(N >= 1 && N <= 16);
861
24.6k
    stack.push(stack[N - 1]);
862
24.6k
}
void evmone::instr::core::dup<12>(evmone::StackTop)
Line
Count
Source
859
16.5k
{
860
16.5k
    static_assert(N >= 1 && N <= 16);
861
16.5k
    stack.push(stack[N - 1]);
862
16.5k
}
void evmone::instr::core::dup<13>(evmone::StackTop)
Line
Count
Source
859
30.1k
{
860
30.1k
    static_assert(N >= 1 && N <= 16);
861
30.1k
    stack.push(stack[N - 1]);
862
30.1k
}
void evmone::instr::core::dup<14>(evmone::StackTop)
Line
Count
Source
859
15.0k
{
860
15.0k
    static_assert(N >= 1 && N <= 16);
861
15.0k
    stack.push(stack[N - 1]);
862
15.0k
}
void evmone::instr::core::dup<15>(evmone::StackTop)
Line
Count
Source
859
25.0k
{
860
25.0k
    static_assert(N >= 1 && N <= 16);
861
25.0k
    stack.push(stack[N - 1]);
862
25.0k
}
void evmone::instr::core::dup<16>(evmone::StackTop)
Line
Count
Source
859
17.2k
{
860
17.2k
    static_assert(N >= 1 && N <= 16);
861
17.2k
    stack.push(stack[N - 1]);
862
17.2k
}
863
864
/// SWAP instruction implementation.
865
/// @tparam N  The number as in the instruction definition, e.g. SWAP3 is swap<3>.
866
template <int N>
867
inline void swap(StackTop stack) noexcept
868
1.55M
{
869
1.55M
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
1.55M
    auto& a = stack[N];
876
1.55M
    auto& t = stack.top();
877
1.55M
    auto t0 = t[0];
878
1.55M
    auto t1 = t[1];
879
1.55M
    auto t2 = t[2];
880
1.55M
    auto t3 = t[3];
881
1.55M
    t = a;
882
1.55M
    a[0] = t0;
883
1.55M
    a[1] = t1;
884
1.55M
    a[2] = t2;
885
1.55M
    a[3] = t3;
886
1.55M
}
void evmone::instr::core::swap<1>(evmone::StackTop)
Line
Count
Source
868
717k
{
869
717k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
717k
    auto& a = stack[N];
876
717k
    auto& t = stack.top();
877
717k
    auto t0 = t[0];
878
717k
    auto t1 = t[1];
879
717k
    auto t2 = t[2];
880
717k
    auto t3 = t[3];
881
717k
    t = a;
882
717k
    a[0] = t0;
883
717k
    a[1] = t1;
884
717k
    a[2] = t2;
885
717k
    a[3] = t3;
886
717k
}
void evmone::instr::core::swap<2>(evmone::StackTop)
Line
Count
Source
868
395k
{
869
395k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
395k
    auto& a = stack[N];
876
395k
    auto& t = stack.top();
877
395k
    auto t0 = t[0];
878
395k
    auto t1 = t[1];
879
395k
    auto t2 = t[2];
880
395k
    auto t3 = t[3];
881
395k
    t = a;
882
395k
    a[0] = t0;
883
395k
    a[1] = t1;
884
395k
    a[2] = t2;
885
395k
    a[3] = t3;
886
395k
}
void evmone::instr::core::swap<3>(evmone::StackTop)
Line
Count
Source
868
268k
{
869
268k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
268k
    auto& a = stack[N];
876
268k
    auto& t = stack.top();
877
268k
    auto t0 = t[0];
878
268k
    auto t1 = t[1];
879
268k
    auto t2 = t[2];
880
268k
    auto t3 = t[3];
881
268k
    t = a;
882
268k
    a[0] = t0;
883
268k
    a[1] = t1;
884
268k
    a[2] = t2;
885
268k
    a[3] = t3;
886
268k
}
void evmone::instr::core::swap<4>(evmone::StackTop)
Line
Count
Source
868
84.8k
{
869
84.8k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
84.8k
    auto& a = stack[N];
876
84.8k
    auto& t = stack.top();
877
84.8k
    auto t0 = t[0];
878
84.8k
    auto t1 = t[1];
879
84.8k
    auto t2 = t[2];
880
84.8k
    auto t3 = t[3];
881
84.8k
    t = a;
882
84.8k
    a[0] = t0;
883
84.8k
    a[1] = t1;
884
84.8k
    a[2] = t2;
885
84.8k
    a[3] = t3;
886
84.8k
}
void evmone::instr::core::swap<5>(evmone::StackTop)
Line
Count
Source
868
35.8k
{
869
35.8k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
35.8k
    auto& a = stack[N];
876
35.8k
    auto& t = stack.top();
877
35.8k
    auto t0 = t[0];
878
35.8k
    auto t1 = t[1];
879
35.8k
    auto t2 = t[2];
880
35.8k
    auto t3 = t[3];
881
35.8k
    t = a;
882
35.8k
    a[0] = t0;
883
35.8k
    a[1] = t1;
884
35.8k
    a[2] = t2;
885
35.8k
    a[3] = t3;
886
35.8k
}
void evmone::instr::core::swap<6>(evmone::StackTop)
Line
Count
Source
868
8.13k
{
869
8.13k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
8.13k
    auto& a = stack[N];
876
8.13k
    auto& t = stack.top();
877
8.13k
    auto t0 = t[0];
878
8.13k
    auto t1 = t[1];
879
8.13k
    auto t2 = t[2];
880
8.13k
    auto t3 = t[3];
881
8.13k
    t = a;
882
8.13k
    a[0] = t0;
883
8.13k
    a[1] = t1;
884
8.13k
    a[2] = t2;
885
8.13k
    a[3] = t3;
886
8.13k
}
void evmone::instr::core::swap<7>(evmone::StackTop)
Line
Count
Source
868
3.89k
{
869
3.89k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
3.89k
    auto& a = stack[N];
876
3.89k
    auto& t = stack.top();
877
3.89k
    auto t0 = t[0];
878
3.89k
    auto t1 = t[1];
879
3.89k
    auto t2 = t[2];
880
3.89k
    auto t3 = t[3];
881
3.89k
    t = a;
882
3.89k
    a[0] = t0;
883
3.89k
    a[1] = t1;
884
3.89k
    a[2] = t2;
885
3.89k
    a[3] = t3;
886
3.89k
}
void evmone::instr::core::swap<8>(evmone::StackTop)
Line
Count
Source
868
7.81k
{
869
7.81k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
7.81k
    auto& a = stack[N];
876
7.81k
    auto& t = stack.top();
877
7.81k
    auto t0 = t[0];
878
7.81k
    auto t1 = t[1];
879
7.81k
    auto t2 = t[2];
880
7.81k
    auto t3 = t[3];
881
7.81k
    t = a;
882
7.81k
    a[0] = t0;
883
7.81k
    a[1] = t1;
884
7.81k
    a[2] = t2;
885
7.81k
    a[3] = t3;
886
7.81k
}
void evmone::instr::core::swap<9>(evmone::StackTop)
Line
Count
Source
868
5.94k
{
869
5.94k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
5.94k
    auto& a = stack[N];
876
5.94k
    auto& t = stack.top();
877
5.94k
    auto t0 = t[0];
878
5.94k
    auto t1 = t[1];
879
5.94k
    auto t2 = t[2];
880
5.94k
    auto t3 = t[3];
881
5.94k
    t = a;
882
5.94k
    a[0] = t0;
883
5.94k
    a[1] = t1;
884
5.94k
    a[2] = t2;
885
5.94k
    a[3] = t3;
886
5.94k
}
void evmone::instr::core::swap<10>(evmone::StackTop)
Line
Count
Source
868
2.32k
{
869
2.32k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
2.32k
    auto& a = stack[N];
876
2.32k
    auto& t = stack.top();
877
2.32k
    auto t0 = t[0];
878
2.32k
    auto t1 = t[1];
879
2.32k
    auto t2 = t[2];
880
2.32k
    auto t3 = t[3];
881
2.32k
    t = a;
882
2.32k
    a[0] = t0;
883
2.32k
    a[1] = t1;
884
2.32k
    a[2] = t2;
885
2.32k
    a[3] = t3;
886
2.32k
}
void evmone::instr::core::swap<11>(evmone::StackTop)
Line
Count
Source
868
2.75k
{
869
2.75k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
2.75k
    auto& a = stack[N];
876
2.75k
    auto& t = stack.top();
877
2.75k
    auto t0 = t[0];
878
2.75k
    auto t1 = t[1];
879
2.75k
    auto t2 = t[2];
880
2.75k
    auto t3 = t[3];
881
2.75k
    t = a;
882
2.75k
    a[0] = t0;
883
2.75k
    a[1] = t1;
884
2.75k
    a[2] = t2;
885
2.75k
    a[3] = t3;
886
2.75k
}
void evmone::instr::core::swap<12>(evmone::StackTop)
Line
Count
Source
868
6.81k
{
869
6.81k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
6.81k
    auto& a = stack[N];
876
6.81k
    auto& t = stack.top();
877
6.81k
    auto t0 = t[0];
878
6.81k
    auto t1 = t[1];
879
6.81k
    auto t2 = t[2];
880
6.81k
    auto t3 = t[3];
881
6.81k
    t = a;
882
6.81k
    a[0] = t0;
883
6.81k
    a[1] = t1;
884
6.81k
    a[2] = t2;
885
6.81k
    a[3] = t3;
886
6.81k
}
void evmone::instr::core::swap<13>(evmone::StackTop)
Line
Count
Source
868
4.26k
{
869
4.26k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
4.26k
    auto& a = stack[N];
876
4.26k
    auto& t = stack.top();
877
4.26k
    auto t0 = t[0];
878
4.26k
    auto t1 = t[1];
879
4.26k
    auto t2 = t[2];
880
4.26k
    auto t3 = t[3];
881
4.26k
    t = a;
882
4.26k
    a[0] = t0;
883
4.26k
    a[1] = t1;
884
4.26k
    a[2] = t2;
885
4.26k
    a[3] = t3;
886
4.26k
}
void evmone::instr::core::swap<14>(evmone::StackTop)
Line
Count
Source
868
3.59k
{
869
3.59k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
3.59k
    auto& a = stack[N];
876
3.59k
    auto& t = stack.top();
877
3.59k
    auto t0 = t[0];
878
3.59k
    auto t1 = t[1];
879
3.59k
    auto t2 = t[2];
880
3.59k
    auto t3 = t[3];
881
3.59k
    t = a;
882
3.59k
    a[0] = t0;
883
3.59k
    a[1] = t1;
884
3.59k
    a[2] = t2;
885
3.59k
    a[3] = t3;
886
3.59k
}
void evmone::instr::core::swap<15>(evmone::StackTop)
Line
Count
Source
868
2.43k
{
869
2.43k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
2.43k
    auto& a = stack[N];
876
2.43k
    auto& t = stack.top();
877
2.43k
    auto t0 = t[0];
878
2.43k
    auto t1 = t[1];
879
2.43k
    auto t2 = t[2];
880
2.43k
    auto t3 = t[3];
881
2.43k
    t = a;
882
2.43k
    a[0] = t0;
883
2.43k
    a[1] = t1;
884
2.43k
    a[2] = t2;
885
2.43k
    a[3] = t3;
886
2.43k
}
void evmone::instr::core::swap<16>(evmone::StackTop)
Line
Count
Source
868
2.44k
{
869
2.44k
    static_assert(N >= 1 && N <= 16);
870
871
    // The simple std::swap(stack.top(), stack[N]) is not used to workaround
872
    // clang missed optimization: https://github.com/llvm/llvm-project/issues/59116
873
    // TODO(clang): Check if #59116 bug fix has been released.
874
875
2.44k
    auto& a = stack[N];
876
2.44k
    auto& t = stack.top();
877
2.44k
    auto t0 = t[0];
878
2.44k
    auto t1 = t[1];
879
2.44k
    auto t2 = t[2];
880
2.44k
    auto t3 = t[3];
881
2.44k
    t = a;
882
2.44k
    a[0] = t0;
883
2.44k
    a[1] = t1;
884
2.44k
    a[2] = t2;
885
2.44k
    a[3] = t3;
886
2.44k
}
887
888
inline Result mcopy(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
889
1.22k
{
890
1.22k
    const auto& dst_u256 = stack.pop();
891
1.22k
    const auto& src_u256 = stack.pop();
892
1.22k
    const auto& size_u256 = stack.pop();
893
894
1.22k
    if (!check_memory(gas_left, state.memory, std::max(dst_u256, src_u256), size_u256))
  Branch (894:9): [True: 108, False: 1.11k]
+
895
108
        return {EVMC_OUT_OF_GAS, gas_left};
896
897
1.11k
    const auto dst = static_cast<size_t>(dst_u256);
898
1.11k
    const auto src = static_cast<size_t>(src_u256);
899
1.11k
    const auto size = static_cast<size_t>(size_u256);
900
901
1.11k
    if (const auto cost = copy_cost(size); (gas_left -= cost) < 0)
  Branch (901:44): [True: 72, False: 1.04k]
+
902
72
        return {EVMC_OUT_OF_GAS, gas_left};
903
904
1.04k
    if (size > 0)
  Branch (904:9): [True: 891, False: 150]
+
905
891
        std::memmove(&state.memory[dst], &state.memory[src], size);
906
907
1.04k
    return {EVMC_SUCCESS, gas_left};
908
1.11k
}
909
910
template <size_t NumTopics>
911
inline Result log(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
912
31.2k
{
913
31.2k
    static_assert(NumTopics <= 4);
914
915
31.2k
    if (state.in_static_mode())
  Branch (915:9): [True: 171, False: 9.55k]
+
  Branch (915:9): [True: 36, False: 8.42k]
+
  Branch (915:9): [True: 6, False: 4.91k]
+
  Branch (915:9): [True: 6, False: 7.10k]
+
  Branch (915:9): [True: 6, False: 1.06k]
+
916
225
        return {EVMC_STATIC_MODE_VIOLATION, 0};
917
918
31.0k
    const auto& offset = stack.pop();
919
31.0k
    const auto& size = stack.pop();
920
921
31.0k
    if (!check_memory(gas_left, state.memory, offset, size))
  Branch (921:9): [True: 90, False: 9.46k]
+
  Branch (921:9): [True: 112, False: 8.31k]
+
  Branch (921:9): [True: 114, False: 4.80k]
+
  Branch (921:9): [True: 108, False: 6.99k]
+
  Branch (921:9): [True: 112, False: 954]
+
922
536
        return {EVMC_OUT_OF_GAS, gas_left};
923
924
30.5k
    const auto o = static_cast<size_t>(offset);
925
30.5k
    const auto s = static_cast<size_t>(size);
926
927
30.5k
    const auto cost = int64_t(s) * 8;
928
30.5k
    if ((gas_left -= cost) < 0)
  Branch (928:9): [True: 62, False: 9.39k]
+
  Branch (928:9): [True: 60, False: 8.25k]
+
  Branch (928:9): [True: 56, False: 4.74k]
+
  Branch (928:9): [True: 60, False: 6.93k]
+
  Branch (928:9): [True: 56, False: 898]
+
929
294
        return {EVMC_OUT_OF_GAS, gas_left};
930
931
30.2k
    std::array<evmc::bytes32, NumTopics> topics;  // NOLINT(cppcoreguidelines-pro-type-member-init)
932
    if constexpr (NumTopics > 0)
933
20.8k
    {
934
20.8k
        for (auto& topic : topics)
  Branch (934:26): [True: 8.25k, False: 8.25k]
+
  Branch (934:26): [True: 9.48k, False: 4.74k]
+
  Branch (934:26): [True: 20.8k, False: 6.93k]
+
  Branch (934:26): [True: 3.59k, False: 898]
+
935
42.1k
            topic = intx::be::store<evmc::bytes32>(stack.pop());
936
20.8k
    }
937
938
30.2k
    const auto data = s != 0 ? 
&state.memory[o]29.5k
:
nullptr724
;
  Branch (938:23): [True: 9.26k, False: 138]
+
  Branch (938:23): [True: 8.10k, False: 144]
+
  Branch (938:23): [True: 4.57k, False: 168]
+
  Branch (938:23): [True: 6.79k, False: 142]
+
  Branch (938:23): [True: 766, False: 132]
+
939
30.2k
    state.host.emit_log(state.msg->recipient, data, s, topics.data(), NumTopics);
940
30.2k
    return {EVMC_SUCCESS, gas_left};
941
30.5k
}
evmone::Result evmone::instr::core::log<0ul>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
912
9.72k
{
913
9.72k
    static_assert(NumTopics <= 4);
914
915
9.72k
    if (state.in_static_mode())
  Branch (915:9): [True: 171, False: 9.55k]
+
916
171
        return {EVMC_STATIC_MODE_VIOLATION, 0};
917
918
9.55k
    const auto& offset = stack.pop();
919
9.55k
    const auto& size = stack.pop();
920
921
9.55k
    if (!check_memory(gas_left, state.memory, offset, size))
  Branch (921:9): [True: 90, False: 9.46k]
+
922
90
        return {EVMC_OUT_OF_GAS, gas_left};
923
924
9.46k
    const auto o = static_cast<size_t>(offset);
925
9.46k
    const auto s = static_cast<size_t>(size);
926
927
9.46k
    const auto cost = int64_t(s) * 8;
928
9.46k
    if ((gas_left -= cost) < 0)
  Branch (928:9): [True: 62, False: 9.39k]
+
929
62
        return {EVMC_OUT_OF_GAS, gas_left};
930
931
9.39k
    std::array<evmc::bytes32, NumTopics> topics;  // NOLINT(cppcoreguidelines-pro-type-member-init)
932
    if constexpr (NumTopics > 0)
933
    {
934
        for (auto& topic : topics)
935
            topic = intx::be::store<evmc::bytes32>(stack.pop());
936
    }
937
938
9.39k
    const auto data = s != 0 ? 
&state.memory[o]9.26k
:
nullptr138
;
  Branch (938:23): [True: 9.26k, False: 138]
+
939
9.39k
    state.host.emit_log(state.msg->recipient, data, s, topics.data(), NumTopics);
940
9.39k
    return {EVMC_SUCCESS, gas_left};
941
9.46k
}
evmone::Result evmone::instr::core::log<1ul>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
912
8.46k
{
913
8.46k
    static_assert(NumTopics <= 4);
914
915
8.46k
    if (state.in_static_mode())
  Branch (915:9): [True: 36, False: 8.42k]
+
916
36
        return {EVMC_STATIC_MODE_VIOLATION, 0};
917
918
8.42k
    const auto& offset = stack.pop();
919
8.42k
    const auto& size = stack.pop();
920
921
8.42k
    if (!check_memory(gas_left, state.memory, offset, size))
  Branch (921:9): [True: 112, False: 8.31k]
+
922
112
        return {EVMC_OUT_OF_GAS, gas_left};
923
924
8.31k
    const auto o = static_cast<size_t>(offset);
925
8.31k
    const auto s = static_cast<size_t>(size);
926
927
8.31k
    const auto cost = int64_t(s) * 8;
928
8.31k
    if ((gas_left -= cost) < 0)
  Branch (928:9): [True: 60, False: 8.25k]
+
929
60
        return {EVMC_OUT_OF_GAS, gas_left};
930
931
8.25k
    std::array<evmc::bytes32, NumTopics> topics;  // NOLINT(cppcoreguidelines-pro-type-member-init)
932
    if constexpr (NumTopics > 0)
933
8.25k
    {
934
8.25k
        for (auto& topic : topics)
  Branch (934:26): [True: 8.25k, False: 8.25k]
+
935
8.25k
            topic = intx::be::store<evmc::bytes32>(stack.pop());
936
8.25k
    }
937
938
8.25k
    const auto data = s != 0 ? 
&state.memory[o]8.10k
:
nullptr144
;
  Branch (938:23): [True: 8.10k, False: 144]
+
939
8.25k
    state.host.emit_log(state.msg->recipient, data, s, topics.data(), NumTopics);
940
8.25k
    return {EVMC_SUCCESS, gas_left};
941
8.31k
}
evmone::Result evmone::instr::core::log<2ul>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
912
4.92k
{
913
4.92k
    static_assert(NumTopics <= 4);
914
915
4.92k
    if (state.in_static_mode())
  Branch (915:9): [True: 6, False: 4.91k]
+
916
6
        return {EVMC_STATIC_MODE_VIOLATION, 0};
917
918
4.91k
    const auto& offset = stack.pop();
919
4.91k
    const auto& size = stack.pop();
920
921
4.91k
    if (!check_memory(gas_left, state.memory, offset, size))
  Branch (921:9): [True: 114, False: 4.80k]
+
922
114
        return {EVMC_OUT_OF_GAS, gas_left};
923
924
4.80k
    const auto o = static_cast<size_t>(offset);
925
4.80k
    const auto s = static_cast<size_t>(size);
926
927
4.80k
    const auto cost = int64_t(s) * 8;
928
4.80k
    if ((gas_left -= cost) < 0)
  Branch (928:9): [True: 56, False: 4.74k]
+
929
56
        return {EVMC_OUT_OF_GAS, gas_left};
930
931
4.74k
    std::array<evmc::bytes32, NumTopics> topics;  // NOLINT(cppcoreguidelines-pro-type-member-init)
932
    if constexpr (NumTopics > 0)
933
4.74k
    {
934
4.74k
        for (auto& topic : topics)
  Branch (934:26): [True: 9.48k, False: 4.74k]
+
935
9.48k
            topic = intx::be::store<evmc::bytes32>(stack.pop());
936
4.74k
    }
937
938
4.74k
    const auto data = s != 0 ? 
&state.memory[o]4.57k
:
nullptr168
;
  Branch (938:23): [True: 4.57k, False: 168]
+
939
4.74k
    state.host.emit_log(state.msg->recipient, data, s, topics.data(), NumTopics);
940
4.74k
    return {EVMC_SUCCESS, gas_left};
941
4.80k
}
evmone::Result evmone::instr::core::log<3ul>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
912
7.10k
{
913
7.10k
    static_assert(NumTopics <= 4);
914
915
7.10k
    if (state.in_static_mode())
  Branch (915:9): [True: 6, False: 7.10k]
+
916
6
        return {EVMC_STATIC_MODE_VIOLATION, 0};
917
918
7.10k
    const auto& offset = stack.pop();
919
7.10k
    const auto& size = stack.pop();
920
921
7.10k
    if (!check_memory(gas_left, state.memory, offset, size))
  Branch (921:9): [True: 108, False: 6.99k]
+
922
108
        return {EVMC_OUT_OF_GAS, gas_left};
923
924
6.99k
    const auto o = static_cast<size_t>(offset);
925
6.99k
    const auto s = static_cast<size_t>(size);
926
927
6.99k
    const auto cost = int64_t(s) * 8;
928
6.99k
    if ((gas_left -= cost) < 0)
  Branch (928:9): [True: 60, False: 6.93k]
+
929
60
        return {EVMC_OUT_OF_GAS, gas_left};
930
931
6.93k
    std::array<evmc::bytes32, NumTopics> topics;  // NOLINT(cppcoreguidelines-pro-type-member-init)
932
    if constexpr (NumTopics > 0)
933
6.93k
    {
934
6.93k
        for (auto& topic : topics)
  Branch (934:26): [True: 20.8k, False: 6.93k]
+
935
20.8k
            topic = intx::be::store<evmc::bytes32>(stack.pop());
936
6.93k
    }
937
938
6.93k
    const auto data = s != 0 ? 
&state.memory[o]6.79k
:
nullptr142
;
  Branch (938:23): [True: 6.79k, False: 142]
+
939
6.93k
    state.host.emit_log(state.msg->recipient, data, s, topics.data(), NumTopics);
940
6.93k
    return {EVMC_SUCCESS, gas_left};
941
6.99k
}
evmone::Result evmone::instr::core::log<4ul>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
912
1.07k
{
913
1.07k
    static_assert(NumTopics <= 4);
914
915
1.07k
    if (state.in_static_mode())
  Branch (915:9): [True: 6, False: 1.06k]
+
916
6
        return {EVMC_STATIC_MODE_VIOLATION, 0};
917
918
1.06k
    const auto& offset = stack.pop();
919
1.06k
    const auto& size = stack.pop();
920
921
1.06k
    if (!check_memory(gas_left, state.memory, offset, size))
  Branch (921:9): [True: 112, False: 954]
+
922
112
        return {EVMC_OUT_OF_GAS, gas_left};
923
924
954
    const auto o = static_cast<size_t>(offset);
925
954
    const auto s = static_cast<size_t>(size);
926
927
954
    const auto cost = int64_t(s) * 8;
928
954
    if ((gas_left -= cost) < 0)
  Branch (928:9): [True: 56, False: 898]
+
929
56
        return {EVMC_OUT_OF_GAS, gas_left};
930
931
898
    std::array<evmc::bytes32, NumTopics> topics;  // NOLINT(cppcoreguidelines-pro-type-member-init)
932
    if constexpr (NumTopics > 0)
933
898
    {
934
898
        for (auto& topic : topics)
  Branch (934:26): [True: 3.59k, False: 898]
+
935
3.59k
            topic = intx::be::store<evmc::bytes32>(stack.pop());
936
898
    }
937
938
898
    const auto data = s != 0 ? 
&state.memory[o]766
:
nullptr132
;
  Branch (938:23): [True: 766, False: 132]
+
939
898
    state.host.emit_log(state.msg->recipient, data, s, topics.data(), NumTopics);
940
898
    return {EVMC_SUCCESS, gas_left};
941
954
}
942
943
944
template <Opcode Op>
945
Result call_impl(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
946
inline constexpr auto call = call_impl<OP_CALL>;
947
inline constexpr auto callcode = call_impl<OP_CALLCODE>;
948
inline constexpr auto delegatecall = call_impl<OP_DELEGATECALL>;
949
inline constexpr auto staticcall = call_impl<OP_STATICCALL>;
950
951
template <Opcode Op>
952
Result create_impl(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
953
inline constexpr auto create = create_impl<OP_CREATE>;
954
inline constexpr auto create2 = create_impl<OP_CREATE2>;
955
956
template <evmc_status_code StatusCode>
957
inline TermResult return_impl(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
958
552k
{
959
552k
    const auto& offset = stack[0];
960
552k
    const auto& size = stack[1];
961
962
552k
    if (!check_memory(gas_left, state.memory, offset, size))
  Branch (962:9): [True: 114, False: 527k]
+
  Branch (962:9): [True: 84, False: 25.2k]
+
963
198
        return {EVMC_OUT_OF_GAS, gas_left};
964
965
552k
    state.output_size = static_cast<size_t>(size);
966
552k
    if (state.output_size != 0)
  Branch (966:9): [True: 429k, False: 97.5k]
+
  Branch (966:9): [True: 24.3k, False: 949]
+
967
454k
        state.output_offset = static_cast<size_t>(offset);
968
552k
    return {StatusCode, gas_left};
969
552k
}
evmone::TermResult evmone::instr::core::return_impl<(evmc_status_code)0>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
958
527k
{
959
527k
    const auto& offset = stack[0];
960
527k
    const auto& size = stack[1];
961
962
527k
    if (!check_memory(gas_left, state.memory, offset, size))
  Branch (962:9): [True: 114, False: 527k]
+
963
114
        return {EVMC_OUT_OF_GAS, gas_left};
964
965
527k
    state.output_size = static_cast<size_t>(size);
966
527k
    if (state.output_size != 0)
  Branch (966:9): [True: 429k, False: 97.5k]
+
967
429k
        state.output_offset = static_cast<size_t>(offset);
968
527k
    return {StatusCode, gas_left};
969
527k
}
evmone::TermResult evmone::instr::core::return_impl<(evmc_status_code)2>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
958
25.3k
{
959
25.3k
    const auto& offset = stack[0];
960
25.3k
    const auto& size = stack[1];
961
962
25.3k
    if (!check_memory(gas_left, state.memory, offset, size))
  Branch (962:9): [True: 84, False: 25.2k]
+
963
84
        return {EVMC_OUT_OF_GAS, gas_left};
964
965
25.2k
    state.output_size = static_cast<size_t>(size);
966
25.2k
    if (state.output_size != 0)
  Branch (966:9): [True: 24.3k, False: 949]
+
967
24.3k
        state.output_offset = static_cast<size_t>(offset);
968
25.2k
    return {StatusCode, gas_left};
969
25.3k
}
970
inline constexpr auto return_ = return_impl<EVMC_SUCCESS>;
971
inline constexpr auto revert = return_impl<EVMC_REVERT>;
972
973
inline TermResult selfdestruct(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
974
7.99k
{
975
7.99k
    if (state.in_static_mode())
  Branch (975:9): [True: 451, False: 7.54k]
+
976
451
        return {EVMC_STATIC_MODE_VIOLATION, gas_left};
977
978
7.54k
    const auto beneficiary = intx::be::trunc<evmc::address>(stack[0]);
979
980
7.54k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(beneficiary) == EVMC_ACCESS_COLD7.28k
)
  Branch (980:9): [True: 7.28k, False: 265]
+  Branch (980:37): [True: 2.20k, False: 5.07k]
+
  MC/DC Decision Region (980:9) to (980:95)
+
+  Number of Conditions: 2
+     Condition C1 --> (980:9)
+     Condition C2 --> (980:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
981
2.20k
    {
982
2.20k
        if ((gas_left -= instr::cold_account_access_cost) < 0)
  Branch (982:13): [True: 12, False: 2.19k]
+
983
12
            return {EVMC_OUT_OF_GAS, gas_left};
984
2.20k
    }
985
986
7.53k
    if (state.rev >= EVMC_TANGERINE_WHISTLE)
  Branch (986:9): [True: 7.46k, False: 67]
+
987
7.46k
    {
988
7.46k
        if (state.rev == EVMC_TANGERINE_WHISTLE || state.host.get_balance(state.msg->recipient))
  Branch (988:13): [True: 3.62k, False: 3.84k]
+  Branch (988:13): [True: 0, False: 7.46k]
+  Branch (988:52): [True: 3.62k, False: 3.84k]
+
  MC/DC Decision Region (988:13) to (988:96)
+
+  Number of Conditions: 2
+     Condition C1 --> (988:13)
+     Condition C2 --> (988:52)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+
+  C1-Pair: not covered
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 50.00%
+
989
3.62k
        {
990
            // After TANGERINE_WHISTLE apply additional cost of
991
            // sending value to a non-existing account.
992
3.62k
            if (!state.host.account_exists(beneficiary))
  Branch (992:17): [True: 776, False: 2.84k]
+
993
776
            {
994
776
                if ((gas_left -= 25000) < 0)
  Branch (994:21): [True: 24, False: 752]
+
995
24
                    return {EVMC_OUT_OF_GAS, gas_left};
996
776
            }
997
3.62k
        }
998
7.46k
    }
999
1000
7.51k
    if (state.host.selfdestruct(state.msg->recipient, beneficiary))
  Branch (1000:9): [True: 4.34k, False: 3.17k]
+
1001
4.34k
    {
1002
4.34k
        if (state.rev < EVMC_LONDON)
  Branch (1002:13): [True: 290, False: 4.05k]
+
1003
290
            state.gas_refund += 24000;
1004
4.34k
    }
1005
7.51k
    return {EVMC_SUCCESS, gas_left};
1006
7.53k
}
1007
1008
1009
/// Maps an opcode to the instruction implementation.
1010
///
1011
/// The set of template specializations which map opcodes `Op` to the function
1012
/// implementing the instruction identified by the opcode.
1013
///     instr::impl<OP_DUP1>(/*...*/);
1014
/// The unspecialized template is invalid and should never to used.
1015
template <Opcode Op>
1016
inline constexpr auto impl = nullptr;
1017
1018
#undef ON_OPCODE_IDENTIFIER
1019
#define ON_OPCODE_IDENTIFIER(OPCODE, IDENTIFIER) \
1020
    template <>                                  \
1021
    inline constexpr auto impl<OPCODE> = IDENTIFIER;  // opcode -> implementation
1022
MAP_OPCODES
1023
#undef ON_OPCODE_IDENTIFIER
1024
644M
#define ON_OPCODE_IDENTIFIER ON_OPCODE_IDENTIFIER_DEFAULT
1025
}  // namespace instr::core
1026
}  // namespace evmone
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions_calls.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions_calls.cpp.html new file mode 100644 index 0000000000..d536f781a1 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions_calls.cpp.html @@ -0,0 +1,783 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone/instructions_calls.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2019 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "delegation.hpp"
6
#include "instructions.hpp"
7
#include <variant>
8
9
constexpr int64_t CALL_VALUE_COST = 9000;
10
constexpr int64_t ACCOUNT_CREATION_COST = 25000;
11
12
namespace evmone::instr::core
13
{
14
namespace
15
{
16
/// Get target address of a code executing instruction.
17
///
18
/// Returns EIP-7702 delegate address if addr is delegated, or addr itself otherwise.
19
/// Applies gas charge for accessing delegate account and may fail with out of gas.
20
inline std::variant<evmc::address, Result> get_target_address(
21
    const evmc::address& addr, int64_t& gas_left, ExecutionState& state) noexcept
22
3.96M
{
23
3.96M
    if (state.rev < EVMC_PRAGUE)
  Branch (23:9): [True: 1.71M, False: 2.24M]
+
24
1.71M
        return addr;
25
26
2.24M
    const auto delegate_addr = get_delegate_address(state.host, addr);
27
2.24M
    if (!delegate_addr)
  Branch (27:9): [True: 2.24M, False: 2.83k]
+
28
2.24M
        return addr;
29
30
2.83k
    const auto delegate_account_access_cost =
31
2.83k
        (state.host.access_account(*delegate_addr) == EVMC_ACCESS_COLD ?
  Branch (31:10): [True: 330, False: 2.50k]
+
32
330
                instr::cold_account_access_cost :
33
2.83k
                
instr::warm_storage_read_cost2.50k
);
34
35
2.83k
    if ((gas_left -= delegate_account_access_cost) < 0)
  Branch (35:9): [True: 18, False: 2.82k]
+
36
18
        return Result{EVMC_OUT_OF_GAS, gas_left};
37
38
2.82k
    return *delegate_addr;
39
2.83k
}
40
}  // namespace
41
42
/// Converts an opcode to matching EVMC call kind.
43
/// NOLINTNEXTLINE(misc-use-internal-linkage) fixed in clang-tidy 20.
44
consteval evmc_call_kind to_call_kind(Opcode op) noexcept
45
{
46
    switch (op)
47
    {
48
    case OP_CALL:
49
    case OP_STATICCALL:
50
        return EVMC_CALL;
51
    case OP_CALLCODE:
52
        return EVMC_CALLCODE;
53
    case OP_DELEGATECALL:
54
        return EVMC_DELEGATECALL;
55
    case OP_CREATE:
56
        return EVMC_CREATE;
57
    case OP_CREATE2:
58
        return EVMC_CREATE2;
59
    default:
60
        intx::unreachable();
61
    }
62
}
63
64
template <Opcode Op>
65
Result call_impl(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
66
3.96M
{
67
3.96M
    static_assert(
68
3.96M
        Op == OP_CALL || Op == OP_CALLCODE || Op == OP_DELEGATECALL || Op == OP_STATICCALL);
69
70
3.96M
    static constexpr bool HAS_VALUE_ARG = Op == OP_CALL || 
Op == OP_CALLCODE0
;
  Branch (70:43): [True: 814k, Folded]
+  Branch (70:60): [Folded, False: 0]
+
  Branch (70:43): [Folded, False: 0]
+  Branch (70:60): [Folded, False: 0]
+
  Branch (70:43): [Folded, False: 0]
+  Branch (70:60): [Folded, False: 0]
+
  Branch (70:43): [Folded, False: 0]
+  Branch (70:60): [True: 0, Folded]
+
  MC/DC Decision Region (70:43) to (70:77)
+
+  Number of Conditions: 2
+     Condition C1 --> (70:43)
+     Condition C2 --> (70:60)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (70:43) to (70:77)
+
+  Number of Conditions: 2
+     Condition C1 --> (70:43)
+     Condition C2 --> (70:60)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (70:43) to (70:77)
+
+  Number of Conditions: 2
+     Condition C1 --> (70:43)
+     Condition C2 --> (70:60)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (70:43) to (70:77)
+
+  Number of Conditions: 2
+     Condition C1 --> (70:43)
+     Condition C2 --> (70:60)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
71
72
3.96M
    const auto gas = stack.pop();
73
3.96M
    const auto dst = intx::be::trunc<evmc::address>(stack.pop());
74
3.96M
    const auto value = (!HAS_VALUE_ARG) ? 
03.06M
:
stack.pop()892k
;
  Branch (74:24): [Folded, False: 814k]
+
  Branch (74:24): [True: 2.99M, Folded]
+
  Branch (74:24): [True: 73.1k, Folded]
+
  Branch (74:24): [Folded, False: 77.5k]
+
75
3.96M
    const auto has_value = value != 0;
76
3.96M
    const auto input_offset_u256 = stack.pop();
77
3.96M
    const auto input_size_u256 = stack.pop();
78
3.96M
    const auto output_offset_u256 = stack.pop();
79
3.96M
    const auto output_size_u256 = stack.pop();
80
81
3.96M
    stack.push(0);  // Assume failure.
82
3.96M
    state.return_data.clear();
83
84
3.96M
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(dst) == EVMC_ACCESS_COLD3.90M
)
  Branch (84:9): [True: 759k, False: 55.4k]
+  Branch (84:37): [True: 103k, False: 655k]
+
  Branch (84:9): [True: 2.99M, False: 1.49k]
+  Branch (84:37): [True: 20.0k, False: 2.97M]
+
  Branch (84:9): [True: 71.3k, False: 1.77k]
+  Branch (84:37): [True: 30.9k, False: 40.3k]
+
  Branch (84:9): [True: 74.8k, False: 2.70k]
+  Branch (84:37): [True: 31.4k, False: 43.3k]
+
  MC/DC Decision Region (84:9) to (84:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (84:9)
+     Condition C2 --> (84:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
  MC/DC Decision Region (84:9) to (84:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (84:9)
+     Condition C2 --> (84:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
  MC/DC Decision Region (84:9) to (84:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (84:9)
+     Condition C2 --> (84:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
  MC/DC Decision Region (84:9) to (84:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (84:9)
+     Condition C2 --> (84:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
85
185k
    {
86
185k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
  Branch (86:13): [True: 198, False: 103k]
+
  Branch (86:13): [True: 182, False: 19.8k]
+
  Branch (86:13): [True: 182, False: 30.8k]
+
  Branch (86:13): [True: 360, False: 31.1k]
+
87
922
            return {EVMC_OUT_OF_GAS, gas_left};
88
185k
    }
89
90
3.96M
    const auto target_addr_or_result = get_target_address(dst, gas_left, state);
91
3.96M
    if (const auto* result = std::get_if<Result>(&target_addr_or_result))
  Branch (91:21): [True: 6, False: 814k]
+
  Branch (91:21): [True: 4, False: 2.99M]
+
  Branch (91:21): [True: 4, False: 72.9k]
+
  Branch (91:21): [True: 4, False: 77.1k]
+
92
18
        return *result;
93
94
3.96M
    const auto& code_addr = std::get<evmc::address>(target_addr_or_result);
95
96
3.96M
    if (!check_memory(gas_left, state.memory, input_offset_u256, input_size_u256))
  Branch (96:9): [True: 162, False: 814k]
+
  Branch (96:9): [True: 142, False: 2.99M]
+
  Branch (96:9): [True: 132, False: 72.8k]
+
  Branch (96:9): [True: 168, False: 77.0k]
+
97
604
        return {EVMC_OUT_OF_GAS, gas_left};
98
99
3.96M
    if (!check_memory(gas_left, state.memory, output_offset_u256, output_size_u256))
  Branch (99:9): [True: 72, False: 814k]
+
  Branch (99:9): [True: 66, False: 2.99M]
+
  Branch (99:9): [True: 72, False: 72.7k]
+
  Branch (99:9): [True: 66, False: 76.9k]
+
100
276
        return {EVMC_OUT_OF_GAS, gas_left};
101
102
3.96M
    const auto input_offset = static_cast<size_t>(input_offset_u256);
103
3.96M
    const auto input_size = static_cast<size_t>(input_size_u256);
104
3.96M
    const auto output_offset = static_cast<size_t>(output_offset_u256);
105
3.96M
    const auto output_size = static_cast<size_t>(output_size_u256);
106
107
3.96M
    evmc_message msg{.kind = to_call_kind(Op)};
108
3.96M
    msg.flags = (Op == OP_STATICCALL) ? 
uint32_t{EVMC_STATIC}2.99M
:
state.msg->flags963k
;
  Branch (108:17): [Folded, False: 814k]
+
  Branch (108:17): [True: 2.99M, Folded]
+
  Branch (108:17): [Folded, False: 72.7k]
+
  Branch (108:17): [Folded, False: 76.9k]
+
109
3.96M
    if (dst != code_addr)
  Branch (109:9): [True: 2.43k, False: 811k]
+
  Branch (109:9): [True: 102, False: 2.99M]
+
  Branch (109:9): [True: 150, False: 72.6k]
+
  Branch (109:9): [True: 110, False: 76.8k]
+
110
2.79k
        msg.flags |= EVMC_DELEGATED;
111
3.95M
    else
112
3.95M
        msg.flags &= ~std::underlying_type_t<evmc_flags>{EVMC_DELEGATED};
113
3.96M
    msg.depth = state.msg->depth + 1;
114
3.96M
    msg.recipient = (Op == OP_CALL || 
Op == OP_STATICCALL3.14M
) ?
dst3.81M
:
state.msg->recipient149k
;
  Branch (114:22): [True: 814k, Folded]
+  Branch (114:39): [Folded, False: 0]
+
  Branch (114:22): [Folded, False: 2.99M]
+  Branch (114:39): [True: 2.99M, Folded]
+
  Branch (114:22): [Folded, False: 72.7k]
+  Branch (114:39): [Folded, False: 72.7k]
+
  Branch (114:22): [Folded, False: 76.9k]
+  Branch (114:39): [Folded, False: 76.9k]
+
  MC/DC Decision Region (114:22) to (114:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (114:22)
+     Condition C2 --> (114:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (114:22) to (114:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (114:22)
+     Condition C2 --> (114:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (114:22) to (114:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (114:22)
+     Condition C2 --> (114:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
  MC/DC Decision Region (114:22) to (114:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (114:22)
+     Condition C2 --> (114:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
115
3.96M
    msg.code_address = code_addr;
116
3.96M
    msg.sender = (Op == OP_DELEGATECALL) ? 
state.msg->sender72.7k
:
state.msg->recipient3.88M
;
  Branch (116:18): [Folded, False: 814k]
+
  Branch (116:18): [Folded, False: 2.99M]
+
  Branch (116:18): [True: 72.7k, Folded]
+
  Branch (116:18): [Folded, False: 76.9k]
+
117
3.96M
    msg.value =
118
3.96M
        (Op == OP_DELEGATECALL) ? 
state.msg->value72.7k
:
intx::be::store<evmc::uint256be>(value)3.88M
;
  Branch (118:9): [Folded, False: 814k]
+
  Branch (118:9): [Folded, False: 2.99M]
+
  Branch (118:9): [True: 72.7k, Folded]
+
  Branch (118:9): [Folded, False: 76.9k]
+
119
120
3.96M
    if (input_size > 0)
  Branch (120:9): [True: 628k, False: 185k]
+
  Branch (120:9): [True: 2.33M, False: 662k]
+
  Branch (120:9): [True: 41.7k, False: 30.9k]
+
  Branch (120:9): [True: 47.9k, False: 29.0k]
+
121
3.05M
    {
122
        // input_offset may be garbage if input_size == 0.
123
3.05M
        msg.input_data = &state.memory[input_offset];
124
3.05M
        msg.input_size = input_size;
125
3.05M
    }
126
127
    if constexpr (HAS_VALUE_ARG)
128
891k
    {
129
891k
        auto cost = has_value ? 
CALL_VALUE_COST53.6k
:
0837k
;
  Branch (129:21): [True: 47.1k, False: 766k]
+
  Branch (129:21): [True: 6.52k, False: 70.4k]
+
130
131
        if constexpr (Op == OP_CALL)
132
814k
        {
133
814k
            if (has_value && 
state.in_static_mode()47.1k
)
  Branch (133:17): [True: 47.1k, False: 766k]
+  Branch (133:30): [True: 180, False: 46.9k]
+
  MC/DC Decision Region (133:17) to (133:52)
+
+  Number of Conditions: 2
+     Condition C1 --> (133:17)
+     Condition C2 --> (133:30)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
134
180
                return {EVMC_STATIC_MODE_VIOLATION, gas_left};
135
136
813k
            if ((has_value || 
state.rev < EVMC_SPURIOUS_DRAGON766k
) &&
!state.host.account_exists(dst)56.7k
)
  Branch (136:18): [True: 46.9k, False: 766k]
+  Branch (136:31): [True: 9.79k, False: 757k]
+  Branch (136:68): [True: 1.22k, False: 55.5k]
+
  MC/DC Decision Region (136:17) to (136:99)
+
+  Number of Conditions: 3
+     Condition C1 --> (136:18)
+     Condition C2 --> (136:31)
+     Condition C3 --> (136:68)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  F,  -  = F      }
+  2 { F,  T,  F  = F      }
+  3 { T,  -,  F  = F      }
+  4 { F,  T,  T  = T      }
+  5 { T,  -,  T  = T      }
+
+  C1-Pair: covered: (1,5)
+  C2-Pair: covered: (1,4)
+  C3-Pair: covered: (2,4)
+  MC/DC Coverage for Expression: 100.00%
+
137
1.22k
                cost += ACCOUNT_CREATION_COST;
138
813k
        }
139
140
891k
        if ((gas_left -= cost) < 0)
  Branch (140:13): [True: 110, False: 814k]
+
  Branch (140:13): [True: 36, False: 76.9k]
+
141
146
            return {EVMC_OUT_OF_GAS, gas_left};
142
891k
    }
143
144
890k
    msg.gas = std::numeric_limits<int64_t>::max();
145
3.96M
    if (gas < msg.gas)
  Branch (145:9): [True: 811k, False: 2.34k]
+
  Branch (145:9): [True: 2.99M, False: 3.05k]
+
  Branch (145:9): [True: 72.6k, False: 126]
+
  Branch (145:9): [True: 76.6k, False: 270]
+
146
3.95M
        msg.gas = static_cast<int64_t>(gas);
147
148
    if constexpr (Op == OP_STATICCALL)
149
2.99M
    {
150
2.99M
        msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
151
    }
152
    else
153
963k
    {
154
963k
        if (state.rev >= EVMC_TANGERINE_WHISTLE)  // Always true for STATICCALL.
  Branch (154:13): [True: 802k, False: 11.1k]
+
  Branch (154:13): [True: 72.4k, False: 278]
+
  Branch (154:13): [True: 76.3k, False: 656]
+
155
951k
            msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
156
12.1k
        else if (msg.gas > gas_left)
  Branch (156:18): [True: 76, False: 11.1k]
+
  Branch (156:18): [True: 2, False: 276]
+
  Branch (156:18): [True: 2, False: 654]
+
157
80
            return {EVMC_OUT_OF_GAS, gas_left};
158
963k
    }
159
160
    if constexpr (HAS_VALUE_ARG)
161
891k
    {
162
891k
        if (has_value)
  Branch (162:13): [True: 46.8k, False: 767k]
+
  Branch (162:13): [True: 6.48k, False: 70.4k]
+
163
53.3k
        {
164
53.3k
            msg.gas += 2300;  // Add stipend.
165
53.3k
            gas_left += 2300;
166
53.3k
            if (intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < value)
  Branch (166:17): [True: 347, False: 46.5k]
+
  Branch (166:17): [True: 136, False: 6.34k]
+
167
483
                return {EVMC_SUCCESS, gas_left};  // "Light" failure.
168
53.3k
        }
169
891k
    }
170
171
3.96M
    if (state.msg->depth >= 1024)
  Branch (171:9): [True: 0, False: 814k]
+
  Branch (171:9): [True: 0, False: 2.99M]
+
  Branch (171:9): [True: 0, False: 72.7k]
+
  Branch (171:9): [True: 0, False: 76.9k]
+
172
0
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
173
174
3.96M
    const auto result = state.host.call(msg);
175
3.96M
    state.return_data.assign(result.output_data, result.output_size);
176
3.96M
    stack.top() = result.status_code == EVMC_SUCCESS;
177
178
3.96M
    if (const auto copy_size = std::min(output_size, result.output_size); copy_size > 0)
  Branch (178:75): [True: 95.5k, False: 718k]
+
  Branch (178:75): [True: 22.6k, False: 2.97M]
+
  Branch (178:75): [True: 4.48k, False: 68.2k]
+
  Branch (178:75): [True: 9.67k, False: 67.2k]
+
179
132k
        std::memcpy(&state.memory[output_offset], result.output_data, copy_size);
180
181
3.96M
    const auto gas_used = msg.gas - result.gas_left;
182
3.96M
    gas_left -= gas_used;
183
3.96M
    state.gas_refund += result.gas_refund;
184
3.96M
    return {EVMC_SUCCESS, gas_left};
185
3.96M
}
evmone::Result evmone::instr::core::call_impl<(evmone::Opcode)241>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
66
814k
{
67
814k
    static_assert(
68
814k
        Op == OP_CALL || Op == OP_CALLCODE || Op == OP_DELEGATECALL || Op == OP_STATICCALL);
69
70
814k
    static constexpr bool HAS_VALUE_ARG = Op == OP_CALL || 
Op == OP_CALLCODE0
;
  Branch (70:43): [True: 814k, Folded]
+  Branch (70:60): [Folded, False: 0]
+
  MC/DC Decision Region (70:43) to (70:77)
+
+  Number of Conditions: 2
+     Condition C1 --> (70:43)
+     Condition C2 --> (70:60)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
71
72
814k
    const auto gas = stack.pop();
73
814k
    const auto dst = intx::be::trunc<evmc::address>(stack.pop());
74
814k
    const auto value = (!HAS_VALUE_ARG) ? 
00
: stack.pop();
  Branch (74:24): [Folded, False: 814k]
+
75
814k
    const auto has_value = value != 0;
76
814k
    const auto input_offset_u256 = stack.pop();
77
814k
    const auto input_size_u256 = stack.pop();
78
814k
    const auto output_offset_u256 = stack.pop();
79
814k
    const auto output_size_u256 = stack.pop();
80
81
814k
    stack.push(0);  // Assume failure.
82
814k
    state.return_data.clear();
83
84
814k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(dst) == EVMC_ACCESS_COLD759k
)
  Branch (84:9): [True: 759k, False: 55.4k]
+  Branch (84:37): [True: 103k, False: 655k]
+
  MC/DC Decision Region (84:9) to (84:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (84:9)
+     Condition C2 --> (84:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
85
103k
    {
86
103k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
  Branch (86:13): [True: 198, False: 103k]
+
87
198
            return {EVMC_OUT_OF_GAS, gas_left};
88
103k
    }
89
90
814k
    const auto target_addr_or_result = get_target_address(dst, gas_left, state);
91
814k
    if (const auto* result = std::get_if<Result>(&target_addr_or_result))
  Branch (91:21): [True: 6, False: 814k]
+
92
6
        return *result;
93
94
814k
    const auto& code_addr = std::get<evmc::address>(target_addr_or_result);
95
96
814k
    if (!check_memory(gas_left, state.memory, input_offset_u256, input_size_u256))
  Branch (96:9): [True: 162, False: 814k]
+
97
162
        return {EVMC_OUT_OF_GAS, gas_left};
98
99
814k
    if (!check_memory(gas_left, state.memory, output_offset_u256, output_size_u256))
  Branch (99:9): [True: 72, False: 814k]
+
100
72
        return {EVMC_OUT_OF_GAS, gas_left};
101
102
814k
    const auto input_offset = static_cast<size_t>(input_offset_u256);
103
814k
    const auto input_size = static_cast<size_t>(input_size_u256);
104
814k
    const auto output_offset = static_cast<size_t>(output_offset_u256);
105
814k
    const auto output_size = static_cast<size_t>(output_size_u256);
106
107
814k
    evmc_message msg{.kind = to_call_kind(Op)};
108
814k
    msg.flags = (Op == OP_STATICCALL) ? 
uint32_t{EVMC_STATIC}0
: state.msg->flags;
  Branch (108:17): [Folded, False: 814k]
+
109
814k
    if (dst != code_addr)
  Branch (109:9): [True: 2.43k, False: 811k]
+
110
2.43k
        msg.flags |= EVMC_DELEGATED;
111
811k
    else
112
811k
        msg.flags &= ~std::underlying_type_t<evmc_flags>{EVMC_DELEGATED};
113
814k
    msg.depth = state.msg->depth + 1;
114
814k
    msg.recipient = (Op == OP_CALL || 
Op == OP_STATICCALL0
) ? dst :
state.msg->recipient0
;
  Branch (114:22): [True: 814k, Folded]
+  Branch (114:39): [Folded, False: 0]
+
  MC/DC Decision Region (114:22) to (114:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (114:22)
+     Condition C2 --> (114:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
115
814k
    msg.code_address = code_addr;
116
814k
    msg.sender = (Op == OP_DELEGATECALL) ? 
state.msg->sender0
: state.msg->recipient;
  Branch (116:18): [Folded, False: 814k]
+
117
814k
    msg.value =
118
814k
        (Op == OP_DELEGATECALL) ? 
state.msg->value0
: intx::be::store<evmc::uint256be>(value);
  Branch (118:9): [Folded, False: 814k]
+
119
120
814k
    if (input_size > 0)
  Branch (120:9): [True: 628k, False: 185k]
+
121
628k
    {
122
        // input_offset may be garbage if input_size == 0.
123
628k
        msg.input_data = &state.memory[input_offset];
124
628k
        msg.input_size = input_size;
125
628k
    }
126
127
    if constexpr (HAS_VALUE_ARG)
128
814k
    {
129
814k
        auto cost = has_value ? 
CALL_VALUE_COST47.1k
:
0766k
;
  Branch (129:21): [True: 47.1k, False: 766k]
+
130
131
        if constexpr (Op == OP_CALL)
132
814k
        {
133
814k
            if (has_value && 
state.in_static_mode()47.1k
)
  Branch (133:17): [True: 47.1k, False: 766k]
+  Branch (133:30): [True: 180, False: 46.9k]
+
  MC/DC Decision Region (133:17) to (133:52)
+
+  Number of Conditions: 2
+     Condition C1 --> (133:17)
+     Condition C2 --> (133:30)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
134
180
                return {EVMC_STATIC_MODE_VIOLATION, gas_left};
135
136
813k
            if ((has_value || 
state.rev < EVMC_SPURIOUS_DRAGON766k
) &&
!state.host.account_exists(dst)56.7k
)
  Branch (136:18): [True: 46.9k, False: 766k]
+  Branch (136:31): [True: 9.79k, False: 757k]
+  Branch (136:68): [True: 1.22k, False: 55.5k]
+
  MC/DC Decision Region (136:17) to (136:99)
+
+  Number of Conditions: 3
+     Condition C1 --> (136:18)
+     Condition C2 --> (136:31)
+     Condition C3 --> (136:68)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  F,  -  = F      }
+  2 { F,  T,  F  = F      }
+  3 { T,  -,  F  = F      }
+  4 { F,  T,  T  = T      }
+  5 { T,  -,  T  = T      }
+
+  C1-Pair: covered: (1,5)
+  C2-Pair: covered: (1,4)
+  C3-Pair: covered: (2,4)
+  MC/DC Coverage for Expression: 100.00%
+
137
1.22k
                cost += ACCOUNT_CREATION_COST;
138
813k
        }
139
140
814k
        if ((gas_left -= cost) < 0)
  Branch (140:13): [True: 110, False: 814k]
+
141
110
            return {EVMC_OUT_OF_GAS, gas_left};
142
814k
    }
143
144
814k
    msg.gas = std::numeric_limits<int64_t>::max();
145
814k
    if (gas < msg.gas)
  Branch (145:9): [True: 811k, False: 2.34k]
+
146
811k
        msg.gas = static_cast<int64_t>(gas);
147
148
    if constexpr (Op == OP_STATICCALL)
149
    {
150
        msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
151
    }
152
    else
153
814k
    {
154
814k
        if (state.rev >= EVMC_TANGERINE_WHISTLE)  // Always true for STATICCALL.
  Branch (154:13): [True: 802k, False: 11.1k]
+
155
802k
            msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
156
11.1k
        else if (msg.gas > gas_left)
  Branch (156:18): [True: 76, False: 11.1k]
+
157
76
            return {EVMC_OUT_OF_GAS, gas_left};
158
814k
    }
159
160
    if constexpr (HAS_VALUE_ARG)
161
814k
    {
162
814k
        if (has_value)
  Branch (162:13): [True: 46.8k, False: 767k]
+
163
46.8k
        {
164
46.8k
            msg.gas += 2300;  // Add stipend.
165
46.8k
            gas_left += 2300;
166
46.8k
            if (intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < value)
  Branch (166:17): [True: 347, False: 46.5k]
+
167
347
                return {EVMC_SUCCESS, gas_left};  // "Light" failure.
168
46.8k
        }
169
814k
    }
170
171
814k
    if (state.msg->depth >= 1024)
  Branch (171:9): [True: 0, False: 814k]
+
172
0
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
173
174
814k
    const auto result = state.host.call(msg);
175
814k
    state.return_data.assign(result.output_data, result.output_size);
176
814k
    stack.top() = result.status_code == EVMC_SUCCESS;
177
178
814k
    if (const auto copy_size = std::min(output_size, result.output_size); copy_size > 0)
  Branch (178:75): [True: 95.5k, False: 718k]
+
179
95.5k
        std::memcpy(&state.memory[output_offset], result.output_data, copy_size);
180
181
814k
    const auto gas_used = msg.gas - result.gas_left;
182
814k
    gas_left -= gas_used;
183
814k
    state.gas_refund += result.gas_refund;
184
814k
    return {EVMC_SUCCESS, gas_left};
185
814k
}
evmone::Result evmone::instr::core::call_impl<(evmone::Opcode)250>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
66
2.99M
{
67
2.99M
    static_assert(
68
2.99M
        Op == OP_CALL || Op == OP_CALLCODE || Op == OP_DELEGATECALL || Op == OP_STATICCALL);
69
70
2.99M
    static constexpr bool HAS_VALUE_ARG = Op == OP_CALL || 
Op == OP_CALLCODE0
;
  Branch (70:43): [Folded, False: 0]
+  Branch (70:60): [Folded, False: 0]
+
  MC/DC Decision Region (70:43) to (70:77)
+
+  Number of Conditions: 2
+     Condition C1 --> (70:43)
+     Condition C2 --> (70:60)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
71
72
2.99M
    const auto gas = stack.pop();
73
2.99M
    const auto dst = intx::be::trunc<evmc::address>(stack.pop());
74
2.99M
    const auto value = (!HAS_VALUE_ARG) ? 0 : 
stack.pop()0
;
  Branch (74:24): [True: 2.99M, Folded]
+
75
2.99M
    const auto has_value = value != 0;
76
2.99M
    const auto input_offset_u256 = stack.pop();
77
2.99M
    const auto input_size_u256 = stack.pop();
78
2.99M
    const auto output_offset_u256 = stack.pop();
79
2.99M
    const auto output_size_u256 = stack.pop();
80
81
2.99M
    stack.push(0);  // Assume failure.
82
2.99M
    state.return_data.clear();
83
84
2.99M
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(dst) == EVMC_ACCESS_COLD2.99M
)
  Branch (84:9): [True: 2.99M, False: 1.49k]
+  Branch (84:37): [True: 20.0k, False: 2.97M]
+
  MC/DC Decision Region (84:9) to (84:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (84:9)
+     Condition C2 --> (84:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
85
20.0k
    {
86
20.0k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
  Branch (86:13): [True: 182, False: 19.8k]
+
87
182
            return {EVMC_OUT_OF_GAS, gas_left};
88
20.0k
    }
89
90
2.99M
    const auto target_addr_or_result = get_target_address(dst, gas_left, state);
91
2.99M
    if (const auto* result = std::get_if<Result>(&target_addr_or_result))
  Branch (91:21): [True: 4, False: 2.99M]
+
92
4
        return *result;
93
94
2.99M
    const auto& code_addr = std::get<evmc::address>(target_addr_or_result);
95
96
2.99M
    if (!check_memory(gas_left, state.memory, input_offset_u256, input_size_u256))
  Branch (96:9): [True: 142, False: 2.99M]
+
97
142
        return {EVMC_OUT_OF_GAS, gas_left};
98
99
2.99M
    if (!check_memory(gas_left, state.memory, output_offset_u256, output_size_u256))
  Branch (99:9): [True: 66, False: 2.99M]
+
100
66
        return {EVMC_OUT_OF_GAS, gas_left};
101
102
2.99M
    const auto input_offset = static_cast<size_t>(input_offset_u256);
103
2.99M
    const auto input_size = static_cast<size_t>(input_size_u256);
104
2.99M
    const auto output_offset = static_cast<size_t>(output_offset_u256);
105
2.99M
    const auto output_size = static_cast<size_t>(output_size_u256);
106
107
2.99M
    evmc_message msg{.kind = to_call_kind(Op)};
108
2.99M
    msg.flags = (Op == OP_STATICCALL) ? uint32_t{EVMC_STATIC} : 
state.msg->flags0
;
  Branch (108:17): [True: 2.99M, Folded]
+
109
2.99M
    if (dst != code_addr)
  Branch (109:9): [True: 102, False: 2.99M]
+
110
102
        msg.flags |= EVMC_DELEGATED;
111
2.99M
    else
112
2.99M
        msg.flags &= ~std::underlying_type_t<evmc_flags>{EVMC_DELEGATED};
113
2.99M
    msg.depth = state.msg->depth + 1;
114
2.99M
    msg.recipient = (Op == OP_CALL || Op == OP_STATICCALL) ? dst : 
state.msg->recipient0
;
  Branch (114:22): [Folded, False: 2.99M]
+  Branch (114:39): [True: 2.99M, Folded]
+
  MC/DC Decision Region (114:22) to (114:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (114:22)
+     Condition C2 --> (114:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
115
2.99M
    msg.code_address = code_addr;
116
2.99M
    msg.sender = (Op == OP_DELEGATECALL) ? 
state.msg->sender0
: state.msg->recipient;
  Branch (116:18): [Folded, False: 2.99M]
+
117
2.99M
    msg.value =
118
2.99M
        (Op == OP_DELEGATECALL) ? 
state.msg->value0
: intx::be::store<evmc::uint256be>(value);
  Branch (118:9): [Folded, False: 2.99M]
+
119
120
2.99M
    if (input_size > 0)
  Branch (120:9): [True: 2.33M, False: 662k]
+
121
2.33M
    {
122
        // input_offset may be garbage if input_size == 0.
123
2.33M
        msg.input_data = &state.memory[input_offset];
124
2.33M
        msg.input_size = input_size;
125
2.33M
    }
126
127
    if constexpr (HAS_VALUE_ARG)
128
    {
129
        auto cost = has_value ? CALL_VALUE_COST : 0;
130
131
        if constexpr (Op == OP_CALL)
132
        {
133
            if (has_value && state.in_static_mode())
134
                return {EVMC_STATIC_MODE_VIOLATION, gas_left};
135
136
            if ((has_value || state.rev < EVMC_SPURIOUS_DRAGON) && !state.host.account_exists(dst))
137
                cost += ACCOUNT_CREATION_COST;
138
        }
139
140
        if ((gas_left -= cost) < 0)
141
            return {EVMC_OUT_OF_GAS, gas_left};
142
    }
143
144
2.99M
    msg.gas = std::numeric_limits<int64_t>::max();
145
2.99M
    if (gas < msg.gas)
  Branch (145:9): [True: 2.99M, False: 3.05k]
+
146
2.99M
        msg.gas = static_cast<int64_t>(gas);
147
148
    if constexpr (Op == OP_STATICCALL)
149
2.99M
    {
150
2.99M
        msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
151
    }
152
    else
153
    {
154
        if (state.rev >= EVMC_TANGERINE_WHISTLE)  // Always true for STATICCALL.
155
            msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
156
        else if (msg.gas > gas_left)
157
            return {EVMC_OUT_OF_GAS, gas_left};
158
    }
159
160
    if constexpr (HAS_VALUE_ARG)
161
    {
162
        if (has_value)
163
        {
164
            msg.gas += 2300;  // Add stipend.
165
            gas_left += 2300;
166
            if (intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < value)
167
                return {EVMC_SUCCESS, gas_left};  // "Light" failure.
168
        }
169
    }
170
171
2.99M
    if (state.msg->depth >= 1024)
  Branch (171:9): [True: 0, False: 2.99M]
+
172
0
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
173
174
2.99M
    const auto result = state.host.call(msg);
175
2.99M
    state.return_data.assign(result.output_data, result.output_size);
176
2.99M
    stack.top() = result.status_code == EVMC_SUCCESS;
177
178
2.99M
    if (const auto copy_size = std::min(output_size, result.output_size); copy_size > 0)
  Branch (178:75): [True: 22.6k, False: 2.97M]
+
179
22.6k
        std::memcpy(&state.memory[output_offset], result.output_data, copy_size);
180
181
2.99M
    const auto gas_used = msg.gas - result.gas_left;
182
2.99M
    gas_left -= gas_used;
183
2.99M
    state.gas_refund += result.gas_refund;
184
2.99M
    return {EVMC_SUCCESS, gas_left};
185
2.99M
}
evmone::Result evmone::instr::core::call_impl<(evmone::Opcode)244>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
66
73.1k
{
67
73.1k
    static_assert(
68
73.1k
        Op == OP_CALL || Op == OP_CALLCODE || Op == OP_DELEGATECALL || Op == OP_STATICCALL);
69
70
73.1k
    static constexpr bool HAS_VALUE_ARG = Op == OP_CALL || 
Op == OP_CALLCODE0
;
  Branch (70:43): [Folded, False: 0]
+  Branch (70:60): [Folded, False: 0]
+
  MC/DC Decision Region (70:43) to (70:77)
+
+  Number of Conditions: 2
+     Condition C1 --> (70:43)
+     Condition C2 --> (70:60)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
71
72
73.1k
    const auto gas = stack.pop();
73
73.1k
    const auto dst = intx::be::trunc<evmc::address>(stack.pop());
74
73.1k
    const auto value = (!HAS_VALUE_ARG) ? 0 : 
stack.pop()0
;
  Branch (74:24): [True: 73.1k, Folded]
+
75
73.1k
    const auto has_value = value != 0;
76
73.1k
    const auto input_offset_u256 = stack.pop();
77
73.1k
    const auto input_size_u256 = stack.pop();
78
73.1k
    const auto output_offset_u256 = stack.pop();
79
73.1k
    const auto output_size_u256 = stack.pop();
80
81
73.1k
    stack.push(0);  // Assume failure.
82
73.1k
    state.return_data.clear();
83
84
73.1k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(dst) == EVMC_ACCESS_COLD71.3k
)
  Branch (84:9): [True: 71.3k, False: 1.77k]
+  Branch (84:37): [True: 30.9k, False: 40.3k]
+
  MC/DC Decision Region (84:9) to (84:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (84:9)
+     Condition C2 --> (84:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
85
30.9k
    {
86
30.9k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
  Branch (86:13): [True: 182, False: 30.8k]
+
87
182
            return {EVMC_OUT_OF_GAS, gas_left};
88
30.9k
    }
89
90
72.9k
    const auto target_addr_or_result = get_target_address(dst, gas_left, state);
91
72.9k
    if (const auto* result = std::get_if<Result>(&target_addr_or_result))
  Branch (91:21): [True: 4, False: 72.9k]
+
92
4
        return *result;
93
94
72.9k
    const auto& code_addr = std::get<evmc::address>(target_addr_or_result);
95
96
72.9k
    if (!check_memory(gas_left, state.memory, input_offset_u256, input_size_u256))
  Branch (96:9): [True: 132, False: 72.8k]
+
97
132
        return {EVMC_OUT_OF_GAS, gas_left};
98
99
72.8k
    if (!check_memory(gas_left, state.memory, output_offset_u256, output_size_u256))
  Branch (99:9): [True: 72, False: 72.7k]
+
100
72
        return {EVMC_OUT_OF_GAS, gas_left};
101
102
72.7k
    const auto input_offset = static_cast<size_t>(input_offset_u256);
103
72.7k
    const auto input_size = static_cast<size_t>(input_size_u256);
104
72.7k
    const auto output_offset = static_cast<size_t>(output_offset_u256);
105
72.7k
    const auto output_size = static_cast<size_t>(output_size_u256);
106
107
72.7k
    evmc_message msg{.kind = to_call_kind(Op)};
108
72.7k
    msg.flags = (Op == OP_STATICCALL) ? 
uint32_t{EVMC_STATIC}0
: state.msg->flags;
  Branch (108:17): [Folded, False: 72.7k]
+
109
72.7k
    if (dst != code_addr)
  Branch (109:9): [True: 150, False: 72.6k]
+
110
150
        msg.flags |= EVMC_DELEGATED;
111
72.6k
    else
112
72.6k
        msg.flags &= ~std::underlying_type_t<evmc_flags>{EVMC_DELEGATED};
113
72.7k
    msg.depth = state.msg->depth + 1;
114
72.7k
    msg.recipient = (Op == OP_CALL || Op == OP_STATICCALL) ? 
dst0
: state.msg->recipient;
  Branch (114:22): [Folded, False: 72.7k]
+  Branch (114:39): [Folded, False: 72.7k]
+
  MC/DC Decision Region (114:22) to (114:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (114:22)
+     Condition C2 --> (114:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
115
72.7k
    msg.code_address = code_addr;
116
72.7k
    msg.sender = (Op == OP_DELEGATECALL) ? state.msg->sender : 
state.msg->recipient0
;
  Branch (116:18): [True: 72.7k, Folded]
+
117
72.7k
    msg.value =
118
72.7k
        (Op == OP_DELEGATECALL) ? state.msg->value : 
intx::be::store<evmc::uint256be>(value)0
;
  Branch (118:9): [True: 72.7k, Folded]
+
119
120
72.7k
    if (input_size > 0)
  Branch (120:9): [True: 41.7k, False: 30.9k]
+
121
41.7k
    {
122
        // input_offset may be garbage if input_size == 0.
123
41.7k
        msg.input_data = &state.memory[input_offset];
124
41.7k
        msg.input_size = input_size;
125
41.7k
    }
126
127
    if constexpr (HAS_VALUE_ARG)
128
    {
129
        auto cost = has_value ? CALL_VALUE_COST : 0;
130
131
        if constexpr (Op == OP_CALL)
132
        {
133
            if (has_value && state.in_static_mode())
134
                return {EVMC_STATIC_MODE_VIOLATION, gas_left};
135
136
            if ((has_value || state.rev < EVMC_SPURIOUS_DRAGON) && !state.host.account_exists(dst))
137
                cost += ACCOUNT_CREATION_COST;
138
        }
139
140
        if ((gas_left -= cost) < 0)
141
            return {EVMC_OUT_OF_GAS, gas_left};
142
    }
143
144
72.7k
    msg.gas = std::numeric_limits<int64_t>::max();
145
72.7k
    if (gas < msg.gas)
  Branch (145:9): [True: 72.6k, False: 126]
+
146
72.6k
        msg.gas = static_cast<int64_t>(gas);
147
148
    if constexpr (Op == OP_STATICCALL)
149
    {
150
        msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
151
    }
152
    else
153
72.7k
    {
154
72.7k
        if (state.rev >= EVMC_TANGERINE_WHISTLE)  // Always true for STATICCALL.
  Branch (154:13): [True: 72.4k, False: 278]
+
155
72.4k
            msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
156
278
        else if (msg.gas > gas_left)
  Branch (156:18): [True: 2, False: 276]
+
157
2
            return {EVMC_OUT_OF_GAS, gas_left};
158
72.7k
    }
159
160
    if constexpr (HAS_VALUE_ARG)
161
    {
162
        if (has_value)
163
        {
164
            msg.gas += 2300;  // Add stipend.
165
            gas_left += 2300;
166
            if (intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < value)
167
                return {EVMC_SUCCESS, gas_left};  // "Light" failure.
168
        }
169
    }
170
171
72.7k
    if (state.msg->depth >= 1024)
  Branch (171:9): [True: 0, False: 72.7k]
+
172
0
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
173
174
72.7k
    const auto result = state.host.call(msg);
175
72.7k
    state.return_data.assign(result.output_data, result.output_size);
176
72.7k
    stack.top() = result.status_code == EVMC_SUCCESS;
177
178
72.7k
    if (const auto copy_size = std::min(output_size, result.output_size); copy_size > 0)
  Branch (178:75): [True: 4.48k, False: 68.2k]
+
179
4.48k
        std::memcpy(&state.memory[output_offset], result.output_data, copy_size);
180
181
72.7k
    const auto gas_used = msg.gas - result.gas_left;
182
72.7k
    gas_left -= gas_used;
183
72.7k
    state.gas_refund += result.gas_refund;
184
72.7k
    return {EVMC_SUCCESS, gas_left};
185
72.7k
}
evmone::Result evmone::instr::core::call_impl<(evmone::Opcode)242>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
66
77.5k
{
67
77.5k
    static_assert(
68
77.5k
        Op == OP_CALL || Op == OP_CALLCODE || Op == OP_DELEGATECALL || Op == OP_STATICCALL);
69
70
77.5k
    static constexpr bool HAS_VALUE_ARG = Op == OP_CALL || 
Op == OP_CALLCODE0
;
  Branch (70:43): [Folded, False: 0]
+  Branch (70:60): [True: 0, Folded]
+
  MC/DC Decision Region (70:43) to (70:77)
+
+  Number of Conditions: 2
+     Condition C1 --> (70:43)
+     Condition C2 --> (70:60)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
71
72
77.5k
    const auto gas = stack.pop();
73
77.5k
    const auto dst = intx::be::trunc<evmc::address>(stack.pop());
74
77.5k
    const auto value = (!HAS_VALUE_ARG) ? 
00
: stack.pop();
  Branch (74:24): [Folded, False: 77.5k]
+
75
77.5k
    const auto has_value = value != 0;
76
77.5k
    const auto input_offset_u256 = stack.pop();
77
77.5k
    const auto input_size_u256 = stack.pop();
78
77.5k
    const auto output_offset_u256 = stack.pop();
79
77.5k
    const auto output_size_u256 = stack.pop();
80
81
77.5k
    stack.push(0);  // Assume failure.
82
77.5k
    state.return_data.clear();
83
84
77.5k
    if (state.rev >= EVMC_BERLIN && 
state.host.access_account(dst) == EVMC_ACCESS_COLD74.8k
)
  Branch (84:9): [True: 74.8k, False: 2.70k]
+  Branch (84:37): [True: 31.4k, False: 43.3k]
+
  MC/DC Decision Region (84:9) to (84:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (84:9)
+     Condition C2 --> (84:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
85
31.4k
    {
86
31.4k
        if ((gas_left -= instr::additional_cold_account_access_cost) < 0)
  Branch (86:13): [True: 360, False: 31.1k]
+
87
360
            return {EVMC_OUT_OF_GAS, gas_left};
88
31.4k
    }
89
90
77.2k
    const auto target_addr_or_result = get_target_address(dst, gas_left, state);
91
77.2k
    if (const auto* result = std::get_if<Result>(&target_addr_or_result))
  Branch (91:21): [True: 4, False: 77.1k]
+
92
4
        return *result;
93
94
77.1k
    const auto& code_addr = std::get<evmc::address>(target_addr_or_result);
95
96
77.1k
    if (!check_memory(gas_left, state.memory, input_offset_u256, input_size_u256))
  Branch (96:9): [True: 168, False: 77.0k]
+
97
168
        return {EVMC_OUT_OF_GAS, gas_left};
98
99
77.0k
    if (!check_memory(gas_left, state.memory, output_offset_u256, output_size_u256))
  Branch (99:9): [True: 66, False: 76.9k]
+
100
66
        return {EVMC_OUT_OF_GAS, gas_left};
101
102
76.9k
    const auto input_offset = static_cast<size_t>(input_offset_u256);
103
76.9k
    const auto input_size = static_cast<size_t>(input_size_u256);
104
76.9k
    const auto output_offset = static_cast<size_t>(output_offset_u256);
105
76.9k
    const auto output_size = static_cast<size_t>(output_size_u256);
106
107
76.9k
    evmc_message msg{.kind = to_call_kind(Op)};
108
76.9k
    msg.flags = (Op == OP_STATICCALL) ? 
uint32_t{EVMC_STATIC}0
: state.msg->flags;
  Branch (108:17): [Folded, False: 76.9k]
+
109
76.9k
    if (dst != code_addr)
  Branch (109:9): [True: 110, False: 76.8k]
+
110
110
        msg.flags |= EVMC_DELEGATED;
111
76.8k
    else
112
76.8k
        msg.flags &= ~std::underlying_type_t<evmc_flags>{EVMC_DELEGATED};
113
76.9k
    msg.depth = state.msg->depth + 1;
114
76.9k
    msg.recipient = (Op == OP_CALL || Op == OP_STATICCALL) ? 
dst0
: state.msg->recipient;
  Branch (114:22): [Folded, False: 76.9k]
+  Branch (114:39): [Folded, False: 76.9k]
+
  MC/DC Decision Region (114:22) to (114:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (114:22)
+     Condition C2 --> (114:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: constant folded
+  C2-Pair: constant folded
+  MC/DC Coverage for Expression: 0.00%
+
115
76.9k
    msg.code_address = code_addr;
116
76.9k
    msg.sender = (Op == OP_DELEGATECALL) ? 
state.msg->sender0
: state.msg->recipient;
  Branch (116:18): [Folded, False: 76.9k]
+
117
76.9k
    msg.value =
118
76.9k
        (Op == OP_DELEGATECALL) ? 
state.msg->value0
: intx::be::store<evmc::uint256be>(value);
  Branch (118:9): [Folded, False: 76.9k]
+
119
120
76.9k
    if (input_size > 0)
  Branch (120:9): [True: 47.9k, False: 29.0k]
+
121
47.9k
    {
122
        // input_offset may be garbage if input_size == 0.
123
47.9k
        msg.input_data = &state.memory[input_offset];
124
47.9k
        msg.input_size = input_size;
125
47.9k
    }
126
127
    if constexpr (HAS_VALUE_ARG)
128
76.9k
    {
129
76.9k
        auto cost = has_value ? 
CALL_VALUE_COST6.52k
:
070.4k
;
  Branch (129:21): [True: 6.52k, False: 70.4k]
+
130
131
        if constexpr (Op == OP_CALL)
132
        {
133
            if (has_value && state.in_static_mode())
134
                return {EVMC_STATIC_MODE_VIOLATION, gas_left};
135
136
            if ((has_value || state.rev < EVMC_SPURIOUS_DRAGON) && !state.host.account_exists(dst))
137
                cost += ACCOUNT_CREATION_COST;
138
        }
139
140
76.9k
        if ((gas_left -= cost) < 0)
  Branch (140:13): [True: 36, False: 76.9k]
+
141
36
            return {EVMC_OUT_OF_GAS, gas_left};
142
76.9k
    }
143
144
76.9k
    msg.gas = std::numeric_limits<int64_t>::max();
145
76.9k
    if (gas < msg.gas)
  Branch (145:9): [True: 76.6k, False: 270]
+
146
76.6k
        msg.gas = static_cast<int64_t>(gas);
147
148
    if constexpr (Op == OP_STATICCALL)
149
    {
150
        msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
151
    }
152
    else
153
76.9k
    {
154
76.9k
        if (state.rev >= EVMC_TANGERINE_WHISTLE)  // Always true for STATICCALL.
  Branch (154:13): [True: 76.3k, False: 656]
+
155
76.3k
            msg.gas = std::min(msg.gas, gas_left - gas_left / 64);
156
656
        else if (msg.gas > gas_left)
  Branch (156:18): [True: 2, False: 654]
+
157
2
            return {EVMC_OUT_OF_GAS, gas_left};
158
76.9k
    }
159
160
    if constexpr (HAS_VALUE_ARG)
161
76.9k
    {
162
76.9k
        if (has_value)
  Branch (162:13): [True: 6.48k, False: 70.4k]
+
163
6.48k
        {
164
6.48k
            msg.gas += 2300;  // Add stipend.
165
6.48k
            gas_left += 2300;
166
6.48k
            if (intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < value)
  Branch (166:17): [True: 136, False: 6.34k]
+
167
136
                return {EVMC_SUCCESS, gas_left};  // "Light" failure.
168
6.48k
        }
169
76.9k
    }
170
171
76.9k
    if (state.msg->depth >= 1024)
  Branch (171:9): [True: 0, False: 76.9k]
+
172
0
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
173
174
76.9k
    const auto result = state.host.call(msg);
175
76.9k
    state.return_data.assign(result.output_data, result.output_size);
176
76.9k
    stack.top() = result.status_code == EVMC_SUCCESS;
177
178
76.9k
    if (const auto copy_size = std::min(output_size, result.output_size); copy_size > 0)
  Branch (178:75): [True: 9.67k, False: 67.2k]
+
179
9.67k
        std::memcpy(&state.memory[output_offset], result.output_data, copy_size);
180
181
76.9k
    const auto gas_used = msg.gas - result.gas_left;
182
76.9k
    gas_left -= gas_used;
183
76.9k
    state.gas_refund += result.gas_refund;
184
76.9k
    return {EVMC_SUCCESS, gas_left};
185
76.9k
}
186
187
template Result call_impl<OP_CALL>(
188
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
189
template Result call_impl<OP_STATICCALL>(
190
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
191
template Result call_impl<OP_DELEGATECALL>(
192
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
193
template Result call_impl<OP_CALLCODE>(
194
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
195
196
template <Opcode Op>
197
Result create_impl(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
198
36.7k
{
199
36.7k
    static_assert(Op == OP_CREATE || Op == OP_CREATE2);
200
201
36.7k
    if (state.in_static_mode())
  Branch (201:9): [True: 36, False: 23.1k]
+
  Branch (201:9): [True: 18, False: 13.5k]
+
202
54
        return {EVMC_STATIC_MODE_VIOLATION, gas_left};
203
204
36.7k
    const auto endowment = stack.pop();
205
36.7k
    const auto init_code_offset_u256 = stack.pop();
206
36.7k
    const auto init_code_size_u256 = stack.pop();
207
36.7k
    const auto salt = (Op == OP_CREATE2) ? 
stack.pop()13.5k
:
uint256{}23.1k
;
  Branch (207:23): [Folded, False: 23.1k]
+
  Branch (207:23): [True: 13.5k, Folded]
+
208
209
36.7k
    stack.push(0);  // Assume failure.
210
36.7k
    state.return_data.clear();
211
212
36.7k
    if (!check_memory(gas_left, state.memory, init_code_offset_u256, init_code_size_u256))
  Branch (212:9): [True: 138, False: 23.0k]
+
  Branch (212:9): [True: 108, False: 13.4k]
+
213
246
        return {EVMC_OUT_OF_GAS, gas_left};
214
215
36.4k
    const auto init_code_offset = static_cast<size_t>(init_code_offset_u256);
216
36.4k
    const auto init_code_size = static_cast<size_t>(init_code_size_u256);
217
218
36.4k
    if (state.rev >= EVMC_SHANGHAI && 
init_code_size > 0xC00025.4k
)
  Branch (218:9): [True: 16.3k, False: 6.67k]
+  Branch (218:39): [True: 34, False: 16.3k]
+
  Branch (218:9): [True: 9.09k, False: 4.36k]
+  Branch (218:39): [True: 22, False: 9.06k]
+
  MC/DC Decision Region (218:9) to (218:62)
+
+  Number of Conditions: 2
+     Condition C1 --> (218:9)
+     Condition C2 --> (218:39)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
  MC/DC Decision Region (218:9) to (218:62)
+
+  Number of Conditions: 2
+     Condition C1 --> (218:9)
+     Condition C2 --> (218:39)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
219
56
        return {EVMC_OUT_OF_GAS, gas_left};
220
221
36.4k
    const auto init_code_word_cost = 6 * (Op == OP_CREATE2) + 2 * (state.rev >= EVMC_SHANGHAI);
222
36.4k
    const auto init_code_cost = num_words(init_code_size) * init_code_word_cost;
223
36.4k
    if ((gas_left -= init_code_cost) < 0)
  Branch (223:9): [True: 24, False: 22.9k]
+
  Branch (223:9): [True: 36, False: 13.4k]
+
224
60
        return {EVMC_OUT_OF_GAS, gas_left};
225
226
36.3k
    if (state.msg->depth >= 1024)
  Branch (226:9): [True: 0, False: 22.9k]
+
  Branch (226:9): [True: 0, False: 13.4k]
+
227
0
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
228
229
36.3k
    if (endowment != 0 &&
  Branch (229:9): [True: 60, False: 22.8k]
+  Branch (229:9): [True: 2.66k, False: 20.2k]
+
  Branch (229:9): [True: 54, False: 13.3k]
+  Branch (229:9): [True: 2.28k, False: 11.1k]
+
230
36.3k
        
intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < endowment4.95k
)
  Branch (230:9): [True: 60, False: 2.60k]
+
  Branch (230:9): [True: 54, False: 2.23k]
+
  MC/DC Decision Region (229:9) to (230:90)
+
+  Number of Conditions: 2
+     Condition C1 --> (229:9)
+     Condition C2 --> (230:9)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
  MC/DC Decision Region (229:9) to (230:90)
+
+  Number of Conditions: 2
+     Condition C1 --> (229:9)
+     Condition C2 --> (230:9)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
231
114
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
232
233
36.2k
    evmc_message msg{.kind = to_call_kind(Op)};
234
36.2k
    msg.gas = gas_left;
235
36.2k
    if (state.rev >= EVMC_TANGERINE_WHISTLE)
  Branch (235:9): [True: 21.6k, False: 1.28k]
+
  Branch (235:9): [True: 13.3k, False: 0]
+
236
34.9k
        msg.gas = msg.gas - msg.gas / 64;
237
238
36.2k
    if (init_code_size > 0)
  Branch (238:9): [True: 22.6k, False: 262]
+
  Branch (238:9): [True: 12.9k, False: 402]
+
239
35.5k
    {
240
        // init_code_offset may be garbage if init_code_size == 0.
241
35.5k
        msg.input_data = &state.memory[init_code_offset];
242
35.5k
        msg.input_size = init_code_size;
243
35.5k
    }
244
36.2k
    msg.sender = state.msg->recipient;
245
36.2k
    msg.depth = state.msg->depth + 1;
246
36.2k
    msg.create2_salt = intx::be::store<evmc::bytes32>(salt);
247
36.2k
    msg.value = intx::be::store<evmc::uint256be>(endowment);
248
249
36.2k
    const auto result = state.host.call(msg);
250
36.2k
    gas_left -= msg.gas - result.gas_left;
251
36.2k
    state.gas_refund += result.gas_refund;
252
253
36.2k
    state.return_data.assign(result.output_data, result.output_size);
254
36.2k
    if (result.status_code == EVMC_SUCCESS)
  Branch (254:9): [True: 21.8k, False: 1.04k]
+
  Branch (254:9): [True: 12.3k, False: 1.02k]
+
255
34.1k
        stack.top() = intx::be::load<uint256>(result.create_address);
256
257
36.2k
    return {EVMC_SUCCESS, gas_left};
258
36.3k
}
evmone::Result evmone::instr::core::create_impl<(evmone::Opcode)240>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
198
23.1k
{
199
23.1k
    static_assert(Op == OP_CREATE || Op == OP_CREATE2);
200
201
23.1k
    if (state.in_static_mode())
  Branch (201:9): [True: 36, False: 23.1k]
+
202
36
        return {EVMC_STATIC_MODE_VIOLATION, gas_left};
203
204
23.1k
    const auto endowment = stack.pop();
205
23.1k
    const auto init_code_offset_u256 = stack.pop();
206
23.1k
    const auto init_code_size_u256 = stack.pop();
207
23.1k
    const auto salt = (Op == OP_CREATE2) ? 
stack.pop()0
: uint256{};
  Branch (207:23): [Folded, False: 23.1k]
+
208
209
23.1k
    stack.push(0);  // Assume failure.
210
23.1k
    state.return_data.clear();
211
212
23.1k
    if (!check_memory(gas_left, state.memory, init_code_offset_u256, init_code_size_u256))
  Branch (212:9): [True: 138, False: 23.0k]
+
213
138
        return {EVMC_OUT_OF_GAS, gas_left};
214
215
23.0k
    const auto init_code_offset = static_cast<size_t>(init_code_offset_u256);
216
23.0k
    const auto init_code_size = static_cast<size_t>(init_code_size_u256);
217
218
23.0k
    if (state.rev >= EVMC_SHANGHAI && 
init_code_size > 0xC00016.3k
)
  Branch (218:9): [True: 16.3k, False: 6.67k]
+  Branch (218:39): [True: 34, False: 16.3k]
+
  MC/DC Decision Region (218:9) to (218:62)
+
+  Number of Conditions: 2
+     Condition C1 --> (218:9)
+     Condition C2 --> (218:39)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
219
34
        return {EVMC_OUT_OF_GAS, gas_left};
220
221
22.9k
    const auto init_code_word_cost = 6 * (Op == OP_CREATE2) + 2 * (state.rev >= EVMC_SHANGHAI);
222
22.9k
    const auto init_code_cost = num_words(init_code_size) * init_code_word_cost;
223
22.9k
    if ((gas_left -= init_code_cost) < 0)
  Branch (223:9): [True: 24, False: 22.9k]
+
224
24
        return {EVMC_OUT_OF_GAS, gas_left};
225
226
22.9k
    if (state.msg->depth >= 1024)
  Branch (226:9): [True: 0, False: 22.9k]
+
227
0
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
228
229
22.9k
    if (endowment != 0 &&
  Branch (229:9): [True: 60, False: 22.8k]
+  Branch (229:9): [True: 2.66k, False: 20.2k]
+
230
22.9k
        
intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < endowment2.66k
)
  Branch (230:9): [True: 60, False: 2.60k]
+
  MC/DC Decision Region (229:9) to (230:90)
+
+  Number of Conditions: 2
+     Condition C1 --> (229:9)
+     Condition C2 --> (230:9)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
231
60
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
232
233
22.8k
    evmc_message msg{.kind = to_call_kind(Op)};
234
22.8k
    msg.gas = gas_left;
235
22.8k
    if (state.rev >= EVMC_TANGERINE_WHISTLE)
  Branch (235:9): [True: 21.6k, False: 1.28k]
+
236
21.6k
        msg.gas = msg.gas - msg.gas / 64;
237
238
22.8k
    if (init_code_size > 0)
  Branch (238:9): [True: 22.6k, False: 262]
+
239
22.6k
    {
240
        // init_code_offset may be garbage if init_code_size == 0.
241
22.6k
        msg.input_data = &state.memory[init_code_offset];
242
22.6k
        msg.input_size = init_code_size;
243
22.6k
    }
244
22.8k
    msg.sender = state.msg->recipient;
245
22.8k
    msg.depth = state.msg->depth + 1;
246
22.8k
    msg.create2_salt = intx::be::store<evmc::bytes32>(salt);
247
22.8k
    msg.value = intx::be::store<evmc::uint256be>(endowment);
248
249
22.8k
    const auto result = state.host.call(msg);
250
22.8k
    gas_left -= msg.gas - result.gas_left;
251
22.8k
    state.gas_refund += result.gas_refund;
252
253
22.8k
    state.return_data.assign(result.output_data, result.output_size);
254
22.8k
    if (result.status_code == EVMC_SUCCESS)
  Branch (254:9): [True: 21.8k, False: 1.04k]
+
255
21.8k
        stack.top() = intx::be::load<uint256>(result.create_address);
256
257
22.8k
    return {EVMC_SUCCESS, gas_left};
258
22.9k
}
evmone::Result evmone::instr::core::create_impl<(evmone::Opcode)245>(evmone::StackTop, long, evmone::ExecutionState&)
Line
Count
Source
198
13.5k
{
199
13.5k
    static_assert(Op == OP_CREATE || Op == OP_CREATE2);
200
201
13.5k
    if (state.in_static_mode())
  Branch (201:9): [True: 18, False: 13.5k]
+
202
18
        return {EVMC_STATIC_MODE_VIOLATION, gas_left};
203
204
13.5k
    const auto endowment = stack.pop();
205
13.5k
    const auto init_code_offset_u256 = stack.pop();
206
13.5k
    const auto init_code_size_u256 = stack.pop();
207
13.5k
    const auto salt = (Op == OP_CREATE2) ? stack.pop() : 
uint256{}0
;
  Branch (207:23): [True: 13.5k, Folded]
+
208
209
13.5k
    stack.push(0);  // Assume failure.
210
13.5k
    state.return_data.clear();
211
212
13.5k
    if (!check_memory(gas_left, state.memory, init_code_offset_u256, init_code_size_u256))
  Branch (212:9): [True: 108, False: 13.4k]
+
213
108
        return {EVMC_OUT_OF_GAS, gas_left};
214
215
13.4k
    const auto init_code_offset = static_cast<size_t>(init_code_offset_u256);
216
13.4k
    const auto init_code_size = static_cast<size_t>(init_code_size_u256);
217
218
13.4k
    if (state.rev >= EVMC_SHANGHAI && 
init_code_size > 0xC0009.09k
)
  Branch (218:9): [True: 9.09k, False: 4.36k]
+  Branch (218:39): [True: 22, False: 9.06k]
+
  MC/DC Decision Region (218:9) to (218:62)
+
+  Number of Conditions: 2
+     Condition C1 --> (218:9)
+     Condition C2 --> (218:39)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
219
22
        return {EVMC_OUT_OF_GAS, gas_left};
220
221
13.4k
    const auto init_code_word_cost = 6 * (Op == OP_CREATE2) + 2 * (state.rev >= EVMC_SHANGHAI);
222
13.4k
    const auto init_code_cost = num_words(init_code_size) * init_code_word_cost;
223
13.4k
    if ((gas_left -= init_code_cost) < 0)
  Branch (223:9): [True: 36, False: 13.4k]
+
224
36
        return {EVMC_OUT_OF_GAS, gas_left};
225
226
13.4k
    if (state.msg->depth >= 1024)
  Branch (226:9): [True: 0, False: 13.4k]
+
227
0
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
228
229
13.4k
    if (endowment != 0 &&
  Branch (229:9): [True: 54, False: 13.3k]
+  Branch (229:9): [True: 2.28k, False: 11.1k]
+
230
13.4k
        
intx::be::load<uint256>(state.host.get_balance(state.msg->recipient)) < endowment2.28k
)
  Branch (230:9): [True: 54, False: 2.23k]
+
  MC/DC Decision Region (229:9) to (230:90)
+
+  Number of Conditions: 2
+     Condition C1 --> (229:9)
+     Condition C2 --> (230:9)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
231
54
        return {EVMC_SUCCESS, gas_left};  // "Light" failure.
232
233
13.3k
    evmc_message msg{.kind = to_call_kind(Op)};
234
13.3k
    msg.gas = gas_left;
235
13.3k
    if (state.rev >= EVMC_TANGERINE_WHISTLE)
  Branch (235:9): [True: 13.3k, False: 0]
+
236
13.3k
        msg.gas = msg.gas - msg.gas / 64;
237
238
13.3k
    if (init_code_size > 0)
  Branch (238:9): [True: 12.9k, False: 402]
+
239
12.9k
    {
240
        // init_code_offset may be garbage if init_code_size == 0.
241
12.9k
        msg.input_data = &state.memory[init_code_offset];
242
12.9k
        msg.input_size = init_code_size;
243
12.9k
    }
244
13.3k
    msg.sender = state.msg->recipient;
245
13.3k
    msg.depth = state.msg->depth + 1;
246
13.3k
    msg.create2_salt = intx::be::store<evmc::bytes32>(salt);
247
13.3k
    msg.value = intx::be::store<evmc::uint256be>(endowment);
248
249
13.3k
    const auto result = state.host.call(msg);
250
13.3k
    gas_left -= msg.gas - result.gas_left;
251
13.3k
    state.gas_refund += result.gas_refund;
252
253
13.3k
    state.return_data.assign(result.output_data, result.output_size);
254
13.3k
    if (result.status_code == EVMC_SUCCESS)
  Branch (254:9): [True: 12.3k, False: 1.02k]
+
255
12.3k
        stack.top() = intx::be::load<uint256>(result.create_address);
256
257
13.3k
    return {EVMC_SUCCESS, gas_left};
258
13.4k
}
259
260
template Result create_impl<OP_CREATE>(
261
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
262
template Result create_impl<OP_CREATE2>(
263
    StackTop stack, int64_t gas_left, ExecutionState& state) noexcept;
264
}  // namespace evmone::instr::core
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions_storage.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions_storage.cpp.html new file mode 100644 index 0000000000..446d00cfb8 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions_storage.cpp.html @@ -0,0 +1,59 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone/instructions_storage.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2019 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "instructions.hpp"
6
7
namespace evmone::instr::core
8
{
9
namespace
10
{
11
/// The gas cost specification for storage instructions.
12
struct StorageCostSpec
13
{
14
    bool net_cost;        ///< Is this net gas cost metering schedule?
15
    int16_t warm_access;  ///< Storage warm access cost, YP: G_{warmaccess}
16
    int16_t set;          ///< Storage addition cost, YP: G_{sset}
17
    int16_t reset;        ///< Storage modification cost, YP: G_{sreset}
18
    int16_t clear;        ///< Storage deletion refund, YP: R_{sclear}
19
};
20
21
/// Table of gas cost specification for storage instructions per EVM revision.
22
/// TODO: This can be moved to instruction traits and be used in other places: e.g.
23
///       SLOAD cost, replacement for warm_storage_read_cost.
24
constexpr auto storage_cost_spec = []() noexcept {
25
    std::array<StorageCostSpec, EVMC_MAX_REVISION + 1> tbl{};
26
27
    // Legacy cost schedule.
28
    for (auto rev : {EVMC_FRONTIER, EVMC_HOMESTEAD, EVMC_TANGERINE_WHISTLE, EVMC_SPURIOUS_DRAGON,
29
             EVMC_BYZANTIUM, EVMC_PETERSBURG})
30
        tbl[rev] = {false, 200, 20000, 5000, 15000};
31
32
    // Net cost schedule.
33
    tbl[EVMC_CONSTANTINOPLE] = {true, 200, 20000, 5000, 15000};
34
    tbl[EVMC_ISTANBUL] = {true, 800, 20000, 5000, 15000};
35
    tbl[EVMC_BERLIN] = {
36
        true, instr::warm_storage_read_cost, 20000, 5000 - instr::cold_sload_cost, 15000};
37
    tbl[EVMC_LONDON] = {
38
        true, instr::warm_storage_read_cost, 20000, 5000 - instr::cold_sload_cost, 4800};
39
    tbl[EVMC_PARIS] = tbl[EVMC_LONDON];
40
    tbl[EVMC_SHANGHAI] = tbl[EVMC_LONDON];
41
    tbl[EVMC_CANCUN] = tbl[EVMC_LONDON];
42
    tbl[EVMC_PRAGUE] = tbl[EVMC_LONDON];
43
    tbl[EVMC_OSAKA] = tbl[EVMC_LONDON];
44
    tbl[EVMC_EXPERIMENTAL] = tbl[EVMC_LONDON];
45
    return tbl;
46
}();
47
48
49
struct StorageStoreCost
50
{
51
    int16_t gas_cost;
52
    int16_t gas_refund;
53
};
54
55
// The lookup table of SSTORE costs by the storage update status.
56
constexpr auto sstore_costs = []() noexcept {
57
    std::array<std::array<StorageStoreCost, EVMC_STORAGE_MODIFIED_RESTORED + 1>,
58
        EVMC_MAX_REVISION + 1>
59
        tbl{};
60
61
    for (size_t rev = EVMC_FRONTIER; rev <= EVMC_MAX_REVISION; ++rev)
62
    {
63
        auto& e = tbl[rev];
64
        if (const auto c = storage_cost_spec[rev]; !c.net_cost)  // legacy
65
        {
66
            e[EVMC_STORAGE_ADDED] = {c.set, 0};
67
            e[EVMC_STORAGE_DELETED] = {c.reset, c.clear};
68
            e[EVMC_STORAGE_MODIFIED] = {c.reset, 0};
69
            e[EVMC_STORAGE_ASSIGNED] = e[EVMC_STORAGE_MODIFIED];
70
            e[EVMC_STORAGE_DELETED_ADDED] = e[EVMC_STORAGE_ADDED];
71
            e[EVMC_STORAGE_MODIFIED_DELETED] = e[EVMC_STORAGE_DELETED];
72
            e[EVMC_STORAGE_DELETED_RESTORED] = e[EVMC_STORAGE_ADDED];
73
            e[EVMC_STORAGE_ADDED_DELETED] = e[EVMC_STORAGE_DELETED];
74
            e[EVMC_STORAGE_MODIFIED_RESTORED] = e[EVMC_STORAGE_MODIFIED];
75
        }
76
        else  // net cost
77
        {
78
            e[EVMC_STORAGE_ASSIGNED] = {c.warm_access, 0};
79
            e[EVMC_STORAGE_ADDED] = {c.set, 0};
80
            e[EVMC_STORAGE_DELETED] = {c.reset, c.clear};
81
            e[EVMC_STORAGE_MODIFIED] = {c.reset, 0};
82
            e[EVMC_STORAGE_DELETED_ADDED] = {c.warm_access, static_cast<int16_t>(-c.clear)};
83
            e[EVMC_STORAGE_MODIFIED_DELETED] = {c.warm_access, c.clear};
84
            e[EVMC_STORAGE_DELETED_RESTORED] = {
85
                c.warm_access, static_cast<int16_t>(c.reset - c.warm_access - c.clear)};
86
            e[EVMC_STORAGE_ADDED_DELETED] = {
87
                c.warm_access, static_cast<int16_t>(c.set - c.warm_access)};
88
            e[EVMC_STORAGE_MODIFIED_RESTORED] = {
89
                c.warm_access, static_cast<int16_t>(c.reset - c.warm_access)};
90
        }
91
    }
92
93
    return tbl;
94
}();
95
}  // namespace
96
97
Result sload(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
98
943k
{
99
943k
    auto& x = stack.top();
100
943k
    const auto key = intx::be::store<evmc::bytes32>(x);
101
102
943k
    if (state.rev >= EVMC_BERLIN &&
  Branch (102:9): [True: 626k, False: 317k]
+  Branch (102:9): [True: 943k, False: 660]
+
103
943k
        
state.host.access_storage(state.msg->recipient, key) == EVMC_ACCESS_COLD943k
)
  Branch (103:9): [True: 626k, False: 316k]
+
  MC/DC Decision Region (102:9) to (103:81)
+
+  Number of Conditions: 2
+     Condition C1 --> (102:9)
+     Condition C2 --> (103:9)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
104
626k
    {
105
        // The warm storage access cost is already applied (from the cost table).
106
        // Here we need to apply additional cold storage access cost.
107
626k
        constexpr auto additional_cold_sload_cost =
108
626k
            instr::cold_sload_cost - instr::warm_storage_read_cost;
109
626k
        if ((gas_left -= additional_cold_sload_cost) < 0)
  Branch (109:13): [True: 23, False: 626k]
+
110
23
            return {EVMC_OUT_OF_GAS, gas_left};
111
626k
    }
112
113
943k
    x = intx::be::load<uint256>(state.host.get_storage(state.msg->recipient, key));
114
115
943k
    return {EVMC_SUCCESS, gas_left};
116
943k
}
117
118
Result sstore(StackTop stack, int64_t gas_left, ExecutionState& state) noexcept
119
4.58M
{
120
4.58M
    if (state.in_static_mode())
  Branch (120:9): [True: 219k, False: 4.36M]
+
121
219k
        return {EVMC_STATIC_MODE_VIOLATION, gas_left};
122
123
4.36M
    if (state.rev >= EVMC_ISTANBUL && 
gas_left <= 23004.32M
)
  Branch (123:9): [True: 4.32M, False: 38.8k]
+  Branch (123:39): [True: 33.4k, False: 4.29M]
+
  MC/DC Decision Region (123:9) to (123:55)
+
+  Number of Conditions: 2
+     Condition C1 --> (123:9)
+     Condition C2 --> (123:39)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
124
33.4k
        return {EVMC_OUT_OF_GAS, gas_left};
125
126
4.33M
    const auto key = intx::be::store<evmc::bytes32>(stack.pop());
127
4.33M
    const auto value = intx::be::store<evmc::bytes32>(stack.pop());
128
129
4.33M
    const auto gas_cost_cold =
130
4.33M
        (state.rev >= EVMC_BERLIN &&
  Branch (130:10): [True: 4.27M, False: 51.2k]
+
131
4.33M
            
state.host.access_storage(state.msg->recipient, key) == EVMC_ACCESS_COLD4.27M
) ?
  Branch (131:13): [True: 1.47M, False: 2.80M]
+
  MC/DC Decision Region (130:10) to (131:85)
+
+  Number of Conditions: 2
+     Condition C1 --> (130:10)
+     Condition C2 --> (131:13)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
132
1.47M
            instr::cold_sload_cost :
133
4.33M
            
02.85M
;
134
4.33M
    const auto status = state.host.set_storage(state.msg->recipient, key, value);
135
136
4.33M
    const auto [gas_cost_warm, gas_refund] = sstore_costs[state.rev][status];
137
4.33M
    const auto gas_cost = gas_cost_warm + gas_cost_cold;
138
4.33M
    if ((gas_left -= gas_cost) < 0)
  Branch (138:9): [True: 33.8k, False: 4.29M]
+
139
33.8k
        return {EVMC_OUT_OF_GAS, gas_left};
140
4.29M
    state.gas_refund += gas_refund;
141
4.29M
    return {EVMC_SUCCESS, gas_left};
142
4.33M
}
143
}  // namespace evmone::instr::core
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions_xmacro.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions_xmacro.hpp.html new file mode 100644 index 0000000000..0023600242 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone/instructions_xmacro.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone/instructions_xmacro.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
/// The default macro for ON_OPCODE_IDENTIFIER. It redirects to ON_OPCODE.
7
647M
#define ON_OPCODE_IDENTIFIER_DEFAULT(OPCODE, NAME) ON_OPCODE(OPCODE)
8
9
/// The default macro for ON_OPCODE_UNDEFINED. Empty implementation to ignore undefined opcodes.
10
#define ON_OPCODE_UNDEFINED_DEFAULT(OPCODE)
11
12
13
#define ON_OPCODE_IDENTIFIER ON_OPCODE_IDENTIFIER_DEFAULT
14
#define ON_OPCODE_UNDEFINED ON_OPCODE_UNDEFINED_DEFAULT
15
16
17
/// The "X Macro" for opcodes and their matching identifiers.
18
///
19
/// The MAP_OPCODES is an extended variant of X Macro idiom.
20
/// It has 3 knobs for users.
21
///
22
/// 1. The ON_OPCODE(OPCODE) macro must be defined. It will receive all defined opcodes from
23
///    the evmc_opcode enum.
24
/// 2. The ON_OPCODE_UNDEFINED(OPCODE) macro may be defined to receive
25
///    the values of all undefined opcodes.
26
///    This macro is by default alias to ON_OPCODE_UNDEFINED_DEFAULT therefore users must first
27
///    undef it and restore the alias after usage.
28
/// 3. The ON_OPCODE_IDENTIFIER(OPCODE, IDENTIFIER) macro may be defined to receive
29
///    the pairs of all defined opcodes and their matching identifiers.
30
///    This macro is by default alias to ON_OPCODE_IDENTIFIER_DEFAULT therefore users must first
31
///    undef it and restore the alias after usage.
32
///
33
/// See for more about X Macros: https://en.wikipedia.org/wiki/X_Macro.
34
#define MAP_OPCODES                                         \
35
2.65M
    ON_OPCODE_IDENTIFIER(OP_STOP, stop)                     \
36
18.4M
    ON_OPCODE_IDENTIFIER(OP_ADD, add)                       \
37
15.7M
    
ON_OPCODE_IDENTIFIER2.89M
(OP_MUL, mul) \
38
5.94M
    ON_OPCODE_IDENTIFIER(OP_SUB, sub)                       \
39
3.29M
    
ON_OPCODE_IDENTIFIER2.69M
(OP_DIV, div) \
40
2.65M
    ON_OPCODE_IDENTIFIER(OP_SDIV, sdiv)                     \
41
2.80M
    ON_OPCODE_IDENTIFIER(OP_MOD, mod)                       \
42
2.65M
    ON_OPCODE_IDENTIFIER(OP_SMOD, smod)                     \
43
2.65M
    ON_OPCODE_IDENTIFIER(OP_ADDMOD, addmod)                 \
44
2.65M
    ON_OPCODE_IDENTIFIER(OP_MULMOD, mulmod)                 \
45
2.68M
    ON_OPCODE_IDENTIFIER(OP_EXP, exp)                       \
46
2.65M
    ON_OPCODE_IDENTIFIER(OP_SIGNEXTEND, signextend)         \
47
2.65M
    ON_OPCODE_UNDEFINED(0x0c)                               \
48
2.65M
    ON_OPCODE_UNDEFINED(0x0d)                               \
49
2.65M
    ON_OPCODE_UNDEFINED(0x0e)                               \
50
2.65M
    ON_OPCODE_UNDEFINED(0x0f)                               \
51
2.65k
                                                            \
52
5.55M
    ON_OPCODE_IDENTIFIER(OP_LT, lt)                         \
53
3.05M
    ON_OPCODE_IDENTIFIER(OP_GT, gt)                         \
54
2.65M
    ON_OPCODE_IDENTIFIER(OP_SLT, slt)                       \
55
2.65M
    ON_OPCODE_IDENTIFIER(OP_SGT, sgt)                       \
56
3.46M
    ON_OPCODE_IDENTIFIER(OP_EQ, eq)                         \
57
7.92M
    ON_OPCODE_IDENTIFIER(OP_ISZERO, iszero)                 \
58
5.27M
    
ON_OPCODE_IDENTIFIER2.77M
(OP_AND, and_) \
59
2.70M
    ON_OPCODE_IDENTIFIER(OP_OR, or_)                        \
60
2.65M
    ON_OPCODE_IDENTIFIER(OP_XOR, xor_)                      \
61
2.71M
    ON_OPCODE_IDENTIFIER(OP_NOT, not_)                      \
62
2.72M
    ON_OPCODE_IDENTIFIER(OP_BYTE, byte)                     \
63
6.11M
    ON_OPCODE_IDENTIFIER(OP_SHL, shl)                       \
64
3.46M
    
ON_OPCODE_IDENTIFIER2.67M
(OP_SHR, shr) \
65
2.65M
    ON_OPCODE_IDENTIFIER(OP_SAR, sar)                       \
66
2.65M
    ON_OPCODE_IDENTIFIER(OP_CLZ, clz)                       \
67
2.65M
    ON_OPCODE_UNDEFINED(0x1f)                               \
68
2.82k
                                                            \
69
2.66M
    ON_OPCODE_IDENTIFIER(OP_KECCAK256, keccak256)           \
70
2.65M
    ON_OPCODE_UNDEFINED(0x21)                               \
71
2.65M
    ON_OPCODE_UNDEFINED(0x22)                               \
72
2.65M
    ON_OPCODE_UNDEFINED(0x23)                               \
73
2.65M
    ON_OPCODE_UNDEFINED(0x24)                               \
74
2.65M
    ON_OPCODE_UNDEFINED(0x25)                               \
75
2.65M
    ON_OPCODE_UNDEFINED(0x26)                               \
76
2.65M
    ON_OPCODE_UNDEFINED(0x27)                               \
77
2.65M
    ON_OPCODE_UNDEFINED(0x28)                               \
78
2.65M
    ON_OPCODE_UNDEFINED(0x29)                               \
79
2.65M
    ON_OPCODE_UNDEFINED(0x2a)                               \
80
2.65M
    ON_OPCODE_UNDEFINED(0x2b)                               \
81
2.65M
    ON_OPCODE_UNDEFINED(0x2c)                               \
82
2.65M
    ON_OPCODE_UNDEFINED(0x2d)                               \
83
2.65M
    ON_OPCODE_UNDEFINED(0x2e)                               \
84
2.65M
    ON_OPCODE_UNDEFINED(0x2f)                               \
85
13.0k
                                                            \
86
2.69M
    ON_OPCODE_IDENTIFIER(OP_ADDRESS, address)               \
87
2.66M
    ON_OPCODE_IDENTIFIER(OP_BALANCE, balance)               \
88
2.67M
    ON_OPCODE_IDENTIFIER(OP_ORIGIN, origin)                 \
89
2.92M
    ON_OPCODE_IDENTIFIER(OP_CALLER, caller)                 \
90
2.67M
    ON_OPCODE_IDENTIFIER(OP_CALLVALUE, callvalue)           \
91
4.44M
    ON_OPCODE_IDENTIFIER(OP_CALLDATALOAD, calldataload)     \
92
2.83M
    ON_OPCODE_IDENTIFIER(OP_CALLDATASIZE, calldatasize)     \
93
2.77M
    ON_OPCODE_IDENTIFIER(OP_CALLDATACOPY, calldatacopy)     \
94
2.67M
    ON_OPCODE_IDENTIFIER(OP_CODESIZE, codesize)             \
95
2.66M
    ON_OPCODE_IDENTIFIER(OP_CODECOPY, codecopy)             \
96
2.66M
    ON_OPCODE_IDENTIFIER(OP_GASPRICE, gasprice)             \
97
3.12M
    ON_OPCODE_IDENTIFIER(OP_EXTCODESIZE, extcodesize)       \
98
2.66M
    ON_OPCODE_IDENTIFIER(OP_EXTCODECOPY, extcodecopy)       \
99
2.71M
    ON_OPCODE_IDENTIFIER(OP_RETURNDATASIZE, returndatasize) \
100
2.65M
    ON_OPCODE_IDENTIFIER(OP_RETURNDATACOPY, returndatacopy) \
101
2.65M
    ON_OPCODE_IDENTIFIER(OP_EXTCODEHASH, extcodehash)       \
102
3.41k
                                                            \
103
2.72M
    ON_OPCODE_IDENTIFIER(OP_BLOCKHASH, blockhash)           \
104
2.66M
    ON_OPCODE_IDENTIFIER(OP_COINBASE, coinbase)             \
105
2.80M
    ON_OPCODE_IDENTIFIER(OP_TIMESTAMP, timestamp)           \
106
2.78M
    ON_OPCODE_IDENTIFIER(OP_NUMBER, number)                 \
107
2.66M
    ON_OPCODE_IDENTIFIER(OP_PREVRANDAO, prevrandao)         \
108
2.66M
    ON_OPCODE_IDENTIFIER(OP_GASLIMIT, gaslimit)             \
109
2.65M
    ON_OPCODE_IDENTIFIER(OP_CHAINID, chainid)               \
110
2.65M
    ON_OPCODE_IDENTIFIER(OP_SELFBALANCE, selfbalance)       \
111
2.65M
    ON_OPCODE_IDENTIFIER(OP_BASEFEE, basefee)               \
112
2.65M
    ON_OPCODE_IDENTIFIER(OP_BLOBHASH, blobhash)             \
113
2.66M
    ON_OPCODE_IDENTIFIER(OP_BLOBBASEFEE, blobbasefee)       \
114
2.65M
    ON_OPCODE_UNDEFINED(0x4b)                               \
115
2.65M
    ON_OPCODE_UNDEFINED(0x4c)                               \
116
2.65M
    ON_OPCODE_UNDEFINED(0x4d)                               \
117
2.65M
    ON_OPCODE_UNDEFINED(0x4e)                               \
118
2.65M
    ON_OPCODE_UNDEFINED(0x4f)                               \
119
12.8k
                                                            \
120
7.14M
    ON_OPCODE_IDENTIFIER(OP_POP, pop)                       \
121
14.8M
    ON_OPCODE_IDENTIFIER(OP_MLOAD, mload)                   \
122
12.2M
    
ON_OPCODE_IDENTIFIER11.2M
(OP_MSTORE, mstore) \
123
8.63M
    
ON_OPCODE_IDENTIFIER2.80M
(OP_MSTORE8, mstore8) \
124
3.59M
    ON_OPCODE_IDENTIFIER(OP_SLOAD, sload)                   \
125
6.94M
    ON_OPCODE_IDENTIFIER(OP_SSTORE, sstore)                 \
126
8.15M
    ON_OPCODE_IDENTIFIER(OP_JUMP, jump)                     \
127
9.71M
    ON_OPCODE_IDENTIFIER(OP_JUMPI, jumpi)                   \
128
8.33M
    ON_OPCODE_IDENTIFIER(OP_PC, pc)                         \
129
5.68M
    
ON_OPCODE_IDENTIFIER2.66M
(OP_MSIZE, msize) \
130
19.1M
    ON_OPCODE_IDENTIFIER(OP_GAS, gas)                       \
131
26.7M
    ON_OPCODE_IDENTIFIER(OP_JUMPDEST, jumpdest)             \
132
24.0M
    
ON_OPCODE_IDENTIFIER4.53M
(OP_TLOAD, tload) \
133
11.7M
    ON_OPCODE_IDENTIFIER(OP_TSTORE, tstore)                 \
134
9.07M
    
ON_OPCODE_IDENTIFIER2.65M
(OP_MCOPY, mcopy) \
135
3.83M
    ON_OPCODE_IDENTIFIER(OP_PUSH0, push0)                   \
136
1.18M
                                                            \
137
82.3M
    ON_OPCODE_IDENTIFIER(OP_PUSH1, push<1>)                 \
138
79.7M
    
ON_OPCODE_IDENTIFIER12.5M
(OP_PUSH2, push<2>) \
139
9.93M
    
ON_OPCODE_IDENTIFIER3.97M
(OP_PUSH3, push<3>) \
140
2.77M
    ON_OPCODE_IDENTIFIER(OP_PUSH4, push<4>)                 \
141
2.70M
    ON_OPCODE_IDENTIFIER(OP_PUSH5, push<5>)                 \
142
2.70M
    ON_OPCODE_IDENTIFIER(OP_PUSH6, push<6>)                 \
143
2.69M
    ON_OPCODE_IDENTIFIER(OP_PUSH7, push<7>)                 \
144
2.69M
    ON_OPCODE_IDENTIFIER(OP_PUSH8, push<8>)                 \
145
2.69M
    ON_OPCODE_IDENTIFIER(OP_PUSH9, push<9>)                 \
146
2.68M
    ON_OPCODE_IDENTIFIER(OP_PUSH10, push<10>)               \
147
2.67M
    ON_OPCODE_IDENTIFIER(OP_PUSH11, push<11>)               \
148
2.69M
    ON_OPCODE_IDENTIFIER(OP_PUSH12, push<12>)               \
149
2.68M
    ON_OPCODE_IDENTIFIER(OP_PUSH13, push<13>)               \
150
2.68M
    ON_OPCODE_IDENTIFIER(OP_PUSH14, push<14>)               \
151
2.67M
    ON_OPCODE_IDENTIFIER(OP_PUSH15, push<15>)               \
152
29.1k
                                                            \
153
2.69M
    ON_OPCODE_IDENTIFIER(OP_PUSH16, push<16>)               \
154
2.67M
    ON_OPCODE_IDENTIFIER(OP_PUSH17, push<17>)               \
155
2.71M
    ON_OPCODE_IDENTIFIER(OP_PUSH18, push<18>)               \
156
2.68M
    ON_OPCODE_IDENTIFIER(OP_PUSH19, push<19>)               \
157
4.75M
    ON_OPCODE_IDENTIFIER(OP_PUSH20, push<20>)               \
158
2.69M
    ON_OPCODE_IDENTIFIER(OP_PUSH21, push<21>)               \
159
2.68M
    ON_OPCODE_IDENTIFIER(OP_PUSH22, push<22>)               \
160
2.68M
    ON_OPCODE_IDENTIFIER(OP_PUSH23, push<23>)               \
161
2.68M
    ON_OPCODE_IDENTIFIER(OP_PUSH24, push<24>)               \
162
2.68M
    ON_OPCODE_IDENTIFIER(OP_PUSH25, push<25>)               \
163
2.69M
    ON_OPCODE_IDENTIFIER(OP_PUSH26, push<26>)               \
164
2.69M
    ON_OPCODE_IDENTIFIER(OP_PUSH27, push<27>)               \
165
2.67M
    ON_OPCODE_IDENTIFIER(OP_PUSH28, push<28>)               \
166
2.68M
    ON_OPCODE_IDENTIFIER(OP_PUSH29, push<29>)               \
167
2.67M
    ON_OPCODE_IDENTIFIER(OP_PUSH30, push<30>)               \
168
2.74M
    ON_OPCODE_IDENTIFIER(OP_PUSH31, push<31>)               \
169
2.96M
    ON_OPCODE_IDENTIFIER(OP_PUSH32, push<32>)               \
170
312k
                                                            \
171
8.51M
    ON_OPCODE_IDENTIFIER(OP_DUP1, dup<1>)                   \
172
5.86M
    
ON_OPCODE_IDENTIFIER3.88M
(OP_DUP2, dup<2>) \
173
3.27M
    ON_OPCODE_IDENTIFIER(OP_DUP3, dup<3>)                   \
174
2.93M
    ON_OPCODE_IDENTIFIER(OP_DUP4, dup<4>)                   \
175
2.77M
    ON_OPCODE_IDENTIFIER(OP_DUP5, dup<5>)                   \
176
2.71M
    ON_OPCODE_IDENTIFIER(OP_DUP6, dup<6>)                   \
177
2.70M
    ON_OPCODE_IDENTIFIER(OP_DUP7, dup<7>)                   \
178
3.09M
    ON_OPCODE_IDENTIFIER(OP_DUP8, dup<8>)                   \
179
2.67M
    ON_OPCODE_IDENTIFIER(OP_DUP9, dup<9>)                   \
180
2.70M
    ON_OPCODE_IDENTIFIER(OP_DUP10, dup<10>)                 \
181
2.67M
    ON_OPCODE_IDENTIFIER(OP_DUP11, dup<11>)                 \
182
2.66M
    ON_OPCODE_IDENTIFIER(OP_DUP12, dup<12>)                 \
183
2.68M
    ON_OPCODE_IDENTIFIER(OP_DUP13, dup<13>)                 \
184
2.66M
    ON_OPCODE_IDENTIFIER(OP_DUP14, dup<14>)                 \
185
2.67M
    ON_OPCODE_IDENTIFIER(OP_DUP15, dup<15>)                 \
186
2.66M
    ON_OPCODE_IDENTIFIER(OP_DUP16, dup<16>)                 \
187
17.2k
                                                            \
188
3.36M
    ON_OPCODE_IDENTIFIER(OP_SWAP1, swap<1>)                 \
189
3.04M
    ON_OPCODE_IDENTIFIER(OP_SWAP2, swap<2>)                 \
190
2.91M
    ON_OPCODE_IDENTIFIER(OP_SWAP3, swap<3>)                 \
191
2.73M
    ON_OPCODE_IDENTIFIER(OP_SWAP4, swap<4>)                 \
192
2.68M
    ON_OPCODE_IDENTIFIER(OP_SWAP5, swap<5>)                 \
193
2.65M
    ON_OPCODE_IDENTIFIER(OP_SWAP6, swap<6>)                 \
194
2.65M
    ON_OPCODE_IDENTIFIER(OP_SWAP7, swap<7>)                 \
195
2.65M
    ON_OPCODE_IDENTIFIER(OP_SWAP8, swap<8>)                 \
196
2.65M
    ON_OPCODE_IDENTIFIER(OP_SWAP9, swap<9>)                 \
197
2.65M
    ON_OPCODE_IDENTIFIER(OP_SWAP10, swap<10>)               \
198
2.65M
    ON_OPCODE_IDENTIFIER(OP_SWAP11, swap<11>)               \
199
2.65M
    ON_OPCODE_IDENTIFIER(OP_SWAP12, swap<12>)               \
200
2.65M
    ON_OPCODE_IDENTIFIER(OP_SWAP13, swap<13>)               \
201
2.65M
    ON_OPCODE_IDENTIFIER(OP_SWAP14, swap<14>)               \
202
2.65M
    ON_OPCODE_IDENTIFIER(OP_SWAP15, swap<15>)               \
203
2.65M
    ON_OPCODE_IDENTIFIER(OP_SWAP16, swap<16>)               \
204
2.44k
                                                            \
205
2.66M
    ON_OPCODE_IDENTIFIER(OP_LOG0, log<0>)                   \
206
2.65M
    ON_OPCODE_IDENTIFIER(OP_LOG1, log<1>)                   \
207
2.65M
    ON_OPCODE_IDENTIFIER(OP_LOG2, log<2>)                   \
208
2.65M
    ON_OPCODE_IDENTIFIER(OP_LOG3, log<3>)                   \
209
2.65M
    ON_OPCODE_IDENTIFIER(OP_LOG4, log<4>)                   \
210
2.65M
    ON_OPCODE_UNDEFINED(0xa5)                               \
211
2.65M
    ON_OPCODE_UNDEFINED(0xa6)                               \
212
2.65M
    ON_OPCODE_UNDEFINED(0xa7)                               \
213
2.65M
    ON_OPCODE_UNDEFINED(0xa8)                               \
214
2.65M
    ON_OPCODE_UNDEFINED(0xa9)                               \
215
2.65M
    ON_OPCODE_UNDEFINED(0xaa)                               \
216
2.65M
    ON_OPCODE_UNDEFINED(0xab)                               \
217
2.65M
    ON_OPCODE_UNDEFINED(0xac)                               \
218
2.65M
    ON_OPCODE_UNDEFINED(0xad)                               \
219
2.65M
    ON_OPCODE_UNDEFINED(0xae)                               \
220
2.65M
    ON_OPCODE_UNDEFINED(0xaf)                               \
221
898
                                                            \
222
2.65M
    ON_OPCODE_UNDEFINED(0xb0)                               \
223
2.65M
    ON_OPCODE_UNDEFINED(0xb1)                               \
224
2.65M
    ON_OPCODE_UNDEFINED(0xb2)                               \
225
2.65M
    ON_OPCODE_UNDEFINED(0xb3)                               \
226
2.65M
    ON_OPCODE_UNDEFINED(0xb4)                               \
227
2.65M
    ON_OPCODE_UNDEFINED(0xb5)                               \
228
2.65M
    ON_OPCODE_UNDEFINED(0xb6)                               \
229
2.65M
    ON_OPCODE_UNDEFINED(0xb7)                               \
230
2.65M
    ON_OPCODE_UNDEFINED(0xb8)                               \
231
2.65M
    ON_OPCODE_UNDEFINED(0xb9)                               \
232
2.65M
    ON_OPCODE_UNDEFINED(0xba)                               \
233
2.65M
    ON_OPCODE_UNDEFINED(0xbb)                               \
234
2.65M
    ON_OPCODE_UNDEFINED(0xbc)                               \
235
2.65M
    ON_OPCODE_UNDEFINED(0xbd)                               \
236
2.65M
    ON_OPCODE_UNDEFINED(0xbe)                               \
237
2.65M
    ON_OPCODE_UNDEFINED(0xbf)                               \
238
898
                                                            \
239
2.65M
    ON_OPCODE_UNDEFINED(0xc0)                               \
240
2.65M
    ON_OPCODE_UNDEFINED(0xc1)                               \
241
2.65M
    ON_OPCODE_UNDEFINED(0xc2)                               \
242
2.65M
    ON_OPCODE_UNDEFINED(0xc3)                               \
243
2.65M
    ON_OPCODE_UNDEFINED(0xc4)                               \
244
2.65M
    ON_OPCODE_UNDEFINED(0xc5)                               \
245
2.65M
    ON_OPCODE_UNDEFINED(0xc6)                               \
246
2.65M
    ON_OPCODE_UNDEFINED(0xc7)                               \
247
2.65M
    ON_OPCODE_UNDEFINED(0xc8)                               \
248
2.65M
    ON_OPCODE_UNDEFINED(0xc9)                               \
249
2.65M
    ON_OPCODE_UNDEFINED(0xca)                               \
250
2.65M
    ON_OPCODE_UNDEFINED(0xcb)                               \
251
2.65M
    ON_OPCODE_UNDEFINED(0xcc)                               \
252
2.65M
    ON_OPCODE_UNDEFINED(0xcd)                               \
253
2.65M
    ON_OPCODE_UNDEFINED(0xce)                               \
254
2.65M
    ON_OPCODE_UNDEFINED(0xcf)                               \
255
898
                                                            \
256
2.65M
    ON_OPCODE_UNDEFINED(0xd0)                               \
257
2.65M
    ON_OPCODE_UNDEFINED(0xd1)                               \
258
2.65M
    ON_OPCODE_UNDEFINED(0xd2)                               \
259
2.65M
    ON_OPCODE_UNDEFINED(0xd3)                               \
260
2.65M
    ON_OPCODE_UNDEFINED(0xd4)                               \
261
2.65M
    ON_OPCODE_UNDEFINED(0xd5)                               \
262
2.65M
    ON_OPCODE_UNDEFINED(0xd6)                               \
263
2.65M
    ON_OPCODE_UNDEFINED(0xd7)                               \
264
2.65M
    ON_OPCODE_UNDEFINED(0xd8)                               \
265
2.65M
    ON_OPCODE_UNDEFINED(0xd9)                               \
266
2.65M
    ON_OPCODE_UNDEFINED(0xda)                               \
267
2.65M
    ON_OPCODE_UNDEFINED(0xdb)                               \
268
2.65M
    ON_OPCODE_UNDEFINED(0xdc)                               \
269
2.65M
    ON_OPCODE_UNDEFINED(0xdd)                               \
270
2.65M
    ON_OPCODE_UNDEFINED(0xde)                               \
271
2.65M
    ON_OPCODE_UNDEFINED(0xdf)                               \
272
898
                                                            \
273
2.65M
    ON_OPCODE_UNDEFINED(0xe0)                               \
274
2.65M
    ON_OPCODE_UNDEFINED(0xe1)                               \
275
2.65M
    ON_OPCODE_UNDEFINED(0xe2)                               \
276
2.65M
    ON_OPCODE_UNDEFINED(0xe3)                               \
277
2.65M
    ON_OPCODE_UNDEFINED(0xe4)                               \
278
2.65M
    ON_OPCODE_UNDEFINED(0xe5)                               \
279
2.65M
    ON_OPCODE_UNDEFINED(0xe6)                               \
280
2.65M
    ON_OPCODE_UNDEFINED(0xe7)                               \
281
2.65M
    ON_OPCODE_UNDEFINED(0xe8)                               \
282
2.65M
    ON_OPCODE_UNDEFINED(0xe9)                               \
283
2.65M
    ON_OPCODE_UNDEFINED(0xea)                               \
284
2.65M
    ON_OPCODE_UNDEFINED(0xeb)                               \
285
2.65M
    ON_OPCODE_UNDEFINED(0xec)                               \
286
2.65M
    ON_OPCODE_UNDEFINED(0xed)                               \
287
2.65M
    ON_OPCODE_UNDEFINED(0xee)                               \
288
2.65M
    ON_OPCODE_UNDEFINED(0xef)                               \
289
898
                                                            \
290
2.67M
    ON_OPCODE_IDENTIFIER(OP_CREATE, create)                 \
291
3.46M
    ON_OPCODE_IDENTIFIER(OP_CALL, call)                     \
292
2.72M
    ON_OPCODE_IDENTIFIER(OP_CALLCODE, callcode)             \
293
2.65M
    ON_OPCODE_IDENTIFIER(OP_RETURN, return_)                \
294
2.72M
    ON_OPCODE_IDENTIFIER(OP_DELEGATECALL, delegatecall)     \
295
2.66M
    ON_OPCODE_IDENTIFIER(OP_CREATE2, create2)               \
296
2.65M
    ON_OPCODE_UNDEFINED(0xf6)                               \
297
2.65M
    ON_OPCODE_UNDEFINED(0xf7)                               \
298
2.65M
    ON_OPCODE_UNDEFINED(0xf8)                               \
299
2.65M
    ON_OPCODE_UNDEFINED(0xf9)                               \
300
5.64M
    ON_OPCODE_IDENTIFIER(OP_STATICCALL, staticcall)         \
301
2.99M
    
ON_OPCODE_UNDEFINED2.65M
(0xfb) \
302
2.99M
    
ON_OPCODE_UNDEFINED2.65M
(0xfc) \
303
2.99M
    
ON_OPCODE_IDENTIFIER2.65M
(OP_REVERT, revert) \
304
2.65M
    ON_OPCODE_IDENTIFIER(OP_INVALID, invalid)               \
305
2.65M
    ON_OPCODE_IDENTIFIER(OP_SELFDESTRUCT, selfdestruct)
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/blake2b.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/blake2b.cpp.html new file mode 100644 index 0000000000..53079e2ea5 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/blake2b.cpp.html @@ -0,0 +1,3 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/blake2b.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "blake2b.hpp"
6
#include <array>
7
8
namespace evmone::crypto
9
{
10
namespace
11
{
12
[[gnu::always_inline]]
13
inline uint64_t rotr(uint64_t x, unsigned r) noexcept
14
104M
{
15
104M
    return (x >> r) | (x << (64 - r));
16
104M
}
17
18
/// Mixing Function G.
19
/// https://datatracker.ietf.org/doc/html/rfc7693#section-3.1
20
///
21
/// The G primitive function mixes two input words, "x" and "y", into
22
/// four words indexed by "a", "b", "c", and "d" in the working vector v[0..15].
23
[[gnu::always_inline, clang::no_sanitize("coverage"), clang::no_sanitize("undefined")]]
24
void g(uint64_t v[16], size_t a, size_t b, size_t c, size_t d, uint64_t x, uint64_t y) noexcept
25
26.1M
{
26
26.1M
    v[a] = v[a] + v[b] + x;
27
26.1M
    v[d] = rotr(v[d] ^ v[a], 32);
28
26.1M
    v[c] = v[c] + v[d];
29
26.1M
    v[b] = rotr(v[b] ^ v[c], 24);
30
26.1M
    v[a] = v[a] + v[b] + y;
31
26.1M
    v[d] = rotr(v[d] ^ v[a], 16);
32
26.1M
    v[c] = v[c] + v[d];
33
26.1M
    v[b] = rotr(v[b] ^ v[c], 63);
34
26.1M
}
35
}  // namespace
36
37
[[clang::no_sanitize("undefined")]]
38
void blake2b_compress(
39
    uint32_t rounds, uint64_t h[8], const uint64_t m[16], const uint64_t t[2], bool last) noexcept
40
1.02k
{
41
    // Message Schedule SIGMA.
42
    // https://datatracker.ietf.org/doc/html/rfc7693#section-2.7
43
1.02k
    static constexpr uint8_t sigma[10][16]{
44
1.02k
        {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
45
1.02k
        {14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3},
46
1.02k
        {11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4},
47
1.02k
        {7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8},
48
1.02k
        {9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13},
49
1.02k
        {2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9},
50
1.02k
        {12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11},
51
1.02k
        {13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10},
52
1.02k
        {6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5},
53
1.02k
        {10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0},
54
1.02k
    };
55
56
57
    // Initialize local work vector v[0..15].
58
1.02k
    uint64_t v[16]{h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7],  // First half from state.
59
1.02k
        0x6a09e667f3bcc908, 0xbb67ae8584caa73b,                     // Second half from IV.
60
1.02k
        0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,
61
1.02k
        0x510e527fade682d1 ^ t[0],                  // Low word of the offset.
62
1.02k
        0x9b05688c2b3e6c1f ^ t[1],                  // High word.
63
1.02k
        0x1f83d9abfb41bd6b ^ (0 - uint64_t{last}),  // Last block flag? Invert all bits.
64
1.02k
        0x5be0cd19137e2179};
65
66
    // Cryptographic mixing.
67
3.27M
    for (size_t i = 0; i < rounds; 
++i3.27M
)
  Branch (67:24): [True: 3.27M, False: 1.02k]
+
68
3.27M
    {
69
        // Message word selection permutation for this round.
70
3.27M
        const auto& s = sigma[i % std::size(sigma)];
71
72
3.27M
        g(v, 0, 4, 8, 12, m[s[0]], m[s[1]]);
73
3.27M
        g(v, 1, 5, 9, 13, m[s[2]], m[s[3]]);
74
3.27M
        g(v, 2, 6, 10, 14, m[s[4]], m[s[5]]);
75
3.27M
        g(v, 3, 7, 11, 15, m[s[6]], m[s[7]]);
76
3.27M
        g(v, 0, 5, 10, 15, m[s[8]], m[s[9]]);
77
3.27M
        g(v, 1, 6, 11, 12, m[s[10]], m[s[11]]);
78
3.27M
        g(v, 2, 7, 8, 13, m[s[12]], m[s[13]]);
79
3.27M
        g(v, 3, 4, 9, 14, m[s[14]], m[s[15]]);
80
3.27M
    }
81
82
9.21k
    for (size_t i = 0; i < 8; 
++i8.19k
) // XOR the two halves.
  Branch (82:24): [True: 8.19k, False: 1.02k]
+
83
8.19k
        h[i] ^= v[i] ^ v[i + 8];
84
1.02k
}
85
}  // namespace evmone::crypto
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/bls.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/bls.cpp.html new file mode 100644 index 0000000000..e8977b5767 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/bls.cpp.html @@ -0,0 +1,86 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/bls.cpp
Line
Count
Source
1
#include "bls.hpp"
2
#include <blst.h>
3
#include <memory>
4
#include <optional>
5
#include <vector>
6
7
namespace evmone::crypto::bls
8
{
9
namespace
10
{
11
/// Offset of the beginning of field element. First 16 bytes must be zero according to spec
12
/// https://eips.ethereum.org/EIPS/eip-2537#field-elements-encoding
13
constexpr auto FP_BYTES_OFFSET = 64 - 48;
14
15
/// Validates that integer encoded in big endian is valid element of BLS12-381 Fp field
16
[[nodiscard]] std::optional<blst_fp> validate_fp(const uint8_t _p[64]) noexcept
17
565k
{
18
565k
    if (intx::be::unsafe::load<intx::uint512>(_p) >= BLS_FIELD_MODULUS)
  Branch (18:9): [True: 540, False: 564k]
+
19
540
        return std::nullopt;
20
21
564k
    blst_fp p;
22
564k
    blst_fp_from_bendian(&p, &_p[FP_BYTES_OFFSET]);
23
564k
    return p;
24
565k
}
25
26
/// Validates p1 affine point. Checks that point coordinates are from the BLS12-381 field and
27
/// that the point is on curve. https://eips.ethereum.org/EIPS/eip-2537#abi-for-g1-addition
28
[[nodiscard]] std::optional<blst_p1_affine> validate_p1(
29
    const uint8_t _x[64], const uint8_t _y[64]) noexcept
30
95.3k
{
31
95.3k
    const auto x = validate_fp(_x);
32
95.3k
    if (!x.has_value())
  Branch (32:9): [True: 124, False: 95.1k]
+
33
124
        return std::nullopt;
34
95.1k
    const auto y = validate_fp(_y);
35
95.1k
    if (!y.has_value())
  Branch (35:9): [True: 60, False: 95.1k]
+
36
60
        return std::nullopt;
37
38
95.1k
    const blst_p1_affine p0_affine{*x, *y};
39
95.1k
    if (!blst_p1_affine_on_curve(&p0_affine))
  Branch (39:9): [True: 172, False: 94.9k]
+
40
172
        return std::nullopt;
41
42
94.9k
    return p0_affine;
43
95.1k
}
44
45
/// Validates that integer encoded in big endian is valid element of BLS12-381 Fp2 extension field
46
[[nodiscard]] std::optional<blst_fp2> validate_fp2(const uint8_t _p[128]) noexcept
47
187k
{
48
187k
    const auto fp0 = validate_fp(_p);
49
187k
    if (!fp0.has_value())
  Branch (49:9): [True: 192, False: 187k]
+
50
192
        return std::nullopt;
51
187k
    const auto fp1 = validate_fp(&_p[64]);
52
187k
    if (!fp1.has_value())
  Branch (52:9): [True: 128, False: 187k]
+
53
128
        return std::nullopt;
54
55
187k
    return {{*fp0, *fp1}};
56
187k
}
57
58
/// Validates p2 affine point. Checks that point coordinates are from the BLS12-381 field and
59
/// that the point is on curve. https://eips.ethereum.org/EIPS/eip-2537#abi-for-g2-addition
60
[[nodiscard]] std::optional<blst_p2_affine> validate_p2(
61
    const uint8_t _x[128], const uint8_t _y[128]) noexcept
62
93.7k
{
63
93.7k
    const auto x = validate_fp2(_x);
64
93.7k
    if (!x.has_value())
  Branch (64:9): [True: 168, False: 93.6k]
+
65
168
        return std::nullopt;
66
67
93.6k
    const auto y = validate_fp2(_y);
68
93.6k
    if (!y.has_value())
  Branch (68:9): [True: 96, False: 93.5k]
+
69
96
        return std::nullopt;
70
71
93.5k
    const blst_p2_affine p_affine{*x, *y};
72
93.5k
    if (!blst_p2_affine_on_curve(&p_affine))
  Branch (72:9): [True: 164, False: 93.3k]
+
73
164
        return std::nullopt;
74
75
93.3k
    return p_affine;
76
93.5k
}
77
78
/// Stores fp in 64-bytes array with big endian encoding zero padded.
79
void store(uint8_t _rx[64], const blst_fp& _x) noexcept
80
3.01k
{
81
3.01k
    std::memset(_rx, 0, FP_BYTES_OFFSET);
82
3.01k
    blst_bendian_from_fp(&_rx[FP_BYTES_OFFSET], &_x);
83
3.01k
}
84
85
/// Stores fp2 in 128-bytes array with big endian encoding zero padded.
86
void store(uint8_t _rx[128], const blst_fp2& _x) noexcept
87
980
{
88
980
    store(_rx, _x.fp[0]);
89
980
    store(&_rx[64], _x.fp[1]);
90
980
}
91
92
}  // namespace
93
94
[[nodiscard]] bool g1_add(uint8_t _rx[64], uint8_t _ry[64], const uint8_t _x0[64],
95
    const uint8_t _y0[64], const uint8_t _x1[64], const uint8_t _y1[64]) noexcept
96
326
{
97
326
    const auto p0_affine = validate_p1(_x0, _y0);
98
326
    const auto p1_affine = validate_p1(_x1, _y1);
99
100
326
    if (!p0_affine.has_value() || 
!p1_affine.has_value()234
)
  Branch (100:9): [True: 92, False: 234]
+  Branch (100:35): [True: 52, False: 182]
+
  MC/DC Decision Region (100:9) to (100:57)
+
+  Number of Conditions: 2
+     Condition C1 --> (100:9)
+     Condition C2 --> (100:35)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
101
144
        return false;
102
103
182
    blst_p1 p0;
104
182
    blst_p1_from_affine(&p0, &*p0_affine);
105
106
182
    blst_p1 out;
107
182
    blst_p1_add_or_double_affine(&out, &p0, &*p1_affine);
108
109
182
    blst_p1_affine result;
110
182
    blst_p1_to_affine(&result, &out);
111
182
    store(_rx, result.x);
112
182
    store(_ry, result.y);
113
114
182
    return true;
115
326
}
116
117
[[nodiscard]] bool g1_mul(uint8_t _rx[64], uint8_t _ry[64], const uint8_t _x[64],
118
    const uint8_t _y[64], const uint8_t _c[32]) noexcept
119
364
{
120
364
    blst_scalar scalar;
121
364
    blst_scalar_from_bendian(&scalar, _c);
122
123
364
    const auto p_affine = validate_p1(_x, _y);
124
364
    if (!p_affine.has_value())
  Branch (124:9): [True: 108, False: 256]
+
125
108
        return false;
126
127
256
    blst_p1 p;
128
256
    blst_p1_from_affine(&p, &*p_affine);
129
130
256
    if (!blst_p1_in_g1(&p))
  Branch (130:9): [True: 64, False: 192]
+
131
64
        return false;
132
133
192
    blst_p1 out;
134
192
    blst_p1_mult(&out, &p, scalar.b, 256);
135
136
192
    blst_p1_affine result;
137
192
    blst_p1_to_affine(&result, &out);
138
192
    store(_rx, result.x);
139
192
    store(_ry, result.y);
140
141
192
    return true;
142
256
}
143
144
[[nodiscard]] bool g2_add(uint8_t _rx[128], uint8_t _ry[128], const uint8_t _x0[128],
145
    const uint8_t _y0[128], const uint8_t _x1[128], const uint8_t _y1[128]) noexcept
146
350
{
147
350
    const auto p0_affine = validate_p2(_x0, _y0);
148
350
    const auto p1_affine = validate_p2(_x1, _y1);
149
150
350
    if (!p0_affine.has_value() || 
!p1_affine.has_value()242
)
  Branch (150:9): [True: 108, False: 242]
+  Branch (150:35): [True: 68, False: 174]
+
  MC/DC Decision Region (150:9) to (150:57)
+
+  Number of Conditions: 2
+     Condition C1 --> (150:9)
+     Condition C2 --> (150:35)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
151
176
        return false;
152
153
174
    blst_p2 p0;
154
174
    blst_p2_from_affine(&p0, &*p0_affine);
155
156
174
    blst_p2 out;
157
174
    blst_p2_add_or_double_affine(&out, &p0, &*p1_affine);
158
159
174
    blst_p2_affine result;
160
174
    blst_p2_to_affine(&result, &out);
161
174
    store(_rx, result.x);
162
174
    store(_ry, result.y);
163
164
174
    return true;
165
350
}
166
167
[[nodiscard]] bool g2_mul(uint8_t _rx[128], uint8_t _ry[128], const uint8_t _x[128],
168
    const uint8_t _y[128], const uint8_t _c[32]) noexcept
169
376
{
170
376
    blst_scalar scalar;
171
376
    blst_scalar_from_bendian(&scalar, _c);
172
173
376
    const auto p_affine = validate_p2(_x, _y);
174
376
    if (!p_affine.has_value())
  Branch (174:9): [True: 128, False: 248]
+
175
128
        return false;
176
177
248
    blst_p2 p;
178
248
    blst_p2_from_affine(&p, &*p_affine);
179
180
248
    if (!blst_p2_in_g2(&p))
  Branch (180:9): [True: 56, False: 192]
+
181
56
        return false;
182
183
192
    blst_p2 out;
184
192
    blst_p2_mult(&out, &p, scalar.b, 256);
185
186
192
    blst_p2_affine result;
187
192
    blst_p2_to_affine(&result, &out);
188
192
    store(_rx, result.x);
189
192
    store(_ry, result.y);
190
191
192
    return true;
192
248
}
193
194
[[nodiscard]] bool g1_msm(
195
    uint8_t _rx[64], uint8_t _ry[64], const uint8_t* _xycs, size_t size) noexcept
196
1.22k
{
197
1.22k
    constexpr auto SINGLE_ENTRY_SIZE = (64 * 2 + 32);
198
1.22k
    assert(size % SINGLE_ENTRY_SIZE == 0);
199
1.22k
    const auto npoints = size / SINGLE_ENTRY_SIZE;
200
201
1.22k
    std::vector<blst_p1_affine> p1_affines;
202
1.22k
    std::vector<const blst_p1_affine*> p1_affine_ptrs;
203
1.22k
    p1_affines.reserve(npoints);
204
1.22k
    p1_affine_ptrs.reserve(npoints);
205
206
1.22k
    std::vector<blst_scalar> scalars;
207
1.22k
    std::vector<const uint8_t*> scalars_ptrs;
208
1.22k
    scalars.reserve(npoints);
209
1.22k
    scalars_ptrs.reserve(npoints);
210
211
1.22k
    const auto end = _xycs + size;
212
82.2k
    for (auto ptr = _xycs; ptr != end; 
ptr += SINGLE_ENTRY_SIZE80.9k
)
  Branch (212:28): [True: 81.0k, False: 1.17k]
+
213
81.0k
    {
214
81.0k
        const auto p_affine = validate_p1(ptr, &ptr[64]);
215
81.0k
        if (!p_affine.has_value())
  Branch (215:13): [True: 28, False: 81.0k]
+
216
28
            return false;
217
218
81.0k
        if (!blst_p1_affine_in_g1(&*p_affine))
  Branch (218:13): [True: 20, False: 80.9k]
+
219
20
            return false;
220
221
        // Point at infinity must be filtered out for BLST library.
222
80.9k
        if (blst_p1_affine_is_inf(&*p_affine))
  Branch (222:13): [True: 78.2k, False: 2.73k]
+
223
78.2k
            continue;
224
225
2.73k
        const auto& p = p1_affines.emplace_back(*p_affine);
226
2.73k
        p1_affine_ptrs.emplace_back(&p);
227
228
2.73k
        blst_scalar scalar;
229
2.73k
        blst_scalar_from_bendian(&scalar, &ptr[128]);
230
2.73k
        const auto& s = scalars.emplace_back(scalar);
231
2.73k
        scalars_ptrs.emplace_back(s.b);
232
2.73k
    }
233
234
1.17k
    if (p1_affine_ptrs.empty())
  Branch (234:9): [True: 1.10k, False: 70]
+
235
1.10k
    {
236
1.10k
        std::memset(_rx, 0, 64);
237
1.10k
        std::memset(_ry, 0, 64);
238
1.10k
        return true;
239
1.10k
    }
240
241
70
    const auto scratch_size =
242
70
        blst_p1s_mult_pippenger_scratch_sizeof(p1_affine_ptrs.size()) / sizeof(limb_t);
243
70
    const auto scratch_space = std::make_unique_for_overwrite<limb_t[]>(scratch_size);
244
70
    blst_p1 out;
245
70
    blst_p1s_mult_pippenger(&out, p1_affine_ptrs.data(), p1_affine_ptrs.size(), scalars_ptrs.data(),
246
70
        256, scratch_space.get());
247
248
70
    blst_p1_affine result;
249
70
    blst_p1_to_affine(&result, &out);
250
70
    store(_rx, result.x);
251
70
    store(_ry, result.y);
252
253
70
    return true;
254
1.17k
}
255
256
[[nodiscard]] bool g2_msm(
257
    uint8_t _rx[128], uint8_t _ry[128], const uint8_t* _xycs, size_t size) noexcept
258
1.23k
{
259
1.23k
    constexpr auto SINGLE_ENTRY_SIZE = (128 * 2 + 32);
260
1.23k
    assert(size % SINGLE_ENTRY_SIZE == 0);
261
1.23k
    const auto npoints = size / SINGLE_ENTRY_SIZE;
262
263
1.23k
    std::vector<blst_p2_affine> p2_affines;
264
1.23k
    std::vector<const blst_p2_affine*> p2_affine_ptrs;
265
1.23k
    p2_affines.reserve(npoints);
266
1.23k
    p2_affine_ptrs.reserve(npoints);
267
268
1.23k
    std::vector<blst_scalar> scalars;
269
1.23k
    std::vector<const uint8_t*> scalars_ptrs;
270
1.23k
    scalars.reserve(npoints);
271
1.23k
    scalars_ptrs.reserve(npoints);
272
273
1.23k
    const auto end = _xycs + size;
274
80.7k
    for (auto ptr = _xycs; ptr != end; 
ptr += SINGLE_ENTRY_SIZE79.4k
)
  Branch (274:28): [True: 79.5k, False: 1.17k]
+
275
79.5k
    {
276
79.5k
        const auto p_affine = validate_p2(ptr, &ptr[128]);
277
79.5k
        if (!p_affine.has_value())
  Branch (277:13): [True: 36, False: 79.5k]
+
278
36
            return false;
279
280
79.5k
        if (!blst_p2_affine_in_g2(&*p_affine))
  Branch (280:13): [True: 20, False: 79.4k]
+
281
20
            return false;
282
283
        // Point at infinity must be filtered out for BLST library.
284
79.4k
        if (blst_p2_affine_is_inf(&*p_affine))
  Branch (284:13): [True: 78.2k, False: 1.20k]
+
285
78.2k
            continue;
286
287
1.20k
        const auto& p = p2_affines.emplace_back(*p_affine);
288
1.20k
        p2_affine_ptrs.emplace_back(&p);
289
290
1.20k
        blst_scalar scalar;
291
1.20k
        blst_scalar_from_bendian(&scalar, &ptr[256]);
292
1.20k
        const auto& s = scalars.emplace_back(scalar);
293
1.20k
        scalars_ptrs.emplace_back(s.b);
294
1.20k
    }
295
296
1.17k
    if (p2_affine_ptrs.empty())
  Branch (296:9): [True: 1.10k, False: 74]
+
297
1.10k
    {
298
1.10k
        std::memset(_rx, 0, 128);
299
1.10k
        std::memset(_ry, 0, 128);
300
1.10k
        return true;
301
1.10k
    }
302
303
74
    const auto scratch_size =
304
74
        blst_p2s_mult_pippenger_scratch_sizeof(p2_affine_ptrs.size()) / sizeof(limb_t);
305
74
    const auto scratch_space = std::make_unique_for_overwrite<limb_t[]>(scratch_size);
306
74
    blst_p2 out;
307
74
    blst_p2s_mult_pippenger(&out, p2_affine_ptrs.data(), p2_affine_ptrs.size(), scalars_ptrs.data(),
308
74
        256, scratch_space.get());
309
310
74
    blst_p2_affine result;
311
74
    blst_p2_to_affine(&result, &out);
312
74
    store(_rx, result.x);
313
74
    store(_ry, result.y);
314
315
74
    return true;
316
1.17k
}
317
318
[[nodiscard]] bool map_fp_to_g1(uint8_t _rx[64], uint8_t _ry[64], const uint8_t _fp[64]) noexcept
319
118
{
320
118
    const auto fp = validate_fp(_fp);
321
118
    if (!fp.has_value())
  Branch (321:9): [True: 36, False: 82]
+
322
36
        return false;
323
324
82
    blst_p1 out;
325
82
    blst_map_to_g1(&out, &*fp);
326
327
82
    blst_p1_affine result;
328
82
    blst_p1_to_affine(&result, &out);
329
82
    store(_rx, result.x);
330
82
    store(_ry, result.y);
331
332
82
    return true;
333
118
}
334
335
[[nodiscard]] bool map_fp2_to_g2(
336
    uint8_t _rx[128], uint8_t _ry[128], const uint8_t _fp2[128]) noexcept
337
106
{
338
106
    const auto fp2 = validate_fp2(_fp2);
339
106
    if (!fp2.has_value())
  Branch (339:9): [True: 56, False: 50]
+
340
56
        return false;
341
342
50
    blst_p2 out;
343
50
    blst_map_to_g2(&out, &*fp2);
344
345
50
    blst_p2_affine result;
346
50
    blst_p2_to_affine(&result, &out);
347
50
    store(_rx, result.x);
348
50
    store(_ry, result.y);
349
350
50
    return true;
351
106
}
352
353
[[nodiscard]] bool pairing_check(uint8_t _r[32], const uint8_t* _pairs, size_t size) noexcept
354
414
{
355
414
    static constexpr auto FP_SIZE = 64;
356
414
    static constexpr auto FP2_SIZE = 2 * FP_SIZE;
357
414
    static constexpr auto P1_SIZE = 2 * FP_SIZE;
358
414
    static constexpr auto P2_SIZE = 2 * FP2_SIZE;
359
414
    static constexpr auto PAIR_SIZE = P1_SIZE + P2_SIZE;
360
414
    assert(size % PAIR_SIZE == 0);
361
362
414
    auto acc = *blst_fp12_one();
363
414
    const auto pairs_end = _pairs + size;
364
13.4k
    for (auto ptr = _pairs; ptr != pairs_end; 
ptr += PAIR_SIZE13.0k
)
  Branch (364:29): [True: 13.2k, False: 210]
+
365
13.2k
    {
366
13.2k
        const auto P_affine = validate_p1(ptr, &ptr[FP_SIZE]);
367
13.2k
        if (!P_affine.has_value())
  Branch (367:13): [True: 72, False: 13.1k]
+
368
72
            return false;
369
370
13.1k
        const auto Q_affine = validate_p2(&ptr[P1_SIZE], &ptr[P1_SIZE + FP2_SIZE]);
371
13.1k
        if (!Q_affine.has_value())
  Branch (371:13): [True: 84, False: 13.1k]
+
372
84
            return false;
373
374
13.1k
        if (!blst_p1_affine_in_g1(&*P_affine))
  Branch (374:13): [True: 24, False: 13.0k]
+
375
24
            return false;
376
377
13.0k
        if (!blst_p2_affine_in_g2(&*Q_affine))
  Branch (377:13): [True: 24, False: 13.0k]
+
378
24
            return false;
379
380
        // Skip a pair containing any point at infinity.
381
13.0k
        if (blst_p1_affine_is_inf(&*P_affine) || 
blst_p2_affine_is_inf(&*Q_affine)158
)
  Branch (381:13): [True: 12.8k, False: 158]
+  Branch (381:50): [True: 18, False: 140]
+
  MC/DC Decision Region (381:13) to (381:83)
+
+  Number of Conditions: 2
+     Condition C1 --> (381:13)
+     Condition C2 --> (381:50)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
382
12.9k
            continue;
383
384
140
        blst_fp12 ml_res;
385
140
        blst_miller_loop(&ml_res, &*Q_affine, &*P_affine);
386
140
        blst_fp12_mul(&acc, &acc, &ml_res);
387
140
    }
388
389
210
    blst_final_exp(&acc, &acc);
390
210
    const auto result = blst_fp12_is_one(&acc);
391
210
    std::memset(_r, 0, 31);
392
210
    _r[31] = result ? 
1170
:
040
;
  Branch (392:14): [True: 170, False: 40]
+
393
210
    return true;
394
414
}
395
396
}  // namespace evmone::crypto::bls
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/bn254.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/bn254.cpp.html new file mode 100644 index 0000000000..a121c5cac4 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/bn254.cpp.html @@ -0,0 +1,19 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/bn254.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "bn254.hpp"
6
7
namespace evmmax::bn254
8
{
9
static_assert(AffinePoint{} == 0, "default constructed is the point at infinity");
10
11
bool validate(const AffinePoint& pt) noexcept
12
12.1k
{
13
12.1k
    const auto yy = pt.y * pt.y;
14
12.1k
    const auto xxx = pt.x * pt.x * pt.x;
15
12.1k
    const auto on_curve = yy == xxx + Curve::B;
16
12.1k
    return on_curve || 
pt == 06.52k
;
  Branch (16:12): [True: 5.58k, False: 6.52k]
+  Branch (16:24): [True: 4.35k, False: 2.17k]
+
  MC/DC Decision Region (16:12) to (16:31)
+
+  Number of Conditions: 2
+     Condition C1 --> (16:12)
+     Condition C2 --> (16:24)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
17
12.1k
}
18
19
AffinePoint mul(const AffinePoint& pt, const uint256& c) noexcept
20
4.62k
{
21
4.62k
    const auto pr = ecc::mul(pt, c);
22
4.62k
    return ecc::to_affine(pr);
23
4.62k
}
24
}  // namespace evmmax::bn254
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/ecc.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/ecc.hpp.html new file mode 100644 index 0000000000..87a5052d04 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/ecc.hpp.html @@ -0,0 +1,154 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/ecc.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <evmmax/evmmax.hpp>
7
#include <span>
8
9
namespace evmmax::ecc
10
{
11
template <int N>
12
struct Constant : std::integral_constant<int, N>
13
{
14
    consteval explicit(false) Constant(int v) noexcept
15
    {
16
        if (N != v)
17
            intx::unreachable();
18
    }
19
};
20
using zero_t = Constant<0>;
21
using one_t = Constant<1>;
22
23
/// A representation of an element in a prime field.
24
///
25
/// TODO: Combine with BaseFieldElem.
26
template <typename Curve>
27
struct FieldElement
28
{
29
    using uint_type = Curve::uint_type;
30
    static constexpr auto& Fp = Curve::Fp;
31
32
    // TODO: Make this private.
33
    uint_type value_{};
34
35
35.4M
    FieldElement() = default;
evmmax::ecc::FieldElement<evmmax::bn254::Curve>::FieldElement()
Line
Count
Source
35
10.1M
    FieldElement() = default;
evmmax::ecc::FieldElement<evmmax::secp256k1::Curve>::FieldElement()
Line
Count
Source
35
12.7M
    FieldElement() = default;
evmmax::ecc::FieldElement<evmmax::secp256r1::Curve>::FieldElement()
Line
Count
Source
35
12.5M
    FieldElement() = default;
36
37
38.0k
    constexpr explicit FieldElement(uint_type v) : value_{Fp.to_mont(v)} {}
evmmax::ecc::FieldElement<evmmax::bn254::Curve>::FieldElement(intx::uint<256u>)
Line
Count
Source
37
31.4k
    constexpr explicit FieldElement(uint_type v) : value_{Fp.to_mont(v)} {}
evmmax::ecc::FieldElement<evmmax::secp256k1::Curve>::FieldElement(intx::uint<256u>)
Line
Count
Source
37
3.15k
    constexpr explicit FieldElement(uint_type v) : value_{Fp.to_mont(v)} {}
evmmax::ecc::FieldElement<evmmax::secp256r1::Curve>::FieldElement(intx::uint<256u>)
Line
Count
Source
37
3.44k
    constexpr explicit FieldElement(uint_type v) : value_{Fp.to_mont(v)} {}
38
39
16.7k
    constexpr uint_type value() const noexcept { return Fp.from_mont(value_); }
evmmax::ecc::FieldElement<evmmax::bn254::Curve>::value() const
Line
Count
Source
39
14.4k
    constexpr uint_type value() const noexcept { return Fp.from_mont(value_); }
evmmax::ecc::FieldElement<evmmax::secp256k1::Curve>::value() const
Line
Count
Source
39
1.66k
    constexpr uint_type value() const noexcept { return Fp.from_mont(value_); }
evmmax::ecc::FieldElement<evmmax::secp256r1::Curve>::value() const
Line
Count
Source
39
556
    constexpr uint_type value() const noexcept { return Fp.from_mont(value_); }
40
41
    static constexpr FieldElement from_bytes(std::span<const uint8_t, sizeof(uint_type)> b) noexcept
42
24.7k
    {
43
        // TODO: Add intx::load from std::span.
44
24.7k
        return FieldElement{intx::be::unsafe::load<uint_type>(b.data())};
45
24.7k
    }
46
47
    constexpr void to_bytes(std::span<uint8_t, sizeof(uint_type)> b) const noexcept
48
16.1k
    {
49
        // TODO: Add intx::store to std::span.
50
16.1k
        intx::be::unsafe::store(b.data(), value());
51
16.1k
    }
evmmax::ecc::FieldElement<evmmax::bn254::Curve>::to_bytes(std::span<unsigned char, 32ul>) const
Line
Count
Source
48
14.4k
    {
49
        // TODO: Add intx::store to std::span.
50
14.4k
        intx::be::unsafe::store(b.data(), value());
51
14.4k
    }
evmmax::ecc::FieldElement<evmmax::secp256k1::Curve>::to_bytes(std::span<unsigned char, 32ul>) const
Line
Count
Source
48
1.66k
    {
49
        // TODO: Add intx::store to std::span.
50
1.66k
        intx::be::unsafe::store(b.data(), value());
51
1.66k
    }
52
53
54
    constexpr explicit operator bool() const noexcept { return static_cast<bool>(value_); }
55
56
504k
    friend constexpr bool operator==(const FieldElement&, const FieldElement&) = default;
evmmax::ecc::operator==(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
56
197k
    friend constexpr bool operator==(const FieldElement&, const FieldElement&) = default;
evmmax::ecc::operator==(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
56
168k
    friend constexpr bool operator==(const FieldElement&, const FieldElement&) = default;
evmmax::ecc::operator==(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
56
139k
    friend constexpr bool operator==(const FieldElement&, const FieldElement&) = default;
57
58
396k
    friend constexpr bool operator==(const FieldElement& a, zero_t) noexcept { return !a.value_; }
evmmax::ecc::operator==(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
58
90.0k
    friend constexpr bool operator==(const FieldElement& a, zero_t) noexcept { return !a.value_; }
evmmax::ecc::operator==(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
58
167k
    friend constexpr bool operator==(const FieldElement& a, zero_t) noexcept { return !a.value_; }
evmmax::ecc::operator==(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
58
138k
    friend constexpr bool operator==(const FieldElement& a, zero_t) noexcept { return !a.value_; }
59
60
    friend constexpr auto operator*(const FieldElement& a, const FieldElement& b) noexcept
61
11.1M
    {
62
11.1M
        return wrap(Fp.mul(a.value_, b.value_));
63
11.1M
    }
evmmax::ecc::operator*(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
61
3.21M
    {
62
3.21M
        return wrap(Fp.mul(a.value_, b.value_));
63
3.21M
    }
evmmax::ecc::operator*(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
61
4.27M
    {
62
4.27M
        return wrap(Fp.mul(a.value_, b.value_));
63
4.27M
    }
evmmax::ecc::operator*(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
61
3.63M
    {
62
3.63M
        return wrap(Fp.mul(a.value_, b.value_));
63
3.63M
    }
64
65
    friend constexpr auto operator+(const FieldElement& a, const FieldElement& b) noexcept
66
16.1M
    {
67
16.1M
        return wrap(Fp.add(a.value_, b.value_));
68
16.1M
    }
evmmax::ecc::operator+(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
66
4.54M
    {
67
4.54M
        return wrap(Fp.add(a.value_, b.value_));
68
4.54M
    }
evmmax::ecc::operator+(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
66
5.37M
    {
67
5.37M
        return wrap(Fp.add(a.value_, b.value_));
68
5.37M
    }
evmmax::ecc::operator+(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
66
6.26M
    {
67
6.26M
        return wrap(Fp.add(a.value_, b.value_));
68
6.26M
    }
69
70
    friend constexpr auto operator-(const FieldElement& a, const FieldElement& b) noexcept
71
7.25M
    {
72
7.25M
        return wrap(Fp.sub(a.value_, b.value_));
73
7.25M
    }
evmmax::ecc::operator-(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
71
2.10M
    {
72
2.10M
        return wrap(Fp.sub(a.value_, b.value_));
73
2.10M
    }
evmmax::ecc::operator-(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
71
2.74M
    {
72
2.74M
        return wrap(Fp.sub(a.value_, b.value_));
73
2.74M
    }
evmmax::ecc::operator-(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
71
2.41M
    {
72
2.41M
        return wrap(Fp.sub(a.value_, b.value_));
73
2.41M
    }
74
75
    friend constexpr auto operator-(const FieldElement& a) noexcept
76
    {
77
        return wrap(Fp.sub(0, a.value_));
78
    }
79
80
    friend constexpr auto operator/(one_t, const FieldElement& a) noexcept
81
6.07k
    {
82
6.07k
        return wrap(Fp.inv(a.value_));
83
6.07k
    }
evmmax::ecc::operator/(evmmax::ecc::Constant<1>, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
81
4.62k
    {
82
4.62k
        return wrap(Fp.inv(a.value_));
83
4.62k
    }
evmmax::ecc::operator/(evmmax::ecc::Constant<1>, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
81
890
    {
82
890
        return wrap(Fp.inv(a.value_));
83
890
    }
evmmax::ecc::operator/(evmmax::ecc::Constant<1>, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
81
556
    {
82
556
        return wrap(Fp.inv(a.value_));
83
556
    }
84
85
    friend constexpr auto operator/(const FieldElement& a, const FieldElement& b) noexcept
86
888
    {
87
888
        return wrap(Fp.mul(a.value_, Fp.inv(b.value_)));
88
888
    }
89
90
    /// Wraps a raw value into the Element type assuming it is already in Montgomery form.
91
    /// TODO: Make this private.
92
    [[gnu::always_inline]] static constexpr FieldElement wrap(const uint_type& v) noexcept
93
34.5M
    {
94
34.5M
        FieldElement element;
95
34.5M
        element.value_ = v;
96
34.5M
        return element;
97
34.5M
    }
evmmax::ecc::FieldElement<evmmax::bn254::Curve>::wrap(intx::uint<256u> const&)
Line
Count
Source
93
9.86M
    {
94
9.86M
        FieldElement element;
95
9.86M
        element.value_ = v;
96
9.86M
        return element;
97
9.86M
    }
evmmax::ecc::FieldElement<evmmax::secp256k1::Curve>::wrap(intx::uint<256u> const&)
Line
Count
Source
93
12.4M
    {
94
12.4M
        FieldElement element;
95
12.4M
        element.value_ = v;
96
12.4M
        return element;
97
12.4M
    }
evmmax::ecc::FieldElement<evmmax::secp256r1::Curve>::wrap(intx::uint<256u> const&)
Line
Count
Source
93
12.3M
    {
94
12.3M
        FieldElement element;
95
12.3M
        element.value_ = v;
96
12.3M
        return element;
97
12.3M
    }
98
};
99
100
/// The affine (two coordinates) point on an Elliptic Curve over a prime field.
101
template <typename ValueT>
102
struct Point
103
{
104
    ValueT x = {};
105
    ValueT y = {};
106
107
2.00k
    friend constexpr Point operator-(const Point& p) noexcept { return {p.x, -p.y}; }
108
};
109
110
/// The affine (two coordinates) point on an Elliptic Curve over a prime field.
111
template <typename Curve>
112
struct AffinePoint
113
{
114
    using FE = FieldElement<Curve>;
115
116
    FE x;
117
    FE y;
118
119
444k
    AffinePoint() = default;
evmmax::ecc::AffinePoint<evmmax::bn254::Curve>::AffinePoint()
Line
Count
Source
119
138k
    AffinePoint() = default;
evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve>::AffinePoint()
Line
Count
Source
119
167k
    AffinePoint() = default;
evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve>::AffinePoint()
Line
Count
Source
119
137k
    AffinePoint() = default;
120
20.8k
    constexpr AffinePoint(const FE& x_, const FE& y_) noexcept : x{x_}, y{y_} {}
evmmax::ecc::AffinePoint<evmmax::bn254::Curve>::AffinePoint(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
120
17.8k
    constexpr AffinePoint(const FE& x_, const FE& y_) noexcept : x{x_}, y{y_} {}
evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve>::AffinePoint(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
120
1.78k
    constexpr AffinePoint(const FE& x_, const FE& y_) noexcept : x{x_}, y{y_} {}
evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve>::AffinePoint(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
120
1.17k
    constexpr AffinePoint(const FE& x_, const FE& y_) noexcept : x{x_}, y{y_} {}
121
122
    /// Create the point from literal values.
123
    consteval AffinePoint(const Curve::uint_type& x_value, const Curve::uint_type& y_value) noexcept
124
      : x{x_value}, y{y_value}
125
    {}
126
127
1.61M
    friend constexpr bool operator==(const AffinePoint&, const AffinePoint&) = default;
evmmax::ecc::operator==(evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&, evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&)
Line
Count
Source
127
693k
    friend constexpr bool operator==(const AffinePoint&, const AffinePoint&) = default;
  Branch (127:86): [True: 231k, Folded]
+  Branch (127:86): [True: 231k, Folded]
+
evmmax::ecc::operator==(evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&, evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
127
502k
    friend constexpr bool operator==(const AffinePoint&, const AffinePoint&) = default;
  Branch (127:86): [True: 167k, Folded]
+  Branch (127:86): [True: 167k, Folded]
+
evmmax::ecc::operator==(evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> const&, evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
127
414k
    friend constexpr bool operator==(const AffinePoint&, const AffinePoint&) = default;
  Branch (127:86): [True: 138k, Folded]
+  Branch (127:86): [True: 138k, Folded]
+
  Branch (127:86): [True: 231k, Folded]
+  Branch (127:86): [True: 231k, Folded]
+
  Branch (127:86): [True: 167k, Folded]
+  Branch (127:86): [True: 167k, Folded]
+
  Branch (127:86): [True: 138k, Folded]
+  Branch (127:86): [True: 138k, Folded]
+
128
129
    friend constexpr bool operator==(const AffinePoint& p, zero_t) noexcept
130
443k
    {
131
443k
        return p == AffinePoint{};
132
443k
    }
evmmax::ecc::operator==(evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
130
138k
    {
131
138k
        return p == AffinePoint{};
132
138k
    }
evmmax::ecc::operator==(evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
130
167k
    {
131
167k
        return p == AffinePoint{};
132
167k
    }
evmmax::ecc::operator==(evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
130
137k
    {
131
137k
        return p == AffinePoint{};
132
137k
    }
133
134
    static constexpr AffinePoint from_bytes(std::span<const uint8_t, sizeof(FE) * 2> b) noexcept
135
12.3k
    {
136
12.3k
        const auto x = FE::from_bytes(b.template subspan<0, sizeof(FE)>());
137
12.3k
        const auto y = FE::from_bytes(b.template subspan<sizeof(FE), sizeof(FE)>());
138
12.3k
        return {x, y};
139
12.3k
    }
140
141
    constexpr void to_bytes(std::span<uint8_t, sizeof(FE) * 2> b) const noexcept
142
8.07k
    {
143
8.07k
        x.to_bytes(b.template subspan<0, sizeof(FE)>());
144
8.07k
        y.to_bytes(b.template subspan<sizeof(FE), sizeof(FE)>());
145
8.07k
    }
evmmax::ecc::AffinePoint<evmmax::bn254::Curve>::to_bytes(std::span<unsigned char, 64ul>) const
Line
Count
Source
142
7.24k
    {
143
7.24k
        x.to_bytes(b.template subspan<0, sizeof(FE)>());
144
7.24k
        y.to_bytes(b.template subspan<sizeof(FE), sizeof(FE)>());
145
7.24k
    }
evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve>::to_bytes(std::span<unsigned char, 64ul>) const
Line
Count
Source
142
832
    {
143
832
        x.to_bytes(b.template subspan<0, sizeof(FE)>());
144
832
        y.to_bytes(b.template subspan<sizeof(FE), sizeof(FE)>());
145
832
    }
146
};
147
148
/// Elliptic curve point in Jacobian coordinates (X, Y, Z)
149
/// representing the affine point (X/Z², Y/Z³).
150
/// TODO: Merge with JacPoint.
151
template <typename Curve>
152
struct ProjPoint
153
{
154
    using FE = FieldElement<Curve>;
155
    FE x;
156
    FE y{1};  // TODO: Make sure this is compile-time constant.
157
    FE z;
158
159
7.51k
    ProjPoint() = default;
evmmax::ecc::ProjPoint<evmmax::bn254::Curve>::ProjPoint()
Line
Count
Source
159
4.62k
    ProjPoint() = default;
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve>::ProjPoint()
Line
Count
Source
159
1.78k
    ProjPoint() = default;
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve>::ProjPoint()
Line
Count
Source
159
1.11k
    ProjPoint() = default;
160
1.31M
    constexpr ProjPoint(const FE& x_, const FE& y_, const FE& z_) noexcept : x{x_}, y{y_}, z{z_} {}
evmmax::ecc::ProjPoint<evmmax::bn254::Curve>::ProjPoint(evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&, evmmax::ecc::FieldElement<evmmax::bn254::Curve> const&)
Line
Count
Source
160
401k
    constexpr ProjPoint(const FE& x_, const FE& y_, const FE& z_) noexcept : x{x_}, y{y_}, z{z_} {}
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve>::ProjPoint(evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256k1::Curve> const&)
Line
Count
Source
160
515k
    constexpr ProjPoint(const FE& x_, const FE& y_, const FE& z_) noexcept : x{x_}, y{y_}, z{z_} {}
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve>::ProjPoint(evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&, evmmax::ecc::FieldElement<evmmax::secp256r1::Curve> const&)
Line
Count
Source
160
402k
    constexpr ProjPoint(const FE& x_, const FE& y_, const FE& z_) noexcept : x{x_}, y{y_}, z{z_} {}
161
4.52k
    constexpr explicit ProjPoint(const AffinePoint<Curve>& p) noexcept : x{p.x}, y{p.y}, z{FE{1}} {}
evmmax::ecc::ProjPoint<evmmax::bn254::Curve>::ProjPoint(evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&)
Line
Count
Source
161
2.05k
    constexpr explicit ProjPoint(const AffinePoint<Curve>& p) noexcept : x{p.x}, y{p.y}, z{FE{1}} {}
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve>::ProjPoint(evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
161
1.37k
    constexpr explicit ProjPoint(const AffinePoint<Curve>& p) noexcept : x{p.x}, y{p.y}, z{FE{1}} {}
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve>::ProjPoint(evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
161
1.10k
    constexpr explicit ProjPoint(const AffinePoint<Curve>& p) noexcept : x{p.x}, y{p.y}, z{FE{1}} {}
162
163
394k
    friend constexpr bool operator==(const ProjPoint& p, zero_t) noexcept { return p.z == 0; }
evmmax::ecc::operator==(evmmax::ecc::ProjPoint<evmmax::bn254::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
163
88.3k
    friend constexpr bool operator==(const ProjPoint& p, zero_t) noexcept { return p.z == 0; }
evmmax::ecc::operator==(evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
163
167k
    friend constexpr bool operator==(const ProjPoint& p, zero_t) noexcept { return p.z == 0; }
evmmax::ecc::operator==(evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&, evmmax::ecc::Constant<0>)
Line
Count
Source
163
138k
    friend constexpr bool operator==(const ProjPoint& p, zero_t) noexcept { return p.z == 0; }
164
165
    friend constexpr bool operator==(const ProjPoint& p, const ProjPoint& q) noexcept
166
1.02k
    {
167
1.02k
        const auto& [x1, y1, z1] = p;
168
1.02k
        const auto& [x2, y2, z2] = q;
169
1.02k
        const auto z1z1 = z1 * z1;
170
1.02k
        const auto z1z1z1 = z1z1 * z1;
171
1.02k
        const auto z2z2 = z2 * z2;
172
1.02k
        const auto z2z2z2 = z2z2 * z2;
173
1.02k
        return x1 * z2z2 == x2 * z1z1 && 
y1 * z2z2z2 == y2 * z1z1z1174
;
  Branch (173:16): [True: 136, False: 344]
+  Branch (173:42): [True: 78, False: 58]
+
  Branch (173:16): [True: 38, False: 510]
+  Branch (173:42): [True: 14, False: 24]
+
  MC/DC Decision Region (173:16) to (173:68)
+
+  Number of Conditions: 2
+     Condition C1 --> (173:16)
+     Condition C2 --> (173:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
  MC/DC Decision Region (173:16) to (173:68)
+
+  Number of Conditions: 2
+     Condition C1 --> (173:16)
+     Condition C2 --> (173:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
174
1.02k
    }
evmmax::ecc::operator==(evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&, evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
166
480
    {
167
480
        const auto& [x1, y1, z1] = p;
168
480
        const auto& [x2, y2, z2] = q;
169
480
        const auto z1z1 = z1 * z1;
170
480
        const auto z1z1z1 = z1z1 * z1;
171
480
        const auto z2z2 = z2 * z2;
172
480
        const auto z2z2z2 = z2z2 * z2;
173
480
        return x1 * z2z2 == x2 * z1z1 && 
y1 * z2z2z2 == y2 * z1z1z1136
;
  Branch (173:16): [True: 136, False: 344]
+  Branch (173:42): [True: 78, False: 58]
+
  MC/DC Decision Region (173:16) to (173:68)
+
+  Number of Conditions: 2
+     Condition C1 --> (173:16)
+     Condition C2 --> (173:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
174
480
    }
evmmax::ecc::operator==(evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&, evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
166
548
    {
167
548
        const auto& [x1, y1, z1] = p;
168
548
        const auto& [x2, y2, z2] = q;
169
548
        const auto z1z1 = z1 * z1;
170
548
        const auto z1z1z1 = z1z1 * z1;
171
548
        const auto z2z2 = z2 * z2;
172
548
        const auto z2z2z2 = z2z2 * z2;
173
548
        return x1 * z2z2 == x2 * z1z1 && 
y1 * z2z2z2 == y2 * z1z1z138
;
  Branch (173:16): [True: 38, False: 510]
+  Branch (173:42): [True: 14, False: 24]
+
  MC/DC Decision Region (173:16) to (173:68)
+
+  Number of Conditions: 2
+     Condition C1 --> (173:16)
+     Condition C2 --> (173:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
174
548
    }
175
176
    friend constexpr ProjPoint operator-(const ProjPoint& p) noexcept { return {p.x, -p.y, p.z}; }
177
};
178
179
// Jacobian (three) coordinates point implementation.
180
template <typename ValueT>
181
struct JacPoint
182
{
183
    ValueT x = 1;
184
    ValueT y = 1;
185
    ValueT z = 0;
186
187
    // Compares two Jacobian coordinates points
188
    friend constexpr bool operator==(const JacPoint& a, const JacPoint& b) noexcept
189
1.51k
    {
190
1.51k
        const auto bz2 = b.z * b.z;
191
1.51k
        const auto az2 = a.z * a.z;
192
193
1.51k
        const auto bz3 = bz2 * b.z;
194
1.51k
        const auto az3 = az2 * a.z;
195
196
1.51k
        return a.x * bz2 == b.x * az2 && 
a.y * bz3 == b.y * az31.04k
;
  Branch (196:16): [True: 1.04k, False: 474]
+  Branch (196:42): [True: 1.04k, False: 0]
+
  MC/DC Decision Region (196:16) to (196:64)
+
+  Number of Conditions: 2
+     Condition C1 --> (196:16)
+     Condition C2 --> (196:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  T  = T      }
+
+  C1-Pair: covered: (1,2)
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 50.00%
+
197
1.51k
    }
198
199
    friend constexpr JacPoint operator-(const JacPoint& p) noexcept { return {p.x, -p.y, p.z}; }
200
201
    // Creates Jacobian coordinates point from affine point
202
    static constexpr JacPoint from(const ecc::Point<ValueT>& ap) noexcept
203
2.52k
    {
204
2.52k
        return {ap.x, ap.y, ValueT::one()};
205
2.52k
    }
206
};
207
208
template <typename IntT>
209
using InvFn = IntT (*)(const ModArith<IntT>&, const IntT& x) noexcept;
210
211
/// Converts a projected point to an affine point.
212
template <typename Curve>
213
inline AffinePoint<Curve> to_affine(const ProjPoint<Curve>& p) noexcept
214
6.07k
{
215
    // This works correctly for the point at infinity (z == 0) because then z_inv == 0.
216
6.07k
    const auto z_inv = 1 / p.z;
217
6.07k
    const auto zz_inv = z_inv * z_inv;
218
6.07k
    const auto zzz_inv = zz_inv * z_inv;
219
6.07k
    return {p.x * zz_inv, p.y * zzz_inv};
220
6.07k
}
evmmax::ecc::AffinePoint<evmmax::bn254::Curve> evmmax::ecc::to_affine<evmmax::bn254::Curve>(evmmax::ecc::ProjPoint<evmmax::bn254::Curve> const&)
Line
Count
Source
214
4.62k
{
215
    // This works correctly for the point at infinity (z == 0) because then z_inv == 0.
216
4.62k
    const auto z_inv = 1 / p.z;
217
4.62k
    const auto zz_inv = z_inv * z_inv;
218
4.62k
    const auto zzz_inv = zz_inv * z_inv;
219
4.62k
    return {p.x * zz_inv, p.y * zzz_inv};
220
4.62k
}
evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> evmmax::ecc::to_affine<evmmax::secp256k1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
214
890
{
215
    // This works correctly for the point at infinity (z == 0) because then z_inv == 0.
216
890
    const auto z_inv = 1 / p.z;
217
890
    const auto zz_inv = z_inv * z_inv;
218
890
    const auto zzz_inv = zz_inv * z_inv;
219
890
    return {p.x * zz_inv, p.y * zzz_inv};
220
890
}
evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> evmmax::ecc::to_affine<evmmax::secp256r1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
214
556
{
215
    // This works correctly for the point at infinity (z == 0) because then z_inv == 0.
216
556
    const auto z_inv = 1 / p.z;
217
556
    const auto zz_inv = z_inv * z_inv;
218
556
    const auto zzz_inv = zz_inv * z_inv;
219
556
    return {p.x * zz_inv, p.y * zzz_inv};
220
556
}
221
222
/// Elliptic curve point addition in affine coordinates.
223
///
224
/// Computes P ⊕ Q for two points in affine coordinates on the elliptic curve.
225
template <typename Curve>
226
AffinePoint<Curve> add(const AffinePoint<Curve>& p, const AffinePoint<Curve>& q) noexcept
227
2.61k
{
228
2.61k
    if (p == 0)
  Branch (228:9): [True: 1.02k, False: 1.59k]
+
229
1.02k
        return q;
230
1.59k
    if (q == 0)
  Branch (230:9): [True: 558, False: 1.03k]
+
231
558
        return p;
232
233
1.03k
    const auto& [x1, y1] = p;
234
1.03k
    const auto& [x2, y2] = q;
235
236
    // Use classic formula for point addition.
237
    // https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication#Point_operations
238
239
1.03k
    auto dx = x2 - x1;
240
1.03k
    auto dy = y2 - y1;
241
1.03k
    if (dx == 0)
  Branch (241:9): [True: 672, False: 360]
+
242
672
    {
243
672
        if (dy != 0)    // For opposite points
  Branch (243:13): [True: 144, False: 528]
+
244
144
            return {};  // return the point at infinity.
245
246
        // For coincident points find the slope of the tangent line.
247
528
        const auto xx = x1 * x1;
248
528
        dy = xx + xx + xx;
249
528
        dx = y1 + y1;
250
528
    }
251
888
    const auto slope = dy / dx;
252
253
888
    const auto xr = slope * slope - x1 - x2;
254
888
    const auto yr = slope * (x1 - xr) - y1;
255
888
    return {xr, yr};
256
1.03k
}
257
258
/// Elliptic curve point addition in Jacobian coordinates.
259
///
260
/// Computes P ⊕ Q for two points in Jacobian coordinates on the elliptic curve.
261
/// This procedure handles all inputs (e.g. doubling or points at infinity).
262
template <typename Curve>
263
ProjPoint<Curve> add(const ProjPoint<Curve>& p, const ProjPoint<Curve>& q) noexcept
264
1.44k
{
265
1.44k
    if (p == 0)
  Branch (265:9): [True: 410, False: 480]
+
  Branch (265:9): [True: 8, False: 548]
+
266
418
        return q;
267
1.02k
    if (q == 0)
  Branch (267:9): [True: 0, False: 480]
+
  Branch (267:9): [True: 0, False: 548]
+
268
        // TODO: Untested and untestable via precompile call (for secp256k1 and secp256r1).
269
0
        return p;
270
271
1.02k
    if (p == q)
  Branch (271:9): [True: 78, False: 402]
+
  Branch (271:9): [True: 14, False: 534]
+
272
92
        return dbl(p);
273
274
    // Use the "add-1998-cmo-2" formula for curve in Jacobian coordinates.
275
    // The cost is 12M + 4S + 6add + 1*2.
276
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-add-1998-cmo-2
277
    // TODO: The newer formula "add-2007-bl" trades one multiplication for one squaring and
278
    //   additional additions. We don't have dedicated squaring operation yet, so it's not clear
279
    //   if it would be faster.
280
281
936
    const auto& [x1, y1, z1] = p;
282
936
    const auto& [x2, y2, z2] = q;
283
284
936
    const auto z1z1 = z1 * z1;
285
936
    const auto z2z2 = z2 * z2;
286
936
    const auto u1 = x1 * z2z2;
287
936
    const auto u2 = x2 * z1z1;
288
936
    const auto z1z1z1 = z1 * z1z1;
289
936
    const auto z2z2z2 = z2 * z2z2;
290
936
    const auto s1 = y1 * z2z2z2;
291
936
    const auto s2 = y2 * z1z1z1;
292
936
    const auto h = u2 - u1;
293
936
    const auto r = s2 - s1;
294
936
    assert(h != 0 || r != 0);  // We already handled p == q case above.
295
936
    const auto hh = h * h;
296
936
    const auto hhh = h * hh;
297
936
    const auto v = u1 * hh;
298
936
    const auto t2 = r * r;
299
936
    const auto t3 = v + v;
300
936
    const auto t4 = t2 - hhh;
301
936
    const auto x3 = t4 - t3;
302
936
    const auto t5 = v - x3;
303
936
    const auto t6 = s1 * hhh;
304
936
    const auto t7 = r * t5;
305
936
    const auto y3 = t7 - t6;
306
936
    const auto t8 = z2 * h;
307
936
    const auto z3 = z1 * t8;
308
309
936
    return {x3, y3, z3};
310
1.02k
}
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> evmmax::ecc::add<evmmax::secp256k1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&, evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
264
890
{
265
890
    if (p == 0)
  Branch (265:9): [True: 410, False: 480]
+
266
410
        return q;
267
480
    if (q == 0)
  Branch (267:9): [True: 0, False: 480]
+
268
        // TODO: Untested and untestable via precompile call (for secp256k1 and secp256r1).
269
0
        return p;
270
271
480
    if (p == q)
  Branch (271:9): [True: 78, False: 402]
+
272
78
        return dbl(p);
273
274
    // Use the "add-1998-cmo-2" formula for curve in Jacobian coordinates.
275
    // The cost is 12M + 4S + 6add + 1*2.
276
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-add-1998-cmo-2
277
    // TODO: The newer formula "add-2007-bl" trades one multiplication for one squaring and
278
    //   additional additions. We don't have dedicated squaring operation yet, so it's not clear
279
    //   if it would be faster.
280
281
402
    const auto& [x1, y1, z1] = p;
282
402
    const auto& [x2, y2, z2] = q;
283
284
402
    const auto z1z1 = z1 * z1;
285
402
    const auto z2z2 = z2 * z2;
286
402
    const auto u1 = x1 * z2z2;
287
402
    const auto u2 = x2 * z1z1;
288
402
    const auto z1z1z1 = z1 * z1z1;
289
402
    const auto z2z2z2 = z2 * z2z2;
290
402
    const auto s1 = y1 * z2z2z2;
291
402
    const auto s2 = y2 * z1z1z1;
292
402
    const auto h = u2 - u1;
293
402
    const auto r = s2 - s1;
294
402
    assert(h != 0 || r != 0);  // We already handled p == q case above.
295
402
    const auto hh = h * h;
296
402
    const auto hhh = h * hh;
297
402
    const auto v = u1 * hh;
298
402
    const auto t2 = r * r;
299
402
    const auto t3 = v + v;
300
402
    const auto t4 = t2 - hhh;
301
402
    const auto x3 = t4 - t3;
302
402
    const auto t5 = v - x3;
303
402
    const auto t6 = s1 * hhh;
304
402
    const auto t7 = r * t5;
305
402
    const auto y3 = t7 - t6;
306
402
    const auto t8 = z2 * h;
307
402
    const auto z3 = z1 * t8;
308
309
402
    return {x3, y3, z3};
310
480
}
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> evmmax::ecc::add<evmmax::secp256r1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&, evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
264
556
{
265
556
    if (p == 0)
  Branch (265:9): [True: 8, False: 548]
+
266
8
        return q;
267
548
    if (q == 0)
  Branch (267:9): [True: 0, False: 548]
+
268
        // TODO: Untested and untestable via precompile call (for secp256k1 and secp256r1).
269
0
        return p;
270
271
548
    if (p == q)
  Branch (271:9): [True: 14, False: 534]
+
272
14
        return dbl(p);
273
274
    // Use the "add-1998-cmo-2" formula for curve in Jacobian coordinates.
275
    // The cost is 12M + 4S + 6add + 1*2.
276
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-add-1998-cmo-2
277
    // TODO: The newer formula "add-2007-bl" trades one multiplication for one squaring and
278
    //   additional additions. We don't have dedicated squaring operation yet, so it's not clear
279
    //   if it would be faster.
280
281
534
    const auto& [x1, y1, z1] = p;
282
534
    const auto& [x2, y2, z2] = q;
283
284
534
    const auto z1z1 = z1 * z1;
285
534
    const auto z2z2 = z2 * z2;
286
534
    const auto u1 = x1 * z2z2;
287
534
    const auto u2 = x2 * z1z1;
288
534
    const auto z1z1z1 = z1 * z1z1;
289
534
    const auto z2z2z2 = z2 * z2z2;
290
534
    const auto s1 = y1 * z2z2z2;
291
534
    const auto s2 = y2 * z1z1z1;
292
534
    const auto h = u2 - u1;
293
534
    const auto r = s2 - s1;
294
534
    assert(h != 0 || r != 0);  // We already handled p == q case above.
295
534
    const auto hh = h * h;
296
534
    const auto hhh = h * hh;
297
534
    const auto v = u1 * hh;
298
534
    const auto t2 = r * r;
299
534
    const auto t3 = v + v;
300
534
    const auto t4 = t2 - hhh;
301
534
    const auto x3 = t4 - t3;
302
534
    const auto t5 = v - x3;
303
534
    const auto t6 = s1 * hhh;
304
534
    const auto t7 = r * t5;
305
534
    const auto y3 = t7 - t6;
306
534
    const auto t8 = z2 * h;
307
534
    const auto z3 = z1 * t8;
308
309
534
    return {x3, y3, z3};
310
548
}
311
312
/// Mixed addition of elliptic curve points.
313
///
314
/// Computes P ⊕ Q for a point P in Jacobian coordinates and a point Q in affine coordinates.
315
/// This procedure is for use in point multiplication and not all inputs are supported.
316
template <typename Curve>
317
ProjPoint<Curve> add(const ProjPoint<Curve>& p, const AffinePoint<Curve>& q) noexcept
318
431k
{
319
431k
    assert(p != ProjPoint(q));
320
321
431k
    if (q == 0)
  Branch (321:9): [True: 39.7k, False: 88.3k]
+
  Branch (321:9): [True: 0, False: 166k]
+
  Branch (321:9): [True: 0, False: 137k]
+
322
        // TODO: Untested and untestable via precompile call (for secp256r1).
323
39.7k
        return p;
324
391k
    if (p == 0)
  Branch (324:9): [True: 2.05k, False: 86.2k]
+
  Branch (324:9): [True: 1.37k, False: 165k]
+
  Branch (324:9): [True: 1.10k, False: 135k]
+
325
4.52k
        return ProjPoint(q);
326
327
    // Use the "madd" formula for curve in Jacobian coordinates.
328
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-madd
329
330
387k
    const auto& [x1, y1, z1] = p;
331
387k
    const auto& [x2, y2] = q;
332
333
387k
    const auto z1z1 = z1 * z1;
334
387k
    const auto u2 = x2 * z1z1;
335
387k
    const auto z1z1z1 = z1 * z1z1;
336
387k
    const auto s2 = y2 * z1z1z1;
337
387k
    const auto h = u2 - x1;
338
387k
    const auto t1 = h + h;
339
387k
    const auto i = t1 * t1;
340
387k
    const auto j = h * i;
341
387k
    const auto t2 = s2 - y1;
342
387k
    const auto r = t2 + t2;
343
387k
    const auto v = x1 * i;
344
387k
    const auto t3 = r * r;
345
387k
    const auto t4 = v + v;
346
387k
    const auto t5 = t3 - j;
347
387k
    const auto x3 = t5 - t4;
348
387k
    const auto t6 = v - x3;
349
387k
    const auto t7 = y1 * j;
350
387k
    const auto t8 = t7 + t7;
351
387k
    const auto t9 = r * t6;
352
387k
    const auto y3 = t9 - t8;
353
387k
    const auto t10 = z1 * h;
354
387k
    const auto z3 = t10 + t10;
355
356
387k
    return {x3, y3, z3};
357
391k
}
evmmax::ecc::ProjPoint<evmmax::bn254::Curve> evmmax::ecc::add<evmmax::bn254::Curve>(evmmax::ecc::ProjPoint<evmmax::bn254::Curve> const&, evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&)
Line
Count
Source
318
128k
{
319
128k
    assert(p != ProjPoint(q));
320
321
128k
    if (q == 0)
  Branch (321:9): [True: 39.7k, False: 88.3k]
+
322
        // TODO: Untested and untestable via precompile call (for secp256r1).
323
39.7k
        return p;
324
88.3k
    if (p == 0)
  Branch (324:9): [True: 2.05k, False: 86.2k]
+
325
2.05k
        return ProjPoint(q);
326
327
    // Use the "madd" formula for curve in Jacobian coordinates.
328
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-madd
329
330
86.2k
    const auto& [x1, y1, z1] = p;
331
86.2k
    const auto& [x2, y2] = q;
332
333
86.2k
    const auto z1z1 = z1 * z1;
334
86.2k
    const auto u2 = x2 * z1z1;
335
86.2k
    const auto z1z1z1 = z1 * z1z1;
336
86.2k
    const auto s2 = y2 * z1z1z1;
337
86.2k
    const auto h = u2 - x1;
338
86.2k
    const auto t1 = h + h;
339
86.2k
    const auto i = t1 * t1;
340
86.2k
    const auto j = h * i;
341
86.2k
    const auto t2 = s2 - y1;
342
86.2k
    const auto r = t2 + t2;
343
86.2k
    const auto v = x1 * i;
344
86.2k
    const auto t3 = r * r;
345
86.2k
    const auto t4 = v + v;
346
86.2k
    const auto t5 = t3 - j;
347
86.2k
    const auto x3 = t5 - t4;
348
86.2k
    const auto t6 = v - x3;
349
86.2k
    const auto t7 = y1 * j;
350
86.2k
    const auto t8 = t7 + t7;
351
86.2k
    const auto t9 = r * t6;
352
86.2k
    const auto y3 = t9 - t8;
353
86.2k
    const auto t10 = z1 * h;
354
86.2k
    const auto z3 = t10 + t10;
355
356
86.2k
    return {x3, y3, z3};
357
88.3k
}
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> evmmax::ecc::add<evmmax::secp256k1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&, evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
318
166k
{
319
166k
    assert(p != ProjPoint(q));
320
321
166k
    if (q == 0)
  Branch (321:9): [True: 0, False: 166k]
+
322
        // TODO: Untested and untestable via precompile call (for secp256r1).
323
0
        return p;
324
166k
    if (p == 0)
  Branch (324:9): [True: 1.37k, False: 165k]
+
325
1.37k
        return ProjPoint(q);
326
327
    // Use the "madd" formula for curve in Jacobian coordinates.
328
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-madd
329
330
165k
    const auto& [x1, y1, z1] = p;
331
165k
    const auto& [x2, y2] = q;
332
333
165k
    const auto z1z1 = z1 * z1;
334
165k
    const auto u2 = x2 * z1z1;
335
165k
    const auto z1z1z1 = z1 * z1z1;
336
165k
    const auto s2 = y2 * z1z1z1;
337
165k
    const auto h = u2 - x1;
338
165k
    const auto t1 = h + h;
339
165k
    const auto i = t1 * t1;
340
165k
    const auto j = h * i;
341
165k
    const auto t2 = s2 - y1;
342
165k
    const auto r = t2 + t2;
343
165k
    const auto v = x1 * i;
344
165k
    const auto t3 = r * r;
345
165k
    const auto t4 = v + v;
346
165k
    const auto t5 = t3 - j;
347
165k
    const auto x3 = t5 - t4;
348
165k
    const auto t6 = v - x3;
349
165k
    const auto t7 = y1 * j;
350
165k
    const auto t8 = t7 + t7;
351
165k
    const auto t9 = r * t6;
352
165k
    const auto y3 = t9 - t8;
353
165k
    const auto t10 = z1 * h;
354
165k
    const auto z3 = t10 + t10;
355
356
165k
    return {x3, y3, z3};
357
166k
}
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> evmmax::ecc::add<evmmax::secp256r1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&, evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
318
137k
{
319
137k
    assert(p != ProjPoint(q));
320
321
137k
    if (q == 0)
  Branch (321:9): [True: 0, False: 137k]
+
322
        // TODO: Untested and untestable via precompile call (for secp256r1).
323
0
        return p;
324
137k
    if (p == 0)
  Branch (324:9): [True: 1.10k, False: 135k]
+
325
1.10k
        return ProjPoint(q);
326
327
    // Use the "madd" formula for curve in Jacobian coordinates.
328
    // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian.html#addition-madd
329
330
135k
    const auto& [x1, y1, z1] = p;
331
135k
    const auto& [x2, y2] = q;
332
333
135k
    const auto z1z1 = z1 * z1;
334
135k
    const auto u2 = x2 * z1z1;
335
135k
    const auto z1z1z1 = z1 * z1z1;
336
135k
    const auto s2 = y2 * z1z1z1;
337
135k
    const auto h = u2 - x1;
338
135k
    const auto t1 = h + h;
339
135k
    const auto i = t1 * t1;
340
135k
    const auto j = h * i;
341
135k
    const auto t2 = s2 - y1;
342
135k
    const auto r = t2 + t2;
343
135k
    const auto v = x1 * i;
344
135k
    const auto t3 = r * r;
345
135k
    const auto t4 = v + v;
346
135k
    const auto t5 = t3 - j;
347
135k
    const auto x3 = t5 - t4;
348
135k
    const auto t6 = v - x3;
349
135k
    const auto t7 = y1 * j;
350
135k
    const auto t8 = t7 + t7;
351
135k
    const auto t9 = r * t6;
352
135k
    const auto y3 = t9 - t8;
353
135k
    const auto t10 = z1 * h;
354
135k
    const auto z3 = t10 + t10;
355
356
135k
    return {x3, y3, z3};
357
137k
}
358
359
template <typename Curve>
360
ProjPoint<Curve> dbl(const ProjPoint<Curve>& p) noexcept
361
931k
{
362
931k
    const auto& [x1, y1, z1] = p;
363
364
    if constexpr (Curve::A == 0)
365
665k
    {
366
        // Use the "dbl-2009-l" formula for a=0 curve in Jacobian coordinates.
367
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
368
369
665k
        const auto xx = x1 * x1;
370
665k
        const auto yy = y1 * y1;
371
665k
        const auto yyyy = yy * yy;
372
665k
        const auto t0 = x1 + yy;
373
665k
        const auto t1 = t0 * t0;
374
665k
        const auto t2 = t1 - xx;
375
665k
        const auto t3 = t2 - yyyy;
376
665k
        const auto d = t3 + t3;
377
665k
        const auto e = xx + xx + xx;
378
665k
        const auto f = e * e;
379
665k
        const auto t4 = d + d;
380
665k
        const auto x3 = f - t4;
381
665k
        const auto t6 = d - x3;
382
665k
        const auto t8 = yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy;
383
665k
        const auto t9 = e * t6;
384
665k
        const auto y3 = t9 - t8;
385
665k
        const auto t10 = y1 * z1;
386
665k
        const auto z3 = t10 + t10;
387
665k
        return {x3, y3, z3};
388
    }
389
    else if constexpr (Curve::A == Curve::FIELD_PRIME - 3)
390
265k
    {
391
        // Use the "dbl-2001-b" doubling formula.
392
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b
393
394
265k
        const auto zz = z1 * z1;
395
265k
        const auto yy = y1 * y1;
396
265k
        const auto xyy = x1 * yy;
397
265k
        const auto t0 = x1 - zz;
398
265k
        const auto t1 = x1 + zz;
399
265k
        const auto t2 = t0 * t1;
400
265k
        const auto alpha = t2 + t2 + t2;
401
265k
        const auto t3 = alpha * alpha;
402
265k
        const auto t4 = xyy + xyy + xyy + xyy + xyy + xyy + xyy + xyy;
403
265k
        const auto x3 = t3 - t4;
404
265k
        const auto t5 = y1 + z1;
405
265k
        const auto t6 = t5 * t5;
406
265k
        const auto t7 = t6 - yy;
407
265k
        const auto z3 = t7 - zz;
408
265k
        const auto t8 = xyy + xyy + xyy + xyy;
409
265k
        const auto t9 = t8 - x3;
410
265k
        const auto t10 = yy * yy;
411
265k
        const auto t11 = t10 + t10 + t10 + t10 + t10 + t10 + t10 + t10;
412
265k
        const auto t12 = alpha * t9;
413
265k
        const auto y3 = t12 - t11;
414
265k
        return {x3, y3, z3};
415
    }
416
    else
417
    {
418
        // TODO(c++23): Use fake always-false condition for older compilers.
419
        static_assert(Curve::A == 0, "unsupported Curve::A value");
420
    }
421
931k
}
evmmax::ecc::ProjPoint<evmmax::bn254::Curve> evmmax::ecc::dbl<evmmax::bn254::Curve>(evmmax::ecc::ProjPoint<evmmax::bn254::Curve> const&)
Line
Count
Source
361
315k
{
362
315k
    const auto& [x1, y1, z1] = p;
363
364
    if constexpr (Curve::A == 0)
365
315k
    {
366
        // Use the "dbl-2009-l" formula for a=0 curve in Jacobian coordinates.
367
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
368
369
315k
        const auto xx = x1 * x1;
370
315k
        const auto yy = y1 * y1;
371
315k
        const auto yyyy = yy * yy;
372
315k
        const auto t0 = x1 + yy;
373
315k
        const auto t1 = t0 * t0;
374
315k
        const auto t2 = t1 - xx;
375
315k
        const auto t3 = t2 - yyyy;
376
315k
        const auto d = t3 + t3;
377
315k
        const auto e = xx + xx + xx;
378
315k
        const auto f = e * e;
379
315k
        const auto t4 = d + d;
380
315k
        const auto x3 = f - t4;
381
315k
        const auto t6 = d - x3;
382
315k
        const auto t8 = yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy;
383
315k
        const auto t9 = e * t6;
384
315k
        const auto y3 = t9 - t8;
385
315k
        const auto t10 = y1 * z1;
386
315k
        const auto z3 = t10 + t10;
387
315k
        return {x3, y3, z3};
388
    }
389
    else if constexpr (Curve::A == Curve::FIELD_PRIME - 3)
390
    {
391
        // Use the "dbl-2001-b" doubling formula.
392
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b
393
394
        const auto zz = z1 * z1;
395
        const auto yy = y1 * y1;
396
        const auto xyy = x1 * yy;
397
        const auto t0 = x1 - zz;
398
        const auto t1 = x1 + zz;
399
        const auto t2 = t0 * t1;
400
        const auto alpha = t2 + t2 + t2;
401
        const auto t3 = alpha * alpha;
402
        const auto t4 = xyy + xyy + xyy + xyy + xyy + xyy + xyy + xyy;
403
        const auto x3 = t3 - t4;
404
        const auto t5 = y1 + z1;
405
        const auto t6 = t5 * t5;
406
        const auto t7 = t6 - yy;
407
        const auto z3 = t7 - zz;
408
        const auto t8 = xyy + xyy + xyy + xyy;
409
        const auto t9 = t8 - x3;
410
        const auto t10 = yy * yy;
411
        const auto t11 = t10 + t10 + t10 + t10 + t10 + t10 + t10 + t10;
412
        const auto t12 = alpha * t9;
413
        const auto y3 = t12 - t11;
414
        return {x3, y3, z3};
415
    }
416
    else
417
    {
418
        // TODO(c++23): Use fake always-false condition for older compilers.
419
        static_assert(Curve::A == 0, "unsupported Curve::A value");
420
    }
421
315k
}
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> evmmax::ecc::dbl<evmmax::secp256k1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> const&)
Line
Count
Source
361
349k
{
362
349k
    const auto& [x1, y1, z1] = p;
363
364
    if constexpr (Curve::A == 0)
365
349k
    {
366
        // Use the "dbl-2009-l" formula for a=0 curve in Jacobian coordinates.
367
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
368
369
349k
        const auto xx = x1 * x1;
370
349k
        const auto yy = y1 * y1;
371
349k
        const auto yyyy = yy * yy;
372
349k
        const auto t0 = x1 + yy;
373
349k
        const auto t1 = t0 * t0;
374
349k
        const auto t2 = t1 - xx;
375
349k
        const auto t3 = t2 - yyyy;
376
349k
        const auto d = t3 + t3;
377
349k
        const auto e = xx + xx + xx;
378
349k
        const auto f = e * e;
379
349k
        const auto t4 = d + d;
380
349k
        const auto x3 = f - t4;
381
349k
        const auto t6 = d - x3;
382
349k
        const auto t8 = yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy;
383
349k
        const auto t9 = e * t6;
384
349k
        const auto y3 = t9 - t8;
385
349k
        const auto t10 = y1 * z1;
386
349k
        const auto z3 = t10 + t10;
387
349k
        return {x3, y3, z3};
388
    }
389
    else if constexpr (Curve::A == Curve::FIELD_PRIME - 3)
390
    {
391
        // Use the "dbl-2001-b" doubling formula.
392
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b
393
394
        const auto zz = z1 * z1;
395
        const auto yy = y1 * y1;
396
        const auto xyy = x1 * yy;
397
        const auto t0 = x1 - zz;
398
        const auto t1 = x1 + zz;
399
        const auto t2 = t0 * t1;
400
        const auto alpha = t2 + t2 + t2;
401
        const auto t3 = alpha * alpha;
402
        const auto t4 = xyy + xyy + xyy + xyy + xyy + xyy + xyy + xyy;
403
        const auto x3 = t3 - t4;
404
        const auto t5 = y1 + z1;
405
        const auto t6 = t5 * t5;
406
        const auto t7 = t6 - yy;
407
        const auto z3 = t7 - zz;
408
        const auto t8 = xyy + xyy + xyy + xyy;
409
        const auto t9 = t8 - x3;
410
        const auto t10 = yy * yy;
411
        const auto t11 = t10 + t10 + t10 + t10 + t10 + t10 + t10 + t10;
412
        const auto t12 = alpha * t9;
413
        const auto y3 = t12 - t11;
414
        return {x3, y3, z3};
415
    }
416
    else
417
    {
418
        // TODO(c++23): Use fake always-false condition for older compilers.
419
        static_assert(Curve::A == 0, "unsupported Curve::A value");
420
    }
421
349k
}
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> evmmax::ecc::dbl<evmmax::secp256r1::Curve>(evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> const&)
Line
Count
Source
361
265k
{
362
265k
    const auto& [x1, y1, z1] = p;
363
364
    if constexpr (Curve::A == 0)
365
    {
366
        // Use the "dbl-2009-l" formula for a=0 curve in Jacobian coordinates.
367
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l
368
369
        const auto xx = x1 * x1;
370
        const auto yy = y1 * y1;
371
        const auto yyyy = yy * yy;
372
        const auto t0 = x1 + yy;
373
        const auto t1 = t0 * t0;
374
        const auto t2 = t1 - xx;
375
        const auto t3 = t2 - yyyy;
376
        const auto d = t3 + t3;
377
        const auto e = xx + xx + xx;
378
        const auto f = e * e;
379
        const auto t4 = d + d;
380
        const auto x3 = f - t4;
381
        const auto t6 = d - x3;
382
        const auto t8 = yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy + yyyy;
383
        const auto t9 = e * t6;
384
        const auto y3 = t9 - t8;
385
        const auto t10 = y1 * z1;
386
        const auto z3 = t10 + t10;
387
        return {x3, y3, z3};
388
    }
389
    else if constexpr (Curve::A == Curve::FIELD_PRIME - 3)
390
265k
    {
391
        // Use the "dbl-2001-b" doubling formula.
392
        // https://www.hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-3.html#doubling-dbl-2001-b
393
394
265k
        const auto zz = z1 * z1;
395
265k
        const auto yy = y1 * y1;
396
265k
        const auto xyy = x1 * yy;
397
265k
        const auto t0 = x1 - zz;
398
265k
        const auto t1 = x1 + zz;
399
265k
        const auto t2 = t0 * t1;
400
265k
        const auto alpha = t2 + t2 + t2;
401
265k
        const auto t3 = alpha * alpha;
402
265k
        const auto t4 = xyy + xyy + xyy + xyy + xyy + xyy + xyy + xyy;
403
265k
        const auto x3 = t3 - t4;
404
265k
        const auto t5 = y1 + z1;
405
265k
        const auto t6 = t5 * t5;
406
265k
        const auto t7 = t6 - yy;
407
265k
        const auto z3 = t7 - zz;
408
265k
        const auto t8 = xyy + xyy + xyy + xyy;
409
265k
        const auto t9 = t8 - x3;
410
265k
        const auto t10 = yy * yy;
411
265k
        const auto t11 = t10 + t10 + t10 + t10 + t10 + t10 + t10 + t10;
412
265k
        const auto t12 = alpha * t9;
413
265k
        const auto y3 = t12 - t11;
414
265k
        return {x3, y3, z3};
415
    }
416
    else
417
    {
418
        // TODO(c++23): Use fake always-false condition for older compilers.
419
        static_assert(Curve::A == 0, "unsupported Curve::A value");
420
    }
421
265k
}
422
423
template <typename Curve>
424
ProjPoint<Curve> mul(const AffinePoint<Curve>& p, typename Curve::uint_type c) noexcept
425
7.51k
{
426
7.51k
    using IntT = Curve::uint_type;
427
428
    // Reduce the scalar by the curve group order.
429
    // This allows using more efficient add algorithm in the loop because doubling cannot happen.
430
10.1k
    while (true)
  Branch (430:12): [True: 7.21k, Folded]
+
  Branch (430:12): [True: 1.78k, Folded]
+
  Branch (430:12): [True: 1.11k, Folded]
+
431
10.1k
    {
432
10.1k
        const auto [reduced_c, less_than] = subc(c, Curve::ORDER);
433
10.1k
        if (less_than) [[likely]]
  Branch (433:13): [True: 4.62k, False: 2.58k]
+
  Branch (433:13): [True: 1.78k, False: 0]
+
  Branch (433:13): [True: 1.11k, False: 0]
+
434
7.51k
            break;
435
        // TODO: Untested and untestable via precompile call (for secp256r1).
436
2.58k
        c = reduced_c;
437
2.58k
    }
438
439
7.51k
    ProjPoint<Curve> r;
440
7.51k
    const auto bit_width = sizeof(IntT) * 8 - intx::clz(c);
441
938k
    for (auto i = bit_width; i != 0; 
--i931k
)
  Branch (441:30): [True: 315k, False: 4.62k]
+
  Branch (441:30): [True: 349k, False: 1.78k]
+
  Branch (441:30): [True: 265k, False: 1.11k]
+
442
931k
    {
443
931k
        r = ecc::dbl(r);
444
931k
        if (bit_test(c, i - 1))
  Branch (444:13): [True: 128k, False: 187k]
+
  Branch (444:13): [True: 166k, False: 183k]
+
  Branch (444:13): [True: 137k, False: 128k]
+
445
431k
            r = ecc::add(r, p);
446
931k
    }
447
7.51k
    return r;
448
7.51k
}
evmmax::ecc::ProjPoint<evmmax::bn254::Curve> evmmax::ecc::mul<evmmax::bn254::Curve>(evmmax::ecc::AffinePoint<evmmax::bn254::Curve> const&, evmmax::bn254::Curve::uint_type)
Line
Count
Source
425
4.62k
{
426
4.62k
    using IntT = Curve::uint_type;
427
428
    // Reduce the scalar by the curve group order.
429
    // This allows using more efficient add algorithm in the loop because doubling cannot happen.
430
7.21k
    while (true)
  Branch (430:12): [True: 7.21k, Folded]
+
431
7.21k
    {
432
7.21k
        const auto [reduced_c, less_than] = subc(c, Curve::ORDER);
433
7.21k
        if (less_than) [[likely]]
  Branch (433:13): [True: 4.62k, False: 2.58k]
+
434
4.62k
            break;
435
        // TODO: Untested and untestable via precompile call (for secp256r1).
436
2.58k
        c = reduced_c;
437
2.58k
    }
438
439
4.62k
    ProjPoint<Curve> r;
440
4.62k
    const auto bit_width = sizeof(IntT) * 8 - intx::clz(c);
441
319k
    for (auto i = bit_width; i != 0; 
--i315k
)
  Branch (441:30): [True: 315k, False: 4.62k]
+
442
315k
    {
443
315k
        r = ecc::dbl(r);
444
315k
        if (bit_test(c, i - 1))
  Branch (444:13): [True: 128k, False: 187k]
+
445
128k
            r = ecc::add(r, p);
446
315k
    }
447
4.62k
    return r;
448
4.62k
}
evmmax::ecc::ProjPoint<evmmax::secp256k1::Curve> evmmax::ecc::mul<evmmax::secp256k1::Curve>(evmmax::ecc::AffinePoint<evmmax::secp256k1::Curve> const&, evmmax::secp256k1::Curve::uint_type)
Line
Count
Source
425
1.78k
{
426
1.78k
    using IntT = Curve::uint_type;
427
428
    // Reduce the scalar by the curve group order.
429
    // This allows using more efficient add algorithm in the loop because doubling cannot happen.
430
1.78k
    while (true)
  Branch (430:12): [True: 1.78k, Folded]
+
431
1.78k
    {
432
1.78k
        const auto [reduced_c, less_than] = subc(c, Curve::ORDER);
433
1.78k
        if (less_than) [[likely]]
  Branch (433:13): [True: 1.78k, False: 0]
+
434
1.78k
            break;
435
        // TODO: Untested and untestable via precompile call (for secp256r1).
436
0
        c = reduced_c;
437
0
    }
438
439
1.78k
    ProjPoint<Curve> r;
440
1.78k
    const auto bit_width = sizeof(IntT) * 8 - intx::clz(c);
441
351k
    for (auto i = bit_width; i != 0; 
--i349k
)
  Branch (441:30): [True: 349k, False: 1.78k]
+
442
349k
    {
443
349k
        r = ecc::dbl(r);
444
349k
        if (bit_test(c, i - 1))
  Branch (444:13): [True: 166k, False: 183k]
+
445
166k
            r = ecc::add(r, p);
446
349k
    }
447
1.78k
    return r;
448
1.78k
}
evmmax::ecc::ProjPoint<evmmax::secp256r1::Curve> evmmax::ecc::mul<evmmax::secp256r1::Curve>(evmmax::ecc::AffinePoint<evmmax::secp256r1::Curve> const&, evmmax::secp256r1::Curve::uint_type)
Line
Count
Source
425
1.11k
{
426
1.11k
    using IntT = Curve::uint_type;
427
428
    // Reduce the scalar by the curve group order.
429
    // This allows using more efficient add algorithm in the loop because doubling cannot happen.
430
1.11k
    while (true)
  Branch (430:12): [True: 1.11k, Folded]
+
431
1.11k
    {
432
1.11k
        const auto [reduced_c, less_than] = subc(c, Curve::ORDER);
433
1.11k
        if (less_than) [[likely]]
  Branch (433:13): [True: 1.11k, False: 0]
+
434
1.11k
            break;
435
        // TODO: Untested and untestable via precompile call (for secp256r1).
436
0
        c = reduced_c;
437
0
    }
438
439
1.11k
    ProjPoint<Curve> r;
440
1.11k
    const auto bit_width = sizeof(IntT) * 8 - intx::clz(c);
441
266k
    for (auto i = bit_width; i != 0; 
--i265k
)
  Branch (441:30): [True: 265k, False: 1.11k]
+
442
265k
    {
443
265k
        r = ecc::dbl(r);
444
265k
        if (bit_test(c, i - 1))
  Branch (444:13): [True: 137k, False: 128k]
+
445
137k
            r = ecc::add(r, p);
446
265k
    }
447
1.11k
    return r;
448
1.11k
}
449
}  // namespace evmmax::ecc
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/keccak.c.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/keccak.c.html new file mode 100644 index 0000000000..7ab34c3a77 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/keccak.c.html @@ -0,0 +1,23 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/keccak.c
Line
Count
Source
1
// ethash: C/C++ implementation of Ethash, the Ethereum Proof of Work algorithm.
2
// Copyright 2018 Pawel Bylica.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "keccak.h"
6
7
// Provide __has_attribute macro if not defined.
8
#ifndef __has_attribute
9
#define __has_attribute(name) 0
10
#endif
11
12
// Provide __has_builtin macro if not defined.
13
#ifndef __has_builtin
14
#define __has_builtin(x) 0
15
#endif
16
17
// [[always_inline]]
18
#if defined(_MSC_VER)
19
#define ALWAYS_INLINE __forceinline
20
#elif __has_attribute(always_inline)
21
#define ALWAYS_INLINE __attribute__((always_inline))
22
#else
23
#define ALWAYS_INLINE
24
#endif
25
26
#if !__has_builtin(__builtin_memcpy) && !defined(__GNUC__)
27
#include <string.h>
28
#define __builtin_memcpy memcpy
29
#endif
30
31
#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
32
#define to_le64(X) __builtin_bswap64(X)
33
#else
34
833M
#define to_le64(X) X
35
#endif
36
37
/// Loads 64-bit integer from given memory location as little-endian number.
38
static inline ALWAYS_INLINE uint64_t load_le(const uint8_t* data)
39
613M
{
40
    /* memcpy is the best way of expressing the intention. Every compiler will
41
       optimize is to single load instruction if the target architecture
42
       supports unaligned memory access (GCC and clang even in O0).
43
       This is great trick because we are violating C/C++ memory alignment
44
       restrictions with no performance penalty. */
45
613M
    uint64_t word;
46
613M
    __builtin_memcpy(&word, data, sizeof(word));
47
613M
    return to_le64(word);
48
613M
}
49
50
/// Rotates the bits of x left by the count value specified by s.
51
/// The s must be in range <0, 64> exclusively, otherwise the result is undefined.
52
static inline uint64_t rol(uint64_t x, unsigned s)
53
44.8G
{
54
44.8G
    return (x << s) | (x >> (64 - s));
55
44.8G
}
56
57
static const uint64_t round_constants[24] = {  //
58
    0x0000000000000001, 0x0000000000008082, 0x800000000000808a, 0x8000000080008000,
59
    0x000000000000808b, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009,
60
    0x000000000000008a, 0x0000000000000088, 0x0000000080008009, 0x000000008000000a,
61
    0x000000008000808b, 0x800000000000008b, 0x8000000000008089, 0x8000000000008003,
62
    0x8000000000008002, 0x8000000000000080, 0x000000000000800a, 0x800000008000000a,
63
    0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008};
64
65
66
/// The Keccak-f[1600] function.
67
///
68
/// The implementation of the Keccak-f function with 1600-bit width of the permutation (b).
69
/// The size of the state is also 1600 bit what gives 25 64-bit words.
70
///
71
/// @param state  The state of 25 64-bit words on which the permutation is to be performed.
72
///
73
/// The implementation based on:
74
/// - "simple" implementation by Ronny Van Keer, included in "Reference and optimized code in C",
75
///   https://keccak.team/archives.html, CC0-1.0 / Public Domain.
76
static inline ALWAYS_INLINE void keccakf1600_implementation(uint64_t state[25])
77
64.4M
{
78
64.4M
    uint64_t Aba, Abe, Abi, Abo, Abu;
79
64.4M
    uint64_t Aga, Age, Agi, Ago, Agu;
80
64.4M
    uint64_t Aka, Ake, Aki, Ako, Aku;
81
64.4M
    uint64_t Ama, Ame, Ami, Amo, Amu;
82
64.4M
    uint64_t Asa, Ase, Asi, Aso, Asu;
83
84
64.4M
    uint64_t Eba, Ebe, Ebi, Ebo, Ebu;
85
64.4M
    uint64_t Ega, Ege, Egi, Ego, Egu;
86
64.4M
    uint64_t Eka, Eke, Eki, Eko, Eku;
87
64.4M
    uint64_t Ema, Eme, Emi, Emo, Emu;
88
64.4M
    uint64_t Esa, Ese, Esi, Eso, Esu;
89
90
64.4M
    uint64_t Ba, Be, Bi, Bo, Bu;
91
92
64.4M
    uint64_t Da, De, Di, Do, Du;
93
94
64.4M
    Aba = state[0];
95
64.4M
    Abe = state[1];
96
64.4M
    Abi = state[2];
97
64.4M
    Abo = state[3];
98
64.4M
    Abu = state[4];
99
64.4M
    Aga = state[5];
100
64.4M
    Age = state[6];
101
64.4M
    Agi = state[7];
102
64.4M
    Ago = state[8];
103
64.4M
    Agu = state[9];
104
64.4M
    Aka = state[10];
105
64.4M
    Ake = state[11];
106
64.4M
    Aki = state[12];
107
64.4M
    Ako = state[13];
108
64.4M
    Aku = state[14];
109
64.4M
    Ama = state[15];
110
64.4M
    Ame = state[16];
111
64.4M
    Ami = state[17];
112
64.4M
    Amo = state[18];
113
64.4M
    Amu = state[19];
114
64.4M
    Asa = state[20];
115
64.4M
    Ase = state[21];
116
64.4M
    Asi = state[22];
117
64.4M
    Aso = state[23];
118
64.4M
    Asu = state[24];
119
120
837M
    for (size_t n = 0; n < 24; 
n += 2773M
)
  Branch (120:24): [True: 773M, False: 64.4M]
+
121
773M
    {
122
        // Round (n + 0): Axx -> Exx
123
124
773M
        Ba = Aba ^ Aga ^ Aka ^ Ama ^ Asa;
125
773M
        Be = Abe ^ Age ^ Ake ^ Ame ^ Ase;
126
773M
        Bi = Abi ^ Agi ^ Aki ^ Ami ^ Asi;
127
773M
        Bo = Abo ^ Ago ^ Ako ^ Amo ^ Aso;
128
773M
        Bu = Abu ^ Agu ^ Aku ^ Amu ^ Asu;
129
130
773M
        Da = Bu ^ rol(Be, 1);
131
773M
        De = Ba ^ rol(Bi, 1);
132
773M
        Di = Be ^ rol(Bo, 1);
133
773M
        Do = Bi ^ rol(Bu, 1);
134
773M
        Du = Bo ^ rol(Ba, 1);
135
136
773M
        Ba = Aba ^ Da;
137
773M
        Be = rol(Age ^ De, 44);
138
773M
        Bi = rol(Aki ^ Di, 43);
139
773M
        Bo = rol(Amo ^ Do, 21);
140
773M
        Bu = rol(Asu ^ Du, 14);
141
773M
        Eba = Ba ^ (~Be & Bi) ^ round_constants[n];
142
773M
        Ebe = Be ^ (~Bi & Bo);
143
773M
        Ebi = Bi ^ (~Bo & Bu);
144
773M
        Ebo = Bo ^ (~Bu & Ba);
145
773M
        Ebu = Bu ^ (~Ba & Be);
146
147
773M
        Ba = rol(Abo ^ Do, 28);
148
773M
        Be = rol(Agu ^ Du, 20);
149
773M
        Bi = rol(Aka ^ Da, 3);
150
773M
        Bo = rol(Ame ^ De, 45);
151
773M
        Bu = rol(Asi ^ Di, 61);
152
773M
        Ega = Ba ^ (~Be & Bi);
153
773M
        Ege = Be ^ (~Bi & Bo);
154
773M
        Egi = Bi ^ (~Bo & Bu);
155
773M
        Ego = Bo ^ (~Bu & Ba);
156
773M
        Egu = Bu ^ (~Ba & Be);
157
158
773M
        Ba = rol(Abe ^ De, 1);
159
773M
        Be = rol(Agi ^ Di, 6);
160
773M
        Bi = rol(Ako ^ Do, 25);
161
773M
        Bo = rol(Amu ^ Du, 8);
162
773M
        Bu = rol(Asa ^ Da, 18);
163
773M
        Eka = Ba ^ (~Be & Bi);
164
773M
        Eke = Be ^ (~Bi & Bo);
165
773M
        Eki = Bi ^ (~Bo & Bu);
166
773M
        Eko = Bo ^ (~Bu & Ba);
167
773M
        Eku = Bu ^ (~Ba & Be);
168
169
773M
        Ba = rol(Abu ^ Du, 27);
170
773M
        Be = rol(Aga ^ Da, 36);
171
773M
        Bi = rol(Ake ^ De, 10);
172
773M
        Bo = rol(Ami ^ Di, 15);
173
773M
        Bu = rol(Aso ^ Do, 56);
174
773M
        Ema = Ba ^ (~Be & Bi);
175
773M
        Eme = Be ^ (~Bi & Bo);
176
773M
        Emi = Bi ^ (~Bo & Bu);
177
773M
        Emo = Bo ^ (~Bu & Ba);
178
773M
        Emu = Bu ^ (~Ba & Be);
179
180
773M
        Ba = rol(Abi ^ Di, 62);
181
773M
        Be = rol(Ago ^ Do, 55);
182
773M
        Bi = rol(Aku ^ Du, 39);
183
773M
        Bo = rol(Ama ^ Da, 41);
184
773M
        Bu = rol(Ase ^ De, 2);
185
773M
        Esa = Ba ^ (~Be & Bi);
186
773M
        Ese = Be ^ (~Bi & Bo);
187
773M
        Esi = Bi ^ (~Bo & Bu);
188
773M
        Eso = Bo ^ (~Bu & Ba);
189
773M
        Esu = Bu ^ (~Ba & Be);
190
191
192
        // Round (n + 1): Exx -> Axx
193
194
773M
        Ba = Eba ^ Ega ^ Eka ^ Ema ^ Esa;
195
773M
        Be = Ebe ^ Ege ^ Eke ^ Eme ^ Ese;
196
773M
        Bi = Ebi ^ Egi ^ Eki ^ Emi ^ Esi;
197
773M
        Bo = Ebo ^ Ego ^ Eko ^ Emo ^ Eso;
198
773M
        Bu = Ebu ^ Egu ^ Eku ^ Emu ^ Esu;
199
200
773M
        Da = Bu ^ rol(Be, 1);
201
773M
        De = Ba ^ rol(Bi, 1);
202
773M
        Di = Be ^ rol(Bo, 1);
203
773M
        Do = Bi ^ rol(Bu, 1);
204
773M
        Du = Bo ^ rol(Ba, 1);
205
206
773M
        Ba = Eba ^ Da;
207
773M
        Be = rol(Ege ^ De, 44);
208
773M
        Bi = rol(Eki ^ Di, 43);
209
773M
        Bo = rol(Emo ^ Do, 21);
210
773M
        Bu = rol(Esu ^ Du, 14);
211
773M
        Aba = Ba ^ (~Be & Bi) ^ round_constants[n + 1];
212
773M
        Abe = Be ^ (~Bi & Bo);
213
773M
        Abi = Bi ^ (~Bo & Bu);
214
773M
        Abo = Bo ^ (~Bu & Ba);
215
773M
        Abu = Bu ^ (~Ba & Be);
216
217
773M
        Ba = rol(Ebo ^ Do, 28);
218
773M
        Be = rol(Egu ^ Du, 20);
219
773M
        Bi = rol(Eka ^ Da, 3);
220
773M
        Bo = rol(Eme ^ De, 45);
221
773M
        Bu = rol(Esi ^ Di, 61);
222
773M
        Aga = Ba ^ (~Be & Bi);
223
773M
        Age = Be ^ (~Bi & Bo);
224
773M
        Agi = Bi ^ (~Bo & Bu);
225
773M
        Ago = Bo ^ (~Bu & Ba);
226
773M
        Agu = Bu ^ (~Ba & Be);
227
228
773M
        Ba = rol(Ebe ^ De, 1);
229
773M
        Be = rol(Egi ^ Di, 6);
230
773M
        Bi = rol(Eko ^ Do, 25);
231
773M
        Bo = rol(Emu ^ Du, 8);
232
773M
        Bu = rol(Esa ^ Da, 18);
233
773M
        Aka = Ba ^ (~Be & Bi);
234
773M
        Ake = Be ^ (~Bi & Bo);
235
773M
        Aki = Bi ^ (~Bo & Bu);
236
773M
        Ako = Bo ^ (~Bu & Ba);
237
773M
        Aku = Bu ^ (~Ba & Be);
238
239
773M
        Ba = rol(Ebu ^ Du, 27);
240
773M
        Be = rol(Ega ^ Da, 36);
241
773M
        Bi = rol(Eke ^ De, 10);
242
773M
        Bo = rol(Emi ^ Di, 15);
243
773M
        Bu = rol(Eso ^ Do, 56);
244
773M
        Ama = Ba ^ (~Be & Bi);
245
773M
        Ame = Be ^ (~Bi & Bo);
246
773M
        Ami = Bi ^ (~Bo & Bu);
247
773M
        Amo = Bo ^ (~Bu & Ba);
248
773M
        Amu = Bu ^ (~Ba & Be);
249
250
773M
        Ba = rol(Ebi ^ Di, 62);
251
773M
        Be = rol(Ego ^ Do, 55);
252
773M
        Bi = rol(Eku ^ Du, 39);
253
773M
        Bo = rol(Ema ^ Da, 41);
254
773M
        Bu = rol(Ese ^ De, 2);
255
773M
        Asa = Ba ^ (~Be & Bi);
256
773M
        Ase = Be ^ (~Bi & Bo);
257
773M
        Asi = Bi ^ (~Bo & Bu);
258
773M
        Aso = Bo ^ (~Bu & Ba);
259
773M
        Asu = Bu ^ (~Ba & Be);
260
773M
    }
261
262
64.4M
    state[0] = Aba;
263
64.4M
    state[1] = Abe;
264
64.4M
    state[2] = Abi;
265
64.4M
    state[3] = Abo;
266
64.4M
    state[4] = Abu;
267
64.4M
    state[5] = Aga;
268
64.4M
    state[6] = Age;
269
64.4M
    state[7] = Agi;
270
64.4M
    state[8] = Ago;
271
64.4M
    state[9] = Agu;
272
64.4M
    state[10] = Aka;
273
64.4M
    state[11] = Ake;
274
64.4M
    state[12] = Aki;
275
64.4M
    state[13] = Ako;
276
64.4M
    state[14] = Aku;
277
64.4M
    state[15] = Ama;
278
64.4M
    state[16] = Ame;
279
64.4M
    state[17] = Ami;
280
64.4M
    state[18] = Amo;
281
64.4M
    state[19] = Amu;
282
64.4M
    state[20] = Asa;
283
64.4M
    state[21] = Ase;
284
64.4M
    state[22] = Asi;
285
64.4M
    state[23] = Aso;
286
64.4M
    state[24] = Asu;
287
64.4M
}
288
289
static void keccakf1600_generic(uint64_t state[25])
290
0
{
291
0
    keccakf1600_implementation(state);
292
0
}
293
294
/// The pointer to the best Keccak-f[1600] function implementation,
295
/// selected during runtime initialization.
296
static void (*keccakf1600_best)(uint64_t[25]) = keccakf1600_generic;
297
298
299
#if !defined(_MSC_VER) && defined(__x86_64__) && __has_attribute(target)
300
__attribute__((target("bmi,bmi2"))) static void keccakf1600_bmi(uint64_t state[25])
301
64.4M
{
302
64.4M
    keccakf1600_implementation(state);
303
64.4M
}
304
305
__attribute__((constructor)) static void select_keccakf1600_implementation(void)
306
4
{
307
    // Init CPU information.
308
    // This is needed on macOS because of the bug: https://bugs.llvm.org/show_bug.cgi?id=48459.
309
4
    __builtin_cpu_init();
310
311
    // Check if both BMI and BMI2 are supported. Some CPUs like Intel E5-2697 v2 incorrectly
312
    // report BMI2 but not BMI being available.
313
4
    if (__builtin_cpu_supports("bmi") && __builtin_cpu_supports("bmi2"))
  Branch (313:9): [True: 4, False: 0]
+  Branch (313:42): [True: 4, False: 0]
+
  MC/DC Decision Region (313:9) to (313:72)
+
+  Number of Conditions: 2
+     Condition C1 --> (313:9)
+     Condition C2 --> (313:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { T,  T  = T      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
314
4
        keccakf1600_best = keccakf1600_bmi;
315
4
}
316
#endif
317
318
319
static inline ALWAYS_INLINE void keccak(
320
    uint64_t* out, size_t bits, const uint8_t* data, size_t size)
321
44.0M
{
322
44.0M
    static const size_t word_size = sizeof(uint64_t);
323
44.0M
    const size_t hash_size = bits / 8;
324
44.0M
    const size_t block_size = (1600 - bits * 2) / 8;
325
326
44.0M
    size_t i;
327
44.0M
    uint64_t* state_iter;
328
44.0M
    uint64_t last_word = 0;
329
44.0M
    uint8_t* last_word_iter = (uint8_t*)&last_word;
330
331
44.0M
    uint64_t state[25] = {0};
332
333
64.4M
    while (size >= block_size)
  Branch (333:12): [True: 20.3M, False: 44.0M]
+
334
20.3M
    {
335
367M
        for (i = 0; i < (block_size / word_size); 
++i346M
)
  Branch (335:21): [True: 346M, False: 20.3M]
+
336
346M
        {
337
346M
            state[i] ^= load_le(data);
338
346M
            data += word_size;
339
346M
        }
340
341
20.3M
        keccakf1600_best(state);
342
343
20.3M
        size -= block_size;
344
20.3M
    }
345
346
44.0M
    state_iter = state;
347
348
310M
    while (size >= word_size)
  Branch (348:12): [True: 266M, False: 44.0M]
+
349
266M
    {
350
266M
        *state_iter ^= load_le(data);
351
266M
        ++state_iter;
352
266M
        data += word_size;
353
266M
        size -= word_size;
354
266M
    }
355
356
157M
    while (size > 0)
  Branch (356:12): [True: 113M, False: 44.0M]
+
357
113M
    {
358
113M
        *last_word_iter = *data;
359
113M
        ++last_word_iter;
360
113M
        ++data;
361
113M
        --size;
362
113M
    }
363
44.0M
    *last_word_iter = 0x01;
364
44.0M
    *state_iter ^= to_le64(last_word);
365
366
44.0M
    state[(block_size / word_size) - 1] ^= 0x8000000000000000;
367
368
44.0M
    keccakf1600_best(state);
369
370
220M
    for (i = 0; i < (hash_size / word_size); 
++i176M
)
  Branch (370:17): [True: 176M, False: 44.0M]
+
371
176M
        out[i] = to_le64(state[i]);
372
44.0M
}
373
374
union ethash_hash256 ethash_keccak256(const uint8_t* data, size_t size)
375
44.0M
{
376
44.0M
    union ethash_hash256 hash;
377
44.0M
    keccak(hash.word64s, 256, data, size);
378
44.0M
    return hash;
379
44.0M
}
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/keccak.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/keccak.hpp.html new file mode 100644 index 0000000000..7928a57833 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/keccak.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/keccak.hpp
Line
Count
Source
1
// ethash: C/C++ implementation of Ethash, the Ethereum Proof of Work algorithm.
2
// Copyright 2018-2019 Pawel Bylica.
3
// Licensed under the Apache License, Version 2.0.
4
5
#pragma once
6
7
#include "keccak.h"
8
9
namespace ethash
10
{
11
inline hash256 keccak256(const uint8_t* data, size_t size) noexcept
12
44.0M
{
13
44.0M
    return ethash_keccak256(data, size);
14
44.0M
}
15
16
}  // namespace ethash
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/kzg.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/kzg.cpp.html new file mode 100644 index 0000000000..bb5370944e --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/kzg.cpp.html @@ -0,0 +1,9 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/kzg.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "kzg.hpp"
6
#include <blst.h>
7
#include <algorithm>
8
#include <optional>
9
#include <span>
10
11
namespace evmone::crypto
12
{
13
namespace
14
{
15
/// The field element 1 in Montgomery form.
16
constexpr blst_fp ONE = {0x760900000002fffd, 0xebf4000bc40c0002, 0x5f48985753c758ba,
17
    0x77ce585370525745, 0x5c071a97a256ec6d, 0x15f65ec3fa80e493};
18
19
/// The negation of the subgroup G1 generator -[1]₁ (Jacobian coordinates in Montgomery form).
20
constexpr blst_p1 G1_GENERATOR_NEGATIVE = {
21
    {0x5cb38790fd530c16, 0x7817fc679976fff5, 0x154f95c7143ba1c1, 0xf0ae6acdf3d0e747,
22
        0xedce6ecc21dbf440, 0x120177419e0bfb75},
23
    {0xff526c2af318883a, 0x92899ce4383b0270, 0x89d7738d9fa9d055, 0x12caf35ba344c12a,
24
        0x3cff1b76964b5317, 0x0e44d2ede9774430},
25
    ONE};
26
27
/// The negation of the subgroup G2 generator -[1]₂ (Jacobian coordinates in Montgomery form).
28
constexpr blst_p2 G2_GENERATOR_NEGATIVE{
29
    {{{0xf5f28fa202940a10, 0xb3f5fb2687b4961a, 0xa1a893b53e2ae580, 0x9894999d1a3caee9,
30
          0x6f67b7631863366b, 0x058191924350bcd7},
31
        {0xa5a9c0759e23f606, 0xaaa0c59dbccd60c3, 0x3bb17e18e2867806, 0x1b1ab6cc8541b367,
32
            0xc2b6ed0ef2158547, 0x11922a097360edf3}}},
33
    {{{0x6d8bf5079fb65e61, 0xc52f05df531d63a5, 0x7f4a4d344ca692c9, 0xa887959b8577c95f,
34
          0x4347fe40525c8734, 0x197d145bbaff0bb5},
35
        {0x0c3e036d209afa4e, 0x0601d8f4863f9e23, 0xe0832636bacc0a84, 0xeb2def362a476f84,
36
            0x64044f659f0ee1e9, 0x0ed54f48d5a1caa7}}},
37
    {{ONE, {}}}};
38
39
/// The point from the G2 series, index 1 of the Ethereum KZG trusted setup,
40
/// i.e. [s]₂ where s is the trusted setup's secret.
41
/// Affine coordinates in Montgomery form.
42
/// The original value in compressed form (y-parity bit and Fp2 x coordinate)
43
/// is the ["g2_monomial"][1] of the JSON object found at
44
/// https://github.com/ethereum/consensus-specs/blob/dev/presets/mainnet/trusted_setups/trusted_setup_4096.json#L8200
45
constexpr blst_p2_affine KZG_SETUP_G2_1{
46
    {{{0x6120a2099b0379f9, 0xa2df815cb8210e4e, 0xcb57be5577bd3d4f, 0x62da0ea89a0c93f8,
47
          0x02e0ee16968e150d, 0x171f09aea833acd5},
48
        {0x11a3670749dfd455, 0x04991d7b3abffadc, 0x85446a8e14437f41, 0x27174e7b4e76e3f2,
49
            0x7bfa6dd397f60a20, 0x02fcc329ac07080f}}},
50
    {{{0xaa130838793b2317, 0xe236dd220f891637, 0x6502782925760980, 0xd05c25f60557ec89,
51
          0x6095767a44064474, 0x185693917080d405},
52
        {0x549f9e175b03dc0a, 0x32c0c95a77106cfe, 0x64a74eae5705d080, 0x53deeaf56659ed9e,
53
            0x09a1d368508afb93, 0x12cf3a4525b5e9bd}}}};
54
55
/// Load and validate an element from the group order field.
56
std::optional<blst_scalar> validate_scalar(std::span<const std::byte, 32> b) noexcept
57
1.73k
{
58
1.73k
    blst_scalar v;
59
1.73k
    blst_scalar_from_bendian(&v, reinterpret_cast<const uint8_t*>(b.data()));
60
1.73k
    return blst_scalar_fr_check(&v) ? 
std::optional{v}1.67k
:
std::nullopt60
;
  Branch (60:12): [True: 1.67k, False: 60]
+
61
1.73k
}
62
63
/// Uncompress and validate a point from G1 subgroup.
64
std::optional<blst_p1_affine> validate_G1(std::span<const std::byte, 48> b) noexcept
65
1.62k
{
66
1.62k
    blst_p1_affine r;
67
1.62k
    if (blst_p1_uncompress(&r, reinterpret_cast<const uint8_t*>(b.data())) != BLST_SUCCESS)
  Branch (67:9): [True: 18, False: 1.60k]
+
68
18
        return std::nullopt;
69
70
    // Subgroup check is required by the spec but there are no test vectors
71
    // with points outside G1 which would satisfy the final pairings check.
72
1.60k
    if (!blst_p1_affine_in_g1(&r))
  Branch (72:9): [True: 12, False: 1.59k]
+
73
12
        return std::nullopt;
74
1.59k
    return r;
75
1.60k
}
76
77
/// Add two points from E1 and convert the result to affine form.
78
/// The conversion to affine is very costly so use only if the affine of the result is needed.
79
blst_p1_affine add_or_double(const blst_p1_affine& p, const blst_p1& q) noexcept
80
792
{
81
792
    blst_p1 r;
82
792
    blst_p1_add_or_double_affine(&r, &q, &p);
83
792
    blst_p1_affine ra;
84
792
    blst_p1_to_affine(&ra, &r);
85
792
    return ra;
86
792
}
87
88
blst_p1 mult(const blst_p1& p, const blst_scalar& v) noexcept
89
792
{
90
792
    blst_p1 r;
91
792
    blst_p1_mult(&r, &p, v.b, BLS_MODULUS_BITS);
92
792
    return r;
93
792
}
94
95
/// Add two points from E2 and convert the result to affine form.
96
/// The conversion to affine is very costly so use only if the affine of the result is needed.
97
blst_p2_affine add_or_double(const blst_p2_affine& p, const blst_p2& q) noexcept
98
792
{
99
792
    blst_p2 r;
100
792
    blst_p2_add_or_double_affine(&r, &q, &p);
101
792
    blst_p2_affine ra;
102
792
    blst_p2_to_affine(&ra, &r);
103
792
    return ra;
104
792
}
105
106
blst_p2 mult(const blst_p2& p, const blst_scalar& v) noexcept
107
792
{
108
792
    blst_p2 r;
109
792
    blst_p2_mult(&r, &p, v.b, BLS_MODULUS_BITS);
110
792
    return r;
111
792
}
112
113
bool pairings_verify(
114
    const blst_p1_affine& a1, const blst_p1_affine& b1, const blst_p2_affine& b2) noexcept
115
792
{
116
792
    blst_fp12 left;
117
792
    blst_aggregated_in_g1(&left, &a1);
118
792
    blst_fp12 right;
119
792
    blst_miller_loop(&right, &b2, &b1);
120
792
    return blst_fp12_finalverify(&left, &right);
121
792
}
122
}  // namespace
123
124
bool kzg_verify_proof(const std::byte versioned_hash[VERSIONED_HASH_SIZE], const std::byte z[32],
125
    const std::byte y[32], const std::byte commitment[48], const std::byte proof[48]) noexcept
126
906
{
127
906
    std::byte computed_versioned_hash[32];
128
906
    sha256(computed_versioned_hash, commitment, 48);
129
906
    computed_versioned_hash[0] = VERSIONED_HASH_VERSION_KZG;
130
906
    if (!std::ranges::equal(std::span{versioned_hash, 32}, computed_versioned_hash))
  Branch (130:9): [True: 24, False: 882]
+
131
24
        return false;
132
133
    // Load and validate scalars z and y.
134
    // TODO(C++26): The span construction can be done as std::snap(z, std::c_<32>).
135
882
    const auto zz = validate_scalar(std::span<const std::byte, 32>{z, 32});
136
882
    if (!zz)
  Branch (136:9): [True: 30, False: 852]
+
137
30
        return false;
138
852
    const auto yy = validate_scalar(std::span<const std::byte, 32>{y, 32});
139
852
    if (!yy)
  Branch (139:9): [True: 30, False: 822]
+
140
30
        return false;
141
142
    // Uncompress and validate the points C (representing the polynomial commitment)
143
    // and Pi (representing the proof). They both are valid to be points at infinity
144
    // when they prove a commitment to a constant polynomial,
145
    // see https://hackmd.io/@kevaundray/kzg-is-zero-proof-sound
146
822
    const auto C = validate_G1(std::span<const std::byte, 48>{commitment, 48});
147
822
    if (!C)
  Branch (147:9): [True: 18, False: 804]
+
148
18
        return false;
149
804
    const auto Pi = validate_G1(std::span<const std::byte, 48>{proof, 48});
150
804
    if (!Pi)
  Branch (150:9): [True: 12, False: 792]
+
151
12
        return false;
152
153
    // Compute -Y as [y * -1]₁.
154
792
    const auto neg_Y = mult(G1_GENERATOR_NEGATIVE, *yy);
155
156
    // Compute C - Y. It can happen that C == -Y so doubling may be needed.
157
792
    const auto C_sub_Y = add_or_double(*C, neg_Y);
158
159
    // Compute -Z as [z * -1]₂.
160
792
    const auto neg_Z = mult(G2_GENERATOR_NEGATIVE, *zz);
161
162
    // Compute X - Z which is [s - z]₂.
163
792
    const auto X_sub_Z = add_or_double(KZG_SETUP_G2_1, neg_Z);
164
165
    // e(C - [y]₁, [1]₂) =? e(Pi, [s - z]₂)
166
792
    return pairings_verify(C_sub_Y, *Pi, X_sub_Z);
167
804
}
168
}  // namespace evmone::crypto
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/modexp.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/modexp.cpp.html new file mode 100644 index 0000000000..fb6113fb0e --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/modexp.cpp.html @@ -0,0 +1,91 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/modexp.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2025 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "modexp.hpp"
6
#include <evmmax/evmmax.hpp>
7
#include <bit>
8
9
using namespace intx;
10
11
namespace
12
{
13
template <unsigned N>
14
void trunc(std::span<uint8_t> dst, const intx::uint<N>& x) noexcept
15
3.25k
{
16
3.25k
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
3.25k
    const auto d = to_big_endian(x);
18
3.25k
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
3.25k
}
modexp.cpp:void (anonymous namespace)::trunc<128u>(std::span<unsigned char, 18446744073709551615ul>, intx::uint<128u> const&)
Line
Count
Source
15
896
{
16
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
896
    const auto d = to_big_endian(x);
18
896
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
896
}
modexp.cpp:void (anonymous namespace)::trunc<256u>(std::span<unsigned char, 18446744073709551615ul>, intx::uint<256u> const&)
Line
Count
Source
15
1.22k
{
16
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
1.22k
    const auto d = to_big_endian(x);
18
1.22k
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
1.22k
}
modexp.cpp:void (anonymous namespace)::trunc<512u>(std::span<unsigned char, 18446744073709551615ul>, intx::uint<512u> const&)
Line
Count
Source
15
663
{
16
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
663
    const auto d = to_big_endian(x);
18
663
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
663
}
modexp.cpp:void (anonymous namespace)::trunc<1024u>(std::span<unsigned char, 18446744073709551615ul>, intx::uint<1024u> const&)
Line
Count
Source
15
108
{
16
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
108
    const auto d = to_big_endian(x);
18
108
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
108
}
modexp.cpp:void (anonymous namespace)::trunc<2048u>(std::span<unsigned char, 18446744073709551615ul>, intx::uint<2048u> const&)
Line
Count
Source
15
136
{
16
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
136
    const auto d = to_big_endian(x);
18
136
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
136
}
modexp.cpp:void (anonymous namespace)::trunc<8192u>(std::span<unsigned char, 18446744073709551615ul>, intx::uint<8192u> const&)
Line
Count
Source
15
224
{
16
    assert(dst.size() <= N / 8);  // destination must be smaller than the source value
17
224
    const auto d = to_big_endian(x);
18
224
    std::copy_n(&as_bytes(d)[sizeof(d) - dst.size()], dst.size(), dst.begin());
19
224
}
20
21
/// Represents the exponent value of the modular exponentiation operation.
22
///
23
/// This is a view type of the big-endian bytes representing the bits of the exponent.
24
class Exponent
25
{
26
    const uint8_t* data_ = nullptr;
27
    size_t bit_width_ = 0;
28
29
public:
30
    explicit Exponent(std::span<const uint8_t> bytes) noexcept
31
3.25k
    {
32
67.1k
        const auto it = std::ranges::find_if(bytes, [](auto x) { return x != 0; });
33
3.25k
        const auto trimmed_bytes = std::span{it, bytes.end()};
34
3.25k
        bit_width_ = trimmed_bytes.empty() ? 
0642
:
  Branch (34:22): [True: 642, False: 2.61k]
+
35
3.25k
                                             static_cast<size_t>(std::bit_width(trimmed_bytes[0])) +
36
2.61k
                                                 (trimmed_bytes.size() - 1) * 8;
37
3.25k
        data_ = trimmed_bytes.data();
38
3.25k
    }
39
40
41
4.27k
    [[nodiscard]] size_t bit_width() const noexcept { return bit_width_; }
42
43
    /// Returns the bit value of the exponent at the given index, counting from the most significant
44
    /// bit (e[0] is the top bit).
45
    bool operator[](size_t index) const noexcept
46
520k
    {
47
        // TODO: Replace this with a custom iterator type.
48
520k
        const auto exp_size = (bit_width_ + 7) / 8;
49
520k
        const auto byte_index = index / 8;
50
520k
        const auto byte = data_[exp_size - 1 - byte_index];
51
520k
        const auto bit_index = index % 8;
52
520k
        const auto bit = (byte >> bit_index) & 1;
53
520k
        return bit != 0;
54
520k
    }
55
};
56
57
template <typename UIntT>
58
UIntT modexp_odd(const UIntT& base, Exponent exp, const UIntT& mod) noexcept
59
2.49k
{
60
2.49k
    const evmmax::ModArith<UIntT> arith{mod};
61
2.49k
    const auto base_mont = arith.to_mont(base);
62
63
2.49k
    auto ret = arith.to_mont(1);
64
337k
    for (auto i = exp.bit_width(); i != 0; 
--i335k
)
  Branch (64:36): [True: 146k, False: 620]
+
  Branch (64:36): [True: 117k, False: 874]
+
  Branch (64:36): [True: 39.8k, False: 599]
+
  Branch (64:36): [True: 734, False: 86]
+
  Branch (64:36): [True: 29.4k, False: 114]
+
  Branch (64:36): [True: 1.13k, False: 200]
+
65
335k
    {
66
335k
        ret = arith.mul(ret, ret);
67
335k
        if (exp[i - 1])
  Branch (67:13): [True: 109k, False: 36.4k]
+
  Branch (67:13): [True: 90.5k, False: 27.0k]
+
  Branch (67:13): [True: 30.9k, False: 8.89k]
+
  Branch (67:13): [True: 180, False: 554]
+
  Branch (67:13): [True: 15.0k, False: 14.3k]
+
  Branch (67:13): [True: 328, False: 806]
+
68
247k
            ret = arith.mul(ret, base_mont);
69
335k
    }
70
71
2.49k
    return arith.from_mont(ret);
72
2.49k
}
modexp.cpp:intx::uint<128u> (anonymous namespace)::modexp_odd<intx::uint<128u>>(intx::uint<128u> const&, (anonymous namespace)::Exponent, intx::uint<128u> const&)
Line
Count
Source
59
620
{
60
620
    const evmmax::ModArith<UIntT> arith{mod};
61
620
    const auto base_mont = arith.to_mont(base);
62
63
620
    auto ret = arith.to_mont(1);
64
147k
    for (auto i = exp.bit_width(); i != 0; 
--i146k
)
  Branch (64:36): [True: 146k, False: 620]
+
65
146k
    {
66
146k
        ret = arith.mul(ret, ret);
67
146k
        if (exp[i - 1])
  Branch (67:13): [True: 109k, False: 36.4k]
+
68
109k
            ret = arith.mul(ret, base_mont);
69
146k
    }
70
71
620
    return arith.from_mont(ret);
72
620
}
modexp.cpp:intx::uint<256u> (anonymous namespace)::modexp_odd<intx::uint<256u>>(intx::uint<256u> const&, (anonymous namespace)::Exponent, intx::uint<256u> const&)
Line
Count
Source
59
874
{
60
874
    const evmmax::ModArith<UIntT> arith{mod};
61
874
    const auto base_mont = arith.to_mont(base);
62
63
874
    auto ret = arith.to_mont(1);
64
118k
    for (auto i = exp.bit_width(); i != 0; 
--i117k
)
  Branch (64:36): [True: 117k, False: 874]
+
65
117k
    {
66
117k
        ret = arith.mul(ret, ret);
67
117k
        if (exp[i - 1])
  Branch (67:13): [True: 90.5k, False: 27.0k]
+
68
90.5k
            ret = arith.mul(ret, base_mont);
69
117k
    }
70
71
874
    return arith.from_mont(ret);
72
874
}
modexp.cpp:intx::uint<512u> (anonymous namespace)::modexp_odd<intx::uint<512u>>(intx::uint<512u> const&, (anonymous namespace)::Exponent, intx::uint<512u> const&)
Line
Count
Source
59
599
{
60
599
    const evmmax::ModArith<UIntT> arith{mod};
61
599
    const auto base_mont = arith.to_mont(base);
62
63
599
    auto ret = arith.to_mont(1);
64
40.4k
    for (auto i = exp.bit_width(); i != 0; 
--i39.8k
)
  Branch (64:36): [True: 39.8k, False: 599]
+
65
39.8k
    {
66
39.8k
        ret = arith.mul(ret, ret);
67
39.8k
        if (exp[i - 1])
  Branch (67:13): [True: 30.9k, False: 8.89k]
+
68
30.9k
            ret = arith.mul(ret, base_mont);
69
39.8k
    }
70
71
599
    return arith.from_mont(ret);
72
599
}
modexp.cpp:intx::uint<1024u> (anonymous namespace)::modexp_odd<intx::uint<1024u>>(intx::uint<1024u> const&, (anonymous namespace)::Exponent, intx::uint<1024u> const&)
Line
Count
Source
59
86
{
60
86
    const evmmax::ModArith<UIntT> arith{mod};
61
86
    const auto base_mont = arith.to_mont(base);
62
63
86
    auto ret = arith.to_mont(1);
64
820
    for (auto i = exp.bit_width(); i != 0; 
--i734
)
  Branch (64:36): [True: 734, False: 86]
+
65
734
    {
66
734
        ret = arith.mul(ret, ret);
67
734
        if (exp[i - 1])
  Branch (67:13): [True: 180, False: 554]
+
68
180
            ret = arith.mul(ret, base_mont);
69
734
    }
70
71
86
    return arith.from_mont(ret);
72
86
}
modexp.cpp:intx::uint<2048u> (anonymous namespace)::modexp_odd<intx::uint<2048u>>(intx::uint<2048u> const&, (anonymous namespace)::Exponent, intx::uint<2048u> const&)
Line
Count
Source
59
114
{
60
114
    const evmmax::ModArith<UIntT> arith{mod};
61
114
    const auto base_mont = arith.to_mont(base);
62
63
114
    auto ret = arith.to_mont(1);
64
29.5k
    for (auto i = exp.bit_width(); i != 0; 
--i29.4k
)
  Branch (64:36): [True: 29.4k, False: 114]
+
65
29.4k
    {
66
29.4k
        ret = arith.mul(ret, ret);
67
29.4k
        if (exp[i - 1])
  Branch (67:13): [True: 15.0k, False: 14.3k]
+
68
15.0k
            ret = arith.mul(ret, base_mont);
69
29.4k
    }
70
71
114
    return arith.from_mont(ret);
72
114
}
modexp.cpp:intx::uint<8192u> (anonymous namespace)::modexp_odd<intx::uint<8192u>>(intx::uint<8192u> const&, (anonymous namespace)::Exponent, intx::uint<8192u> const&)
Line
Count
Source
59
200
{
60
200
    const evmmax::ModArith<UIntT> arith{mod};
61
200
    const auto base_mont = arith.to_mont(base);
62
63
200
    auto ret = arith.to_mont(1);
64
1.33k
    for (auto i = exp.bit_width(); i != 0; 
--i1.13k
)
  Branch (64:36): [True: 1.13k, False: 200]
+
65
1.13k
    {
66
1.13k
        ret = arith.mul(ret, ret);
67
1.13k
        if (exp[i - 1])
  Branch (67:13): [True: 328, False: 806]
+
68
328
            ret = arith.mul(ret, base_mont);
69
1.13k
    }
70
71
200
    return arith.from_mont(ret);
72
200
}
73
74
template <typename UIntT>
75
UIntT modexp_pow2(const UIntT& base, Exponent exp, unsigned k) noexcept
76
1.77k
{
77
1.77k
    assert(k != 0);  // Modulus of 1 should be covered as "odd".
78
1.77k
    UIntT ret = 1;
79
186k
    for (auto i = exp.bit_width(); i != 0; 
--i184k
)
  Branch (79:36): [True: 123k, False: 642]
+
  Branch (79:36): [True: 22.8k, False: 628]
+
  Branch (79:36): [True: 8.08k, False: 276]
+
  Branch (79:36): [True: 660, False: 66]
+
  Branch (79:36): [True: 29.3k, False: 80]
+
  Branch (79:36): [True: 724, False: 86]
+
80
184k
    {
81
184k
        ret *= ret;
82
184k
        if (exp[i - 1])
  Branch (82:13): [True: 88.2k, False: 34.9k]
+
  Branch (82:13): [True: 11.1k, False: 11.6k]
+
  Branch (82:13): [True: 5.57k, False: 2.51k]
+
  Branch (82:13): [True: 198, False: 462]
+
  Branch (82:13): [True: 15.0k, False: 14.3k]
+
  Branch (82:13): [True: 234, False: 490]
+
83
120k
            ret *= base;
84
184k
    }
85
86
1.77k
    const auto mod_pow2_mask = (UIntT{1} << k) - 1;
87
1.77k
    ret &= mod_pow2_mask;
88
1.77k
    return ret;
89
1.77k
}
modexp.cpp:intx::uint<128u> (anonymous namespace)::modexp_pow2<intx::uint<128u>>(intx::uint<128u> const&, (anonymous namespace)::Exponent, unsigned int)
Line
Count
Source
76
642
{
77
642
    assert(k != 0);  // Modulus of 1 should be covered as "odd".
78
642
    UIntT ret = 1;
79
123k
    for (auto i = exp.bit_width(); i != 0; 
--i123k
)
  Branch (79:36): [True: 123k, False: 642]
+
80
123k
    {
81
123k
        ret *= ret;
82
123k
        if (exp[i - 1])
  Branch (82:13): [True: 88.2k, False: 34.9k]
+
83
88.2k
            ret *= base;
84
123k
    }
85
86
642
    const auto mod_pow2_mask = (UIntT{1} << k) - 1;
87
642
    ret &= mod_pow2_mask;
88
642
    return ret;
89
642
}
modexp.cpp:intx::uint<256u> (anonymous namespace)::modexp_pow2<intx::uint<256u>>(intx::uint<256u> const&, (anonymous namespace)::Exponent, unsigned int)
Line
Count
Source
76
628
{
77
628
    assert(k != 0);  // Modulus of 1 should be covered as "odd".
78
628
    UIntT ret = 1;
79
23.4k
    for (auto i = exp.bit_width(); i != 0; 
--i22.8k
)
  Branch (79:36): [True: 22.8k, False: 628]
+
80
22.8k
    {
81
22.8k
        ret *= ret;
82
22.8k
        if (exp[i - 1])
  Branch (82:13): [True: 11.1k, False: 11.6k]
+
83
11.1k
            ret *= base;
84
22.8k
    }
85
86
628
    const auto mod_pow2_mask = (UIntT{1} << k) - 1;
87
628
    ret &= mod_pow2_mask;
88
628
    return ret;
89
628
}
modexp.cpp:intx::uint<512u> (anonymous namespace)::modexp_pow2<intx::uint<512u>>(intx::uint<512u> const&, (anonymous namespace)::Exponent, unsigned int)
Line
Count
Source
76
276
{
77
276
    assert(k != 0);  // Modulus of 1 should be covered as "odd".
78
276
    UIntT ret = 1;
79
8.36k
    for (auto i = exp.bit_width(); i != 0; 
--i8.08k
)
  Branch (79:36): [True: 8.08k, False: 276]
+
80
8.08k
    {
81
8.08k
        ret *= ret;
82
8.08k
        if (exp[i - 1])
  Branch (82:13): [True: 5.57k, False: 2.51k]
+
83
5.57k
            ret *= base;
84
8.08k
    }
85
86
276
    const auto mod_pow2_mask = (UIntT{1} << k) - 1;
87
276
    ret &= mod_pow2_mask;
88
276
    return ret;
89
276
}
modexp.cpp:intx::uint<1024u> (anonymous namespace)::modexp_pow2<intx::uint<1024u>>(intx::uint<1024u> const&, (anonymous namespace)::Exponent, unsigned int)
Line
Count
Source
76
66
{
77
66
    assert(k != 0);  // Modulus of 1 should be covered as "odd".
78
66
    UIntT ret = 1;
79
726
    for (auto i = exp.bit_width(); i != 0; 
--i660
)
  Branch (79:36): [True: 660, False: 66]
+
80
660
    {
81
660
        ret *= ret;
82
660
        if (exp[i - 1])
  Branch (82:13): [True: 198, False: 462]
+
83
198
            ret *= base;
84
660
    }
85
86
66
    const auto mod_pow2_mask = (UIntT{1} << k) - 1;
87
66
    ret &= mod_pow2_mask;
88
66
    return ret;
89
66
}
modexp.cpp:intx::uint<2048u> (anonymous namespace)::modexp_pow2<intx::uint<2048u>>(intx::uint<2048u> const&, (anonymous namespace)::Exponent, unsigned int)
Line
Count
Source
76
80
{
77
80
    assert(k != 0);  // Modulus of 1 should be covered as "odd".
78
80
    UIntT ret = 1;
79
29.4k
    for (auto i = exp.bit_width(); i != 0; 
--i29.3k
)
  Branch (79:36): [True: 29.3k, False: 80]
+
80
29.3k
    {
81
29.3k
        ret *= ret;
82
29.3k
        if (exp[i - 1])
  Branch (82:13): [True: 15.0k, False: 14.3k]
+
83
15.0k
            ret *= base;
84
29.3k
    }
85
86
80
    const auto mod_pow2_mask = (UIntT{1} << k) - 1;
87
80
    ret &= mod_pow2_mask;
88
80
    return ret;
89
80
}
modexp.cpp:intx::uint<8192u> (anonymous namespace)::modexp_pow2<intx::uint<8192u>>(intx::uint<8192u> const&, (anonymous namespace)::Exponent, unsigned int)
Line
Count
Source
76
86
{
77
86
    assert(k != 0);  // Modulus of 1 should be covered as "odd".
78
86
    UIntT ret = 1;
79
810
    for (auto i = exp.bit_width(); i != 0; 
--i724
)
  Branch (79:36): [True: 724, False: 86]
+
80
724
    {
81
724
        ret *= ret;
82
724
        if (exp[i - 1])
  Branch (82:13): [True: 234, False: 490]
+
83
234
            ret *= base;
84
724
    }
85
86
86
    const auto mod_pow2_mask = (UIntT{1} << k) - 1;
87
86
    ret &= mod_pow2_mask;
88
86
    return ret;
89
86
}
90
91
/// Computes modular inversion for modulus of 2^k.
92
template <typename UIntT>
93
UIntT modinv_pow2(const UIntT& x, unsigned k) noexcept
94
1.01k
{
95
1.01k
    UIntT b = 1;
96
1.01k
    UIntT res;
97
254k
    for (size_t i = 0; i < k; 
++i253k
)
  Branch (97:24): [True: 3.91k, False: 366]
+
  Branch (97:24): [True: 3.88k, False: 276]
+
  Branch (97:24): [True: 15.4k, False: 212]
+
  Branch (97:24): [True: 27.8k, False: 44]
+
  Branch (97:24): [True: 51.8k, False: 58]
+
  Branch (97:24): [True: 150k, False: 62]
+
98
253k
    {
99
253k
        const auto t = b & 1;
100
253k
        b = (b - x * t) >> 1;
101
253k
        res |= t << i;
102
253k
    }
103
1.01k
    return res;
104
1.01k
}
modexp.cpp:intx::uint<128u> (anonymous namespace)::modinv_pow2<intx::uint<128u>>(intx::uint<128u> const&, unsigned int)
Line
Count
Source
94
366
{
95
366
    UIntT b = 1;
96
366
    UIntT res;
97
4.27k
    for (size_t i = 0; i < k; 
++i3.91k
)
  Branch (97:24): [True: 3.91k, False: 366]
+
98
3.91k
    {
99
3.91k
        const auto t = b & 1;
100
3.91k
        b = (b - x * t) >> 1;
101
3.91k
        res |= t << i;
102
3.91k
    }
103
366
    return res;
104
366
}
modexp.cpp:intx::uint<256u> (anonymous namespace)::modinv_pow2<intx::uint<256u>>(intx::uint<256u> const&, unsigned int)
Line
Count
Source
94
276
{
95
276
    UIntT b = 1;
96
276
    UIntT res;
97
4.16k
    for (size_t i = 0; i < k; 
++i3.88k
)
  Branch (97:24): [True: 3.88k, False: 276]
+
98
3.88k
    {
99
3.88k
        const auto t = b & 1;
100
3.88k
        b = (b - x * t) >> 1;
101
3.88k
        res |= t << i;
102
3.88k
    }
103
276
    return res;
104
276
}
modexp.cpp:intx::uint<512u> (anonymous namespace)::modinv_pow2<intx::uint<512u>>(intx::uint<512u> const&, unsigned int)
Line
Count
Source
94
212
{
95
212
    UIntT b = 1;
96
212
    UIntT res;
97
15.6k
    for (size_t i = 0; i < k; 
++i15.4k
)
  Branch (97:24): [True: 15.4k, False: 212]
+
98
15.4k
    {
99
15.4k
        const auto t = b & 1;
100
15.4k
        b = (b - x * t) >> 1;
101
15.4k
        res |= t << i;
102
15.4k
    }
103
212
    return res;
104
212
}
modexp.cpp:intx::uint<1024u> (anonymous namespace)::modinv_pow2<intx::uint<1024u>>(intx::uint<1024u> const&, unsigned int)
Line
Count
Source
94
44
{
95
44
    UIntT b = 1;
96
44
    UIntT res;
97
27.9k
    for (size_t i = 0; i < k; 
++i27.8k
)
  Branch (97:24): [True: 27.8k, False: 44]
+
98
27.8k
    {
99
27.8k
        const auto t = b & 1;
100
27.8k
        b = (b - x * t) >> 1;
101
27.8k
        res |= t << i;
102
27.8k
    }
103
44
    return res;
104
44
}
modexp.cpp:intx::uint<2048u> (anonymous namespace)::modinv_pow2<intx::uint<2048u>>(intx::uint<2048u> const&, unsigned int)
Line
Count
Source
94
58
{
95
58
    UIntT b = 1;
96
58
    UIntT res;
97
51.9k
    for (size_t i = 0; i < k; 
++i51.8k
)
  Branch (97:24): [True: 51.8k, False: 58]
+
98
51.8k
    {
99
51.8k
        const auto t = b & 1;
100
51.8k
        b = (b - x * t) >> 1;
101
51.8k
        res |= t << i;
102
51.8k
    }
103
58
    return res;
104
58
}
modexp.cpp:intx::uint<8192u> (anonymous namespace)::modinv_pow2<intx::uint<8192u>>(intx::uint<8192u> const&, unsigned int)
Line
Count
Source
94
62
{
95
62
    UIntT b = 1;
96
62
    UIntT res;
97
150k
    for (size_t i = 0; i < k; 
++i150k
)
  Branch (97:24): [True: 150k, False: 62]
+
98
150k
    {
99
150k
        const auto t = b & 1;
100
150k
        b = (b - x * t) >> 1;
101
150k
        res |= t << i;
102
150k
    }
103
62
    return res;
104
62
}
105
106
template <typename UIntT>
107
UIntT load(std::span<const uint8_t> data) noexcept
108
6.50k
{
109
6.50k
    static constexpr auto UINT_SIZE = sizeof(UIntT);
110
6.50k
    assert(data.size() <= UINT_SIZE);
111
6.50k
    uint8_t tmp[UINT_SIZE]{};
112
6.50k
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
113
6.50k
    return be::load<UIntT>(tmp);
114
6.50k
}
modexp.cpp:intx::uint<128u> (anonymous namespace)::load<intx::uint<128u>>(std::span<unsigned char const, 18446744073709551615ul>)
Line
Count
Source
108
1.79k
{
109
1.79k
    static constexpr auto UINT_SIZE = sizeof(UIntT);
110
    assert(data.size() <= UINT_SIZE);
111
1.79k
    uint8_t tmp[UINT_SIZE]{};
112
1.79k
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
113
1.79k
    return be::load<UIntT>(tmp);
114
1.79k
}
modexp.cpp:intx::uint<256u> (anonymous namespace)::load<intx::uint<256u>>(std::span<unsigned char const, 18446744073709551615ul>)
Line
Count
Source
108
2.45k
{
109
2.45k
    static constexpr auto UINT_SIZE = sizeof(UIntT);
110
    assert(data.size() <= UINT_SIZE);
111
2.45k
    uint8_t tmp[UINT_SIZE]{};
112
2.45k
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
113
2.45k
    return be::load<UIntT>(tmp);
114
2.45k
}
modexp.cpp:intx::uint<512u> (anonymous namespace)::load<intx::uint<512u>>(std::span<unsigned char const, 18446744073709551615ul>)
Line
Count
Source
108
1.32k
{
109
1.32k
    static constexpr auto UINT_SIZE = sizeof(UIntT);
110
    assert(data.size() <= UINT_SIZE);
111
1.32k
    uint8_t tmp[UINT_SIZE]{};
112
1.32k
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
113
1.32k
    return be::load<UIntT>(tmp);
114
1.32k
}
modexp.cpp:intx::uint<1024u> (anonymous namespace)::load<intx::uint<1024u>>(std::span<unsigned char const, 18446744073709551615ul>)
Line
Count
Source
108
216
{
109
216
    static constexpr auto UINT_SIZE = sizeof(UIntT);
110
    assert(data.size() <= UINT_SIZE);
111
216
    uint8_t tmp[UINT_SIZE]{};
112
216
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
113
216
    return be::load<UIntT>(tmp);
114
216
}
modexp.cpp:intx::uint<2048u> (anonymous namespace)::load<intx::uint<2048u>>(std::span<unsigned char const, 18446744073709551615ul>)
Line
Count
Source
108
272
{
109
272
    static constexpr auto UINT_SIZE = sizeof(UIntT);
110
    assert(data.size() <= UINT_SIZE);
111
272
    uint8_t tmp[UINT_SIZE]{};
112
272
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
113
272
    return be::load<UIntT>(tmp);
114
272
}
modexp.cpp:intx::uint<8192u> (anonymous namespace)::load<intx::uint<8192u>>(std::span<unsigned char const, 18446744073709551615ul>)
Line
Count
Source
108
448
{
109
448
    static constexpr auto UINT_SIZE = sizeof(UIntT);
110
    assert(data.size() <= UINT_SIZE);
111
448
    uint8_t tmp[UINT_SIZE]{};
112
448
    std::ranges::copy(data, &tmp[UINT_SIZE - data.size()]);
113
448
    return be::load<UIntT>(tmp);
114
448
}
115
116
template <size_t Size>
117
void modexp_impl(std::span<const uint8_t> base_bytes, Exponent exp,
118
    std::span<const uint8_t> mod_bytes, uint8_t* output) noexcept
119
3.25k
{
120
3.25k
    using UIntT = intx::uint<Size * 8>;
121
3.25k
    const auto base = load<UIntT>(base_bytes);
122
3.25k
    const auto mod = load<UIntT>(mod_bytes);
123
124
3.25k
    UIntT result;
125
3.25k
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
  Branch (125:39): [True: 254, False: 642]
+
  Branch (125:39): [True: 598, False: 628]
+
  Branch (125:39): [True: 387, False: 276]
+
  Branch (125:39): [True: 42, False: 66]
+
  Branch (125:39): [True: 56, False: 80]
+
  Branch (125:39): [True: 138, False: 86]
+
126
1.47k
    {
127
1.47k
        result = modexp_odd(base, exp, mod);
128
1.47k
    }
129
1.77k
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
  Branch (129:50): [True: 276, False: 366]
+
  Branch (129:50): [True: 352, False: 276]
+
  Branch (129:50): [True: 64, False: 212]
+
  Branch (129:50): [True: 22, False: 44]
+
  Branch (129:50): [True: 22, False: 58]
+
  Branch (129:50): [True: 24, False: 62]
+
130
760
    {
131
760
        result = modexp_pow2(base, exp, mod_tz);
132
760
    }
133
1.01k
    else  // is even
134
1.01k
    {
135
1.01k
        const auto x1 = modexp_odd(base, exp, mod_odd);
136
1.01k
        const auto x2 = modexp_pow2(base, exp, mod_tz);
137
138
1.01k
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
139
140
1.01k
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
141
1.01k
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
142
1.01k
    }
143
144
3.25k
    trunc(std::span{output, mod_bytes.size()}, result);
145
3.25k
}
modexp.cpp:void (anonymous namespace)::modexp_impl<16ul>(std::span<unsigned char const, 18446744073709551615ul>, (anonymous namespace)::Exponent, std::span<unsigned char const, 18446744073709551615ul>, unsigned char*)
Line
Count
Source
119
896
{
120
896
    using UIntT = intx::uint<Size * 8>;
121
896
    const auto base = load<UIntT>(base_bytes);
122
896
    const auto mod = load<UIntT>(mod_bytes);
123
124
896
    UIntT result;
125
896
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
  Branch (125:39): [True: 254, False: 642]
+
126
254
    {
127
254
        result = modexp_odd(base, exp, mod);
128
254
    }
129
642
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
  Branch (129:50): [True: 276, False: 366]
+
130
276
    {
131
276
        result = modexp_pow2(base, exp, mod_tz);
132
276
    }
133
366
    else  // is even
134
366
    {
135
366
        const auto x1 = modexp_odd(base, exp, mod_odd);
136
366
        const auto x2 = modexp_pow2(base, exp, mod_tz);
137
138
366
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
139
140
366
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
141
366
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
142
366
    }
143
144
896
    trunc(std::span{output, mod_bytes.size()}, result);
145
896
}
modexp.cpp:void (anonymous namespace)::modexp_impl<32ul>(std::span<unsigned char const, 18446744073709551615ul>, (anonymous namespace)::Exponent, std::span<unsigned char const, 18446744073709551615ul>, unsigned char*)
Line
Count
Source
119
1.22k
{
120
1.22k
    using UIntT = intx::uint<Size * 8>;
121
1.22k
    const auto base = load<UIntT>(base_bytes);
122
1.22k
    const auto mod = load<UIntT>(mod_bytes);
123
124
1.22k
    UIntT result;
125
1.22k
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
  Branch (125:39): [True: 598, False: 628]
+
126
598
    {
127
598
        result = modexp_odd(base, exp, mod);
128
598
    }
129
628
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
  Branch (129:50): [True: 352, False: 276]
+
130
352
    {
131
352
        result = modexp_pow2(base, exp, mod_tz);
132
352
    }
133
276
    else  // is even
134
276
    {
135
276
        const auto x1 = modexp_odd(base, exp, mod_odd);
136
276
        const auto x2 = modexp_pow2(base, exp, mod_tz);
137
138
276
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
139
140
276
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
141
276
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
142
276
    }
143
144
1.22k
    trunc(std::span{output, mod_bytes.size()}, result);
145
1.22k
}
modexp.cpp:void (anonymous namespace)::modexp_impl<64ul>(std::span<unsigned char const, 18446744073709551615ul>, (anonymous namespace)::Exponent, std::span<unsigned char const, 18446744073709551615ul>, unsigned char*)
Line
Count
Source
119
663
{
120
663
    using UIntT = intx::uint<Size * 8>;
121
663
    const auto base = load<UIntT>(base_bytes);
122
663
    const auto mod = load<UIntT>(mod_bytes);
123
124
663
    UIntT result;
125
663
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
  Branch (125:39): [True: 387, False: 276]
+
126
387
    {
127
387
        result = modexp_odd(base, exp, mod);
128
387
    }
129
276
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
  Branch (129:50): [True: 64, False: 212]
+
130
64
    {
131
64
        result = modexp_pow2(base, exp, mod_tz);
132
64
    }
133
212
    else  // is even
134
212
    {
135
212
        const auto x1 = modexp_odd(base, exp, mod_odd);
136
212
        const auto x2 = modexp_pow2(base, exp, mod_tz);
137
138
212
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
139
140
212
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
141
212
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
142
212
    }
143
144
663
    trunc(std::span{output, mod_bytes.size()}, result);
145
663
}
modexp.cpp:void (anonymous namespace)::modexp_impl<128ul>(std::span<unsigned char const, 18446744073709551615ul>, (anonymous namespace)::Exponent, std::span<unsigned char const, 18446744073709551615ul>, unsigned char*)
Line
Count
Source
119
108
{
120
108
    using UIntT = intx::uint<Size * 8>;
121
108
    const auto base = load<UIntT>(base_bytes);
122
108
    const auto mod = load<UIntT>(mod_bytes);
123
124
108
    UIntT result;
125
108
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
  Branch (125:39): [True: 42, False: 66]
+
126
42
    {
127
42
        result = modexp_odd(base, exp, mod);
128
42
    }
129
66
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
  Branch (129:50): [True: 22, False: 44]
+
130
22
    {
131
22
        result = modexp_pow2(base, exp, mod_tz);
132
22
    }
133
44
    else  // is even
134
44
    {
135
44
        const auto x1 = modexp_odd(base, exp, mod_odd);
136
44
        const auto x2 = modexp_pow2(base, exp, mod_tz);
137
138
44
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
139
140
44
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
141
44
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
142
44
    }
143
144
108
    trunc(std::span{output, mod_bytes.size()}, result);
145
108
}
modexp.cpp:void (anonymous namespace)::modexp_impl<256ul>(std::span<unsigned char const, 18446744073709551615ul>, (anonymous namespace)::Exponent, std::span<unsigned char const, 18446744073709551615ul>, unsigned char*)
Line
Count
Source
119
136
{
120
136
    using UIntT = intx::uint<Size * 8>;
121
136
    const auto base = load<UIntT>(base_bytes);
122
136
    const auto mod = load<UIntT>(mod_bytes);
123
124
136
    UIntT result;
125
136
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
  Branch (125:39): [True: 56, False: 80]
+
126
56
    {
127
56
        result = modexp_odd(base, exp, mod);
128
56
    }
129
80
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
  Branch (129:50): [True: 22, False: 58]
+
130
22
    {
131
22
        result = modexp_pow2(base, exp, mod_tz);
132
22
    }
133
58
    else  // is even
134
58
    {
135
58
        const auto x1 = modexp_odd(base, exp, mod_odd);
136
58
        const auto x2 = modexp_pow2(base, exp, mod_tz);
137
138
58
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
139
140
58
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
141
58
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
142
58
    }
143
144
136
    trunc(std::span{output, mod_bytes.size()}, result);
145
136
}
modexp.cpp:void (anonymous namespace)::modexp_impl<1024ul>(std::span<unsigned char const, 18446744073709551615ul>, (anonymous namespace)::Exponent, std::span<unsigned char const, 18446744073709551615ul>, unsigned char*)
Line
Count
Source
119
224
{
120
224
    using UIntT = intx::uint<Size * 8>;
121
224
    const auto base = load<UIntT>(base_bytes);
122
224
    const auto mod = load<UIntT>(mod_bytes);
123
124
224
    UIntT result;
125
224
    if (const auto mod_tz = ctz(mod); mod_tz == 0)  // is odd
  Branch (125:39): [True: 138, False: 86]
+
126
138
    {
127
138
        result = modexp_odd(base, exp, mod);
128
138
    }
129
86
    else if (const auto mod_odd = mod >> mod_tz; mod_odd == 1)  // is power of 2
  Branch (129:50): [True: 24, False: 62]
+
130
24
    {
131
24
        result = modexp_pow2(base, exp, mod_tz);
132
24
    }
133
62
    else  // is even
134
62
    {
135
62
        const auto x1 = modexp_odd(base, exp, mod_odd);
136
62
        const auto x2 = modexp_pow2(base, exp, mod_tz);
137
138
62
        const auto mod_odd_inv = modinv_pow2(mod_odd, mod_tz);
139
140
62
        const auto mod_pow2_mask = (UIntT{1} << mod_tz) - 1;
141
62
        result = x1 + (((x2 - x1) * mod_odd_inv) & mod_pow2_mask) * mod_odd;
142
62
    }
143
144
224
    trunc(std::span{output, mod_bytes.size()}, result);
145
224
}
146
}  // namespace
147
148
namespace evmone::crypto
149
{
150
void modexp(std::span<const uint8_t> base, std::span<const uint8_t> exp,
151
    std::span<const uint8_t> mod, uint8_t* output) noexcept
152
3.25k
{
153
3.25k
    static constexpr auto MAX_INPUT_SIZE = 1024;
154
3.25k
    assert(base.size() <= MAX_INPUT_SIZE);
155
3.25k
    assert(mod.size() <= MAX_INPUT_SIZE);
156
157
3.25k
    const Exponent exp_obj{exp};
158
159
3.25k
    if (const auto size = std::max(mod.size(), base.size()); size <= 16)
  Branch (159:62): [True: 896, False: 2.35k]
+
160
896
        modexp_impl<16>(base, exp_obj, mod, output);
161
2.35k
    else if (size <= 32)
  Branch (161:14): [True: 1.22k, False: 1.13k]
+
162
1.22k
        modexp_impl<32>(base, exp_obj, mod, output);
163
1.13k
    else if (size <= 64)
  Branch (163:14): [True: 663, False: 468]
+
164
663
        modexp_impl<64>(base, exp_obj, mod, output);
165
468
    else if (size <= 128)
  Branch (165:14): [True: 108, False: 360]
+
166
108
        modexp_impl<128>(base, exp_obj, mod, output);
167
360
    else if (size <= 256)
  Branch (167:14): [True: 136, False: 224]
+
168
136
        modexp_impl<256>(base, exp_obj, mod, output);
169
224
    else
170
224
        modexp_impl<MAX_INPUT_SIZE>(base, exp_obj, mod, output);
171
3.25k
}
172
}  // namespace evmone::crypto
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/fields.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/fields.hpp.html new file mode 100644 index 0000000000..fb96b51aea --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/fields.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/fields.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include "../../bn254.hpp"
7
#include "../../ecc.hpp"
8
#include "../field_template.hpp"
9
10
namespace evmmax::bn254
11
{
12
using namespace intx;
13
14
/// Specifies base field value type and modular arithmetic for bn254 curve.
15
struct BaseFieldConfig
16
{
17
    using ValueT = uint256;
18
    static constexpr auto& MOD_ARITH = Curve::Fp;
19
    static constexpr auto ONE = MOD_ARITH.to_mont(1);
20
};
21
using Fq = ecc::BaseFieldElem<BaseFieldConfig>;
22
23
// Extension fields implemented based on https://hackmd.io/@jpw/bn254#Field-extension-towers
24
25
/// Specifies Fq^2 extension field for bn254 curve. Base field extended with irreducible `u^2 + 1`
26
/// polynomial over the base field. `u` is the Fq^2 element.
27
struct Fq2Config
28
{
29
    using BaseFieldT = Fq;
30
    using ValueT = Fq;
31
    static constexpr auto DEGREE = 2;
32
};
33
using Fq2 = ecc::ExtFieldElem<Fq2Config>;
34
35
/// Specifies Fq^6 extension field for bn254 curve. Fq^2 field extended with irreducible
36
/// `v^3 - (9 + u)` polynomial over the Fq^2 field. `v` is the Fq^6 field element.
37
struct Fq6Config
38
{
39
    using BaseFieldT = Fq;
40
    using ValueT = Fq2;
41
    static constexpr uint8_t DEGREE = 3;
42
    static constexpr auto ksi = Fq2({Fq::from_int(9_u256), Fq::from_int(1_u256)});
43
    static constexpr auto _3_ksi_inv = Fq2({
44
        Fq::from_int(0x2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5_u256),
45
        Fq::from_int(0x9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2_u256),
46
    });
47
};
48
using Fq6 = ecc::ExtFieldElem<Fq6Config>;
49
50
/// Specifies Fq^12 extension field for bn254 curve. Fq^6 field extended with irreducible
51
/// `w^2 - v` polynomial over the Fq^2 field. `v` is the Fq^6 field element.
52
/// `w` is Fq^12 field element.
53
struct Fq12Config
54
{
55
    using BaseFieldT = Fq;
56
    using ValueT = Fq6;
57
58
    static constexpr uint8_t DEGREE = 2;
59
};
60
using Fq12 = ecc::ExtFieldElem<Fq12Config>;
61
62
/// Multiplies two Fq^2 field elements
63
constexpr Fq2 multiply(const Fq2& a, const Fq2& b)
64
7.54M
{
65
7.54M
    return Fq2({
66
7.54M
        a.coeffs[0] * b.coeffs[0] - a.coeffs[1] * b.coeffs[1],
67
7.54M
        a.coeffs[1] * b.coeffs[0] + a.coeffs[0] * b.coeffs[1],
68
7.54M
    });
69
7.54M
}
70
71
/// Multiplies two Fq^6 field elements
72
constexpr Fq6 multiply(const Fq6& a, const Fq6& b)
73
235k
{
74
235k
    const auto& a0 = a.coeffs[0];
75
235k
    const auto& a1 = a.coeffs[1];
76
235k
    const auto& a2 = a.coeffs[2];
77
235k
    const auto& b0 = b.coeffs[0];
78
235k
    const auto& b1 = b.coeffs[1];
79
235k
    const auto& b2 = b.coeffs[2];
80
81
235k
    const Fq2& ksi = Fq6Config::ksi;
82
83
235k
    const auto t0 = a0 * b0;
84
235k
    const auto t1 = a1 * b1;
85
235k
    const auto t2 = a2 * b2;
86
87
235k
    const auto c0 = ((a1 + a2) * (b1 + b2) - t1 - t2) * ksi + t0;
88
235k
    const auto c1 = (a0 + a1) * (b0 + b1) - t0 - t1 + ksi * t2;
89
235k
    const auto c2 = (a0 + a2) * (b0 + b2) - t0 - t2 + t1;
90
91
235k
    return Fq6({c0, c1, c2});
92
235k
}
93
94
/// Multiplies two Fq^12 field elements
95
constexpr Fq12 multiply(const Fq12& a, const Fq12& b)
96
35.0k
{
97
35.0k
    const auto& a0 = a.coeffs[0];
98
35.0k
    const auto& a1 = a.coeffs[1];
99
35.0k
    const auto& b0 = b.coeffs[0];
100
35.0k
    const auto& b1 = b.coeffs[1];
101
102
35.0k
    const auto t0 = a0 * b0;
103
35.0k
    const auto t1 = a1 * b1;
104
105
35.0k
    const Fq2& ksi = Fq6Config::ksi;
106
107
35.0k
    const auto c0 = t0 + Fq6({ksi * t1.coeffs[2], t1.coeffs[0], t1.coeffs[1]});  // gamma is sparse.
108
35.0k
    const auto c1 = (a0 + a1) * (b0 + b1) - t0 - t1;
109
110
35.0k
    return Fq12({c0, c1});
111
35.0k
}
112
113
/// Inverses the base field element
114
inline Fq inverse(const Fq& x)
115
516
{
116
516
    return Fq(BaseFieldConfig::MOD_ARITH.inv(x.value()));
117
516
}
118
119
/// Inverses the Fq^2 field element
120
inline Fq2 inverse(const Fq2& f)
121
516
{
122
516
    const auto& a0 = f.coeffs[0];
123
516
    const auto& a1 = f.coeffs[1];
124
516
    auto t0 = a0 * a0;
125
516
    auto t1 = a1 * a1;
126
127
516
    t0 = t0 + t1;
128
516
    t1 = t0.inv();
129
130
516
    const auto c0 = a0 * t1;
131
516
    const auto c1 = -(a1 * t1);
132
133
516
    return Fq2({c0, c1});
134
516
}
135
136
/// Inverses the Fq^6 field element
137
inline Fq6 inverse(const Fq6& f)
138
516
{
139
516
    const auto& a0 = f.coeffs[0];
140
516
    const auto& a1 = f.coeffs[1];
141
516
    const auto& a2 = f.coeffs[2];
142
143
516
    const Fq2& ksi = Fq6Config::ksi;
144
145
516
    const auto t0 = a0 * a0;
146
516
    const auto t1 = a1 * a1;
147
516
    const auto t2 = a2 * a2;
148
149
516
    const auto t3 = a0 * a1;
150
516
    const auto t4 = a0 * a2;
151
516
    const auto t5 = a2 * a1;
152
153
516
    const auto c0 = t0 - ksi * t5;
154
516
    const auto c1 = ksi * t2 - t3;
155
516
    const auto c2 = t1 - t4;
156
157
516
    const auto t = a0 * c0 + (a2 * c1 + a1 * c2) * ksi;
158
516
    const auto t6 = t.inv();
159
160
516
    return Fq6({c0 * t6, c1 * t6, c2 * t6});
161
516
}
162
163
/// Inverses the Fq^12 field element
164
inline Fq12 inverse(const Fq12& f)
165
516
{
166
516
    const auto& a0 = f.coeffs[0];
167
516
    const auto& a1 = f.coeffs[1];
168
169
516
    auto t0 = a0 * a0;
170
516
    auto t1 = a1 * a1;
171
172
516
    const Fq2& ksi = Fq6Config::ksi;
173
174
516
    t0 = t0 - Fq6({ksi * t1.coeffs[2], t1.coeffs[0], t1.coeffs[1]});  // gamma is sparse.
175
516
    t1 = t0.inv();
176
177
516
    const auto c0 = a0 * t1;
178
516
    const auto c1 = -(a1 * t1);
179
180
516
    return Fq12({c0, c1});
181
516
}
182
}  // namespace evmmax::bn254
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/pairing.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/pairing.cpp.html new file mode 100644 index 0000000000..05d2d07d89 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/pairing.cpp.html @@ -0,0 +1,98 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/pairing.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "../../bn254.hpp"
6
#include "fields.hpp"
7
#include "utils.hpp"
8
#include <vector>
9
10
namespace evmmax::bn254
11
{
12
namespace
13
{
14
/// Multiplies `fr` (Fq12) values by sparse `v` (Fq12) value of the form
15
/// [[t[0] * y, 0, 0],[t[1] * x, t[0], 0]] where `v` coefficients are from Fq2
16
constexpr void multiply_by_lin_func_value(
17
    Fq12& fr, std::array<Fq2, 3> t, const Fq& x, const Fq& y) noexcept
18
87.1k
{
19
87.1k
    const Fq12 f = fr;
20
87.1k
    const auto& ksi = Fq6Config::ksi;
21
22
87.1k
    const auto t0y = t[0] * y;
23
87.1k
    const auto t1x = t[1] * x;
24
87.1k
    const auto t2ksi = t[2] * ksi;
25
26
87.1k
    fr.coeffs[0].coeffs[0] = f.coeffs[0].coeffs[0] * t0y + f.coeffs[1].coeffs[2] * t1x * ksi +
27
87.1k
                             f.coeffs[1].coeffs[1] * t2ksi;
28
87.1k
    fr.coeffs[0].coeffs[1] =
29
87.1k
        f.coeffs[0].coeffs[1] * t0y + f.coeffs[1].coeffs[0] * t1x + f.coeffs[1].coeffs[2] * t2ksi;
30
87.1k
    fr.coeffs[0].coeffs[2] =
31
87.1k
        f.coeffs[0].coeffs[2] * t0y + f.coeffs[1].coeffs[1] * t1x + f.coeffs[1].coeffs[0] * t[2];
32
87.1k
    fr.coeffs[1].coeffs[0] =
33
87.1k
        f.coeffs[1].coeffs[0] * t0y + f.coeffs[0].coeffs[0] * t1x + f.coeffs[0].coeffs[2] * t2ksi;
34
87.1k
    fr.coeffs[1].coeffs[1] =
35
87.1k
        f.coeffs[1].coeffs[1] * t0y + f.coeffs[0].coeffs[1] * t1x + f.coeffs[0].coeffs[0] * t[2];
36
87.1k
    fr.coeffs[1].coeffs[2] =
37
87.1k
        f.coeffs[1].coeffs[2] * t0y + f.coeffs[0].coeffs[2] * t1x + f.coeffs[0].coeffs[1] * t[2];
38
87.1k
}
39
40
// 0000000100010010000010000000010000100010000000010010000000001000000100100000010000000000100000100001001000000010001000000001000101
41
// NAF rep 00 -> 0, 01 -> 1, 10 -> -1
42
// miller loop goes from L-2 to 0 inclusively. NAF rep of 29793968203157093288 (6x+2) is two bits
43
// longer, but we omit lowest 2 bits.
44
inline constexpr auto ATE_LOOP_COUNT_NAF = 0x1120804220120081204008212022011_u128;
45
inline constexpr int LOG_ATE_LOOP_COUNT = 63;
46
47
/// Miller loop according to https://eprint.iacr.org/2010/354.pdf Algorithm 1.
48
Fq12 miller_loop(const ecc::Point<Fq2>& Q, const ecc::Point<Fq>& P) noexcept
49
1.00k
{
50
1.00k
    auto T = ecc::JacPoint<Fq2>::from(Q);
51
1.00k
    auto nQ = -Q;
52
1.00k
    auto f = Fq12::one();
53
1.00k
    std::array<Fq2, 3> t;
54
1.00k
    auto naf = ATE_LOOP_COUNT_NAF;
55
1.00k
    const auto ny = -P.y;
56
57
65.1k
    for (int i = 0; i <= LOG_ATE_LOOP_COUNT; 
++i64.1k
)
  Branch (57:21): [True: 64.1k, False: 1.00k]
+
58
64.1k
    {
59
64.1k
        T = lin_func_and_dbl(T, t);
60
64.1k
        f = square(f);
61
64.1k
        multiply_by_lin_func_value(f, t, P.x, ny);
62
63
64.1k
        if (naf & 1)
  Branch (63:13): [True: 9.01k, False: 55.1k]
+
64
9.01k
        {
65
9.01k
            T = lin_func_and_add(T, Q, t);
66
9.01k
            multiply_by_lin_func_value(f, t, P.x, P.y);
67
9.01k
        }
68
55.1k
        else if (naf & 2)
  Branch (68:18): [True: 12.0k, False: 43.0k]
+
69
12.0k
        {
70
12.0k
            T = lin_func_and_add(T, nQ, t);
71
12.0k
            multiply_by_lin_func_value(f, t, P.x, P.y);
72
12.0k
        }
73
64.1k
        naf >>= 2;
74
64.1k
    }
75
76
    // Frobenius endomorphism for point Q from twisted curve over Fq2 field.
77
    // It's essentially untwist -> frobenius -> twist chain of transformation.
78
1.00k
    const auto Q1 = endomorphism<1>(Q);
79
80
    // Similar to above one. It makes untwist -> frobenius^2 -> twist transformation plus
81
    // negation according to miller loop spec.
82
1.00k
    const auto nQ2 = -endomorphism<2>(Q);
83
84
1.00k
    T = lin_func_and_add(T, Q1, t);
85
1.00k
    multiply_by_lin_func_value(f, t, P.x, P.y);
86
87
1.00k
    lin_func(T, nQ2, t);
88
1.00k
    multiply_by_lin_func_value(f, t, P.x, P.y);
89
90
1.00k
    return f;
91
1.00k
}
92
93
/// Final exponentiation formula.
94
/// Based on https://eprint.iacr.org/2010/354.pdf 4.2 Algorithm 31.
95
Fq12 final_exp(const Fq12& v) noexcept
96
516
{
97
516
    auto f = v;
98
516
    auto f1 = f.conjugate();
99
100
516
    f = f1 * f.inv();            // easy 1
101
516
    f = endomorphism<2>(f) * f;  // easy 2
102
103
516
    f1 = f.conjugate();
104
105
516
    const auto ft1 = cyclotomic_pow_to_X(f);
106
516
    const auto ft2 = cyclotomic_pow_to_X(ft1);
107
516
    const auto ft3 = cyclotomic_pow_to_X(ft2);
108
516
    const auto fp1 = endomorphism<1>(f);
109
516
    const auto fp2 = endomorphism<2>(f);
110
516
    const auto fp3 = endomorphism<3>(f);
111
516
    const auto y0 = fp1 * fp2 * fp3;
112
516
    const auto y1 = f1;
113
516
    const auto y2 = endomorphism<2>(ft2);
114
516
    const auto y3 = endomorphism<1>(ft1).conjugate();
115
516
    const auto y4 = (endomorphism<1>(ft2) * ft1).conjugate();
116
516
    const auto y5 = ft2.conjugate();
117
516
    const auto y6 = (endomorphism<1>(ft3) * ft3).conjugate();
118
119
516
    auto t0 = cyclotomic_square(y6) * y4 * y5;
120
516
    auto t1 = y3 * y5 * t0;
121
516
    t0 = t0 * y2;
122
516
    t1 = cyclotomic_square(t1) * t0;
123
516
    t1 = cyclotomic_square(t1);
124
516
    t0 = t1 * y1;
125
516
    t1 = t1 * y0;
126
516
    t0 = cyclotomic_square(t0);
127
516
    return t1 * t0;
128
516
}
129
}  // namespace
130
131
std::optional<bool> pairing_check(std::span<const std::pair<Point, ExtPoint>> pairs) noexcept
132
1.62k
{
133
1.62k
    if (pairs.empty())
  Branch (133:9): [True: 306, False: 1.31k]
+
134
306
        return true;
135
136
1.31k
    auto f = Fq12::one();
137
138
1.31k
    for (const auto& [p, q] : pairs)
  Branch (138:29): [True: 2.05k, False: 516]
+
139
2.05k
    {
140
2.05k
        if (!is_field_element(p.x) || 
!is_field_element(p.y)2.01k
||
!is_field_element(q.x.first)2.01k
||
  Branch (140:13): [True: 36, False: 2.01k]
+  Branch (140:39): [True: 6, False: 2.01k]
+  Branch (140:65): [True: 30, False: 1.98k]
+
141
2.05k
            
!is_field_element(q.x.second)1.98k
||
!is_field_element(q.y.first)1.97k
||
  Branch (141:13): [True: 6, False: 1.97k]
+  Branch (141:46): [True: 30, False: 1.94k]
+
142
2.05k
            
!is_field_element(q.y.second)1.94k
)
  Branch (142:13): [True: 24, False: 1.92k]
+
  MC/DC Decision Region (140:13) to (142:42)
+
+  Number of Conditions: 6
+     Condition C1 --> (140:13)
+     Condition C2 --> (140:39)
+     Condition C3 --> (140:65)
+     Condition C4 --> (141:13)
+     Condition C5 --> (141:46)
+     Condition C6 --> (142:13)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3, C4, C5, C6    Result
+  1 { F,  F,  F,  F,  F,  F  = F      }
+  2 { F,  F,  F,  F,  F,  T  = T      }
+  3 { F,  F,  F,  F,  T,  -  = T      }
+  4 { F,  F,  F,  T,  -,  -  = T      }
+  5 { F,  F,  T,  -,  -,  -  = T      }
+  6 { F,  T,  -,  -,  -,  -  = T      }
+  7 { T,  -,  -,  -,  -,  -  = T      }
+
+  C1-Pair: covered: (1,7)
+  C2-Pair: covered: (1,6)
+  C3-Pair: covered: (1,5)
+  C4-Pair: covered: (1,4)
+  C5-Pair: covered: (1,3)
+  C6-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
143
132
        {
144
132
            return std::nullopt;
145
132
        }
146
147
        // Converts points' coefficients in Montgomery form.
148
1.92k
        const auto P_aff = ecc::Point<Fq>{Fq::from_int(p.x), Fq::from_int(p.y)};
149
1.92k
        const auto Q_aff = ecc::Point<Fq2>{Fq2({Fq::from_int(q.x.first), Fq::from_int(q.x.second)}),
150
1.92k
            Fq2({Fq::from_int(q.y.first), Fq::from_int(q.y.second)})};
151
152
1.92k
        const bool g1_is_inf = is_infinity(P_aff);
153
1.92k
        const bool g2_is_inf = g2_is_infinity(Q_aff);
154
155
        // Verify that P in on curve. For this group it also means that P is in G1.
156
1.92k
        if (!g1_is_inf && 
!is_on_curve(P_aff)1.58k
)
  Branch (156:13): [True: 1.58k, False: 336]
+  Branch (156:27): [True: 108, False: 1.47k]
+
  MC/DC Decision Region (156:13) to (156:46)
+
+  Number of Conditions: 2
+     Condition C1 --> (156:13)
+     Condition C2 --> (156:27)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
157
108
            return std::nullopt;
158
159
        // Verify that Q in on curve and in proper subgroup. This subgroup is much smaller than
160
        // group containing all the points from twisted curve over Fq2 field.
161
1.81k
        if (!g2_is_inf && 
(1.60k
!is_on_twisted_curve(Q_aff)1.60k
||
!g2_subgroup_check(Q_aff)1.51k
))
  Branch (161:13): [True: 1.60k, False: 210]
+  Branch (161:28): [True: 84, False: 1.51k]
+  Branch (161:59): [True: 474, False: 1.04k]
+
  MC/DC Decision Region (161:13) to (161:85)
+
+  Number of Conditions: 3
+     Condition C1 --> (161:13)
+     Condition C2 --> (161:28)
+     Condition C3 --> (161:59)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  F,  F  = F      }
+  3 { T,  F,  T  = T      }
+  4 { T,  T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,4)
+  C3-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
162
558
            return std::nullopt;
163
164
        // If any of the points is infinity it means that miller_loop returns 1. so we can skip it.
165
1.25k
        if (!g1_is_inf && 
!g2_is_inf1.14k
)
  Branch (165:13): [True: 1.14k, False: 108]
+  Branch (165:27): [True: 1.00k, False: 144]
+
  MC/DC Decision Region (165:13) to (165:37)
+
+  Number of Conditions: 2
+     Condition C1 --> (165:13)
+     Condition C2 --> (165:27)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
166
1.00k
            f = f * miller_loop(Q_aff, P_aff);
167
1.25k
    }
168
169
    // final exp is calculated on accumulated value
170
516
    return final_exp(f) == Fq12::one();
171
1.31k
}
172
}  // namespace evmmax::bn254
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/utils.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/utils.hpp.html new file mode 100644 index 0000000000..98b04988e1 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/utils.hpp.html @@ -0,0 +1,53 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/bn254/utils.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include "fields.hpp"
7
8
namespace evmmax::bn254
9
{
10
consteval Fq2 make_fq2(const uint256& a, const uint256& b) noexcept
11
{
12
    return Fq2({Fq::from_int(a), Fq::from_int(b)});
13
}
14
15
/// Defines coefficients needed for fast Frobenius endomorphism computation.
16
/// For more ref see https://eprint.iacr.org/2010/354.pdf 3.2 Frobenius Operator.
17
/// TODO: Make it constexpr.
18
static inline std::array<std::array<Fq2, 5>, 3> FROBENIUS_COEFFS = {
19
    {
20
        {
21
            make_fq2(
22
                8376118865763821496583973867626364092589906065868298776909617916018768340080_u256,
23
                16469823323077808223889137241176536799009286646108169935659301613961712198316_u256),
24
            make_fq2(
25
                21575463638280843010398324269430826099269044274347216827212613867836435027261_u256,
26
                10307601595873709700152284273816112264069230130616436755625194854815875713954_u256),
27
            make_fq2(
28
                2821565182194536844548159561693502659359617185244120367078079554186484126554_u256,
29
                3505843767911556378687030309984248845540243509899259641013678093033130930403_u256),
30
            make_fq2(
31
                2581911344467009335267311115468803099551665605076196740867805258568234346338_u256,
32
                19937756971775647987995932169929341994314640652964949448313374472400716661030_u256),
33
            make_fq2(
34
                685108087231508774477564247770172212460312782337200605669322048753928464687_u256,
35
                8447204650696766136447902020341177575205426561248465145919723016860428151883_u256),
36
        },
37
        {
38
            make_fq2(
39
                21888242871839275220042445260109153167277707414472061641714758635765020556617_u256,
40
                0_u256),
41
            make_fq2(
42
                21888242871839275220042445260109153167277707414472061641714758635765020556616_u256,
43
                0_u256),
44
            make_fq2(
45
                21888242871839275222246405745257275088696311157297823662689037894645226208582_u256,
46
                0_u256),
47
            make_fq2(2203960485148121921418603742825762020974279258880205651966_u256, 0_u256),
48
            make_fq2(2203960485148121921418603742825762020974279258880205651967_u256, 0_u256),
49
        },
50
        {
51
            make_fq2(
52
                11697423496358154304825782922584725312912383441159505038794027105778954184319_u256,
53
                303847389135065887422783454877609941456349188919719272345083954437860409601_u256),
54
            make_fq2(
55
                3772000881919853776433695186713858239009073593817195771773381919316419345261_u256,
56
                2236595495967245188281701248203181795121068902605861227855261137820944008926_u256),
57
            make_fq2(
58
                19066677689644738377698246183563772429336693972053703295610958340458742082029_u256,
59
                18382399103927718843559375435273026243156067647398564021675359801612095278180_u256),
60
            make_fq2(
61
                5324479202449903542726783395506214481928257762400643279780343368557297135718_u256,
62
                16208900380737693084919495127334387981393726419856888799917914180988844123039_u256),
63
            make_fq2(
64
                8941241848238582420466759817324047081148088512956452953208002715982955420483_u256,
65
                10338197737521362862238855242243140895517409139741313354160881284257516364953_u256),
66
        },
67
    },
68
};
69
70
/// Verifies that value is in the proper prime field.
71
constexpr bool is_field_element(const uint256& v)
72
11.9k
{
73
11.9k
    return v < Curve::FIELD_PRIME;
74
11.9k
}
75
76
/// Verifies that affine point is on the curve (not twisted)
77
constexpr bool is_on_curve(const ecc::Point<Fq>& p) noexcept
78
1.58k
{
79
    // TODO(C++23): make static
80
1.58k
    constexpr auto B = Fq::from_int(3);
81
82
1.58k
    const auto x3 = p.x * p.x * p.x;
83
1.58k
    const auto y2 = p.y * p.y;
84
1.58k
    return y2 == x3 + B;
85
1.58k
}
86
87
/// Verifies that affine point over Fq^2 field is on the twisted curve.
88
constexpr bool is_on_twisted_curve(const evmmax::ecc::Point<Fq2>& p)
89
1.60k
{
90
1.60k
    const auto x3 = p.x * p.x * p.x;
91
1.60k
    const auto y2 = p.y * p.y;
92
93
1.60k
    return y2 == x3 + Fq6Config::_3_ksi_inv;
94
1.60k
}
95
96
/// Verifies that affine point over the base field is infinity.
97
constexpr bool is_infinity(const evmmax::ecc::Point<Fq>& p)
98
1.92k
{
99
1.92k
    return p.x.is_zero() && 
p.y.is_zero()360
;
  Branch (99:12): [True: 360, False: 1.56k]
+  Branch (99:29): [True: 336, False: 24]
+
  MC/DC Decision Region (99:12) to (99:42)
+
+  Number of Conditions: 2
+     Condition C1 --> (99:12)
+     Condition C2 --> (99:29)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
100
1.92k
}
101
102
/// Verifies that affine point over the Fq^2 extended field is infinity.
103
constexpr bool g2_is_infinity(const evmmax::ecc::Point<Fq2>& p)
104
1.92k
{
105
1.92k
    return p.x == Fq2::zero() && 
p.y == Fq2::zero()276
;
  Branch (105:12): [True: 276, False: 1.64k]
+  Branch (105:34): [True: 264, False: 12]
+
  MC/DC Decision Region (105:12) to (105:52)
+
+  Number of Conditions: 2
+     Condition C1 --> (105:12)
+     Condition C2 --> (105:34)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
106
1.92k
}
107
108
// Forbenius endomorphism related functions are implemented based on
109
// https://hackmd.io/@jpw/bn254#mathbb-G_2-membership-check-using-efficient-endomorphism
110
// and
111
// https://eprint.iacr.org/2010/354.pdf 3.2 Frobenius Operator
112
113
/// Computes Frobenius endomorphism of point `p` in Jacobian coordinates from twisted curve
114
/// over Fq2 extended field.
115
/// This specialisation computes Frobenius and Frobenius^3
116
/// TODO: add reference that it's exactly the same as untwist->frobenius->twist
117
template <int P>
118
constexpr ecc::JacPoint<Fq2> endomorphism(const ecc::JacPoint<Fq2>& p) noexcept
119
    requires(P == 1 || P == 3)
120
4.55k
{
121
4.55k
    return {
122
4.55k
        p.x.conjugate() * FROBENIUS_COEFFS[P - 1][1],
123
4.55k
        p.y.conjugate() * FROBENIUS_COEFFS[P - 1][2],
124
4.55k
        p.z.conjugate(),
125
4.55k
    };
126
4.55k
}
127
128
/// Computes Frobenius endomorphism of point `p` in Jacobian coordinates from twisted curve
129
/// over Fq^2 extended field.
130
/// This specialisation computes Frobenius^2
131
template <int P>
132
constexpr ecc::JacPoint<Fq2> endomorphism(const ecc::JacPoint<Fq2>& p) noexcept
133
    requires(P == 2)
134
1.51k
{
135
1.51k
    return {
136
1.51k
        p.x * FROBENIUS_COEFFS[1][1],
137
1.51k
        p.y * FROBENIUS_COEFFS[1][2],
138
1.51k
        p.z,
139
1.51k
    };
140
1.51k
}
141
142
/// Computes Frobenius endomorphism of point `p` in affine coordinates from twisted curve
143
/// over Fq^2 extended field.
144
/// This specialisation computes Frobenius and Frobenius^3
145
template <int P>
146
constexpr ecc::Point<Fq2> endomorphism(const ecc::Point<Fq2>& p) noexcept
147
    requires(P == 1 || P == 3)
148
1.00k
{
149
1.00k
    return {
150
1.00k
        p.x.conjugate() * FROBENIUS_COEFFS[P - 1][1],
151
1.00k
        p.y.conjugate() * FROBENIUS_COEFFS[P - 1][2],
152
1.00k
    };
153
1.00k
}
154
155
/// Computes Frobenius endomorphism of point `p` in affine coordinates from twisted curve
156
/// over Fq^2 extended field.
157
/// This specialisation computes Frobenius^2
158
template <int P>
159
constexpr ecc::Point<Fq2> endomorphism(const ecc::Point<Fq2>& p) noexcept
160
    requires(P == 2)
161
1.00k
{
162
1.00k
    return {
163
1.00k
        p.x * FROBENIUS_COEFFS[1][1],
164
1.00k
        p.y * FROBENIUS_COEFFS[1][2],
165
1.00k
    };
166
1.00k
}
167
168
/// Computes Frobenius endomorphism for Fq12 field member values
169
/// This specialisation computes Frobenius and Frobenius^3
170
template <int P>
171
constexpr Fq12 endomorphism(const Fq12& f) noexcept
172
    requires(P == 1 || P == 3)
173
2.58k
{
174
2.58k
    return Fq12({
175
2.58k
        Fq6({
176
2.58k
            f.coeffs[0].coeffs[0].conjugate(),
177
2.58k
            f.coeffs[0].coeffs[1].conjugate() * FROBENIUS_COEFFS[P - 1][1],
178
2.58k
            f.coeffs[0].coeffs[2].conjugate() * FROBENIUS_COEFFS[P - 1][3],
179
2.58k
        }),
180
2.58k
        Fq6({
181
2.58k
            f.coeffs[1].coeffs[0].conjugate() * FROBENIUS_COEFFS[P - 1][0],
182
2.58k
            f.coeffs[1].coeffs[1].conjugate() * FROBENIUS_COEFFS[P - 1][2],
183
2.58k
            f.coeffs[1].coeffs[2].conjugate() * FROBENIUS_COEFFS[P - 1][4],
184
2.58k
        }),
185
2.58k
    });
186
2.58k
}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> evmmax::bn254::endomorphism<1>(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&) requires T == 1 || T == 3
Line
Count
Source
173
2.06k
{
174
2.06k
    return Fq12({
175
2.06k
        Fq6({
176
2.06k
            f.coeffs[0].coeffs[0].conjugate(),
177
2.06k
            f.coeffs[0].coeffs[1].conjugate() * FROBENIUS_COEFFS[P - 1][1],
178
2.06k
            f.coeffs[0].coeffs[2].conjugate() * FROBENIUS_COEFFS[P - 1][3],
179
2.06k
        }),
180
2.06k
        Fq6({
181
2.06k
            f.coeffs[1].coeffs[0].conjugate() * FROBENIUS_COEFFS[P - 1][0],
182
2.06k
            f.coeffs[1].coeffs[1].conjugate() * FROBENIUS_COEFFS[P - 1][2],
183
2.06k
            f.coeffs[1].coeffs[2].conjugate() * FROBENIUS_COEFFS[P - 1][4],
184
2.06k
        }),
185
2.06k
    });
186
2.06k
}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> evmmax::bn254::endomorphism<3>(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&) requires T == 1 || T == 3
Line
Count
Source
173
516
{
174
516
    return Fq12({
175
516
        Fq6({
176
516
            f.coeffs[0].coeffs[0].conjugate(),
177
516
            f.coeffs[0].coeffs[1].conjugate() * FROBENIUS_COEFFS[P - 1][1],
178
516
            f.coeffs[0].coeffs[2].conjugate() * FROBENIUS_COEFFS[P - 1][3],
179
516
        }),
180
516
        Fq6({
181
516
            f.coeffs[1].coeffs[0].conjugate() * FROBENIUS_COEFFS[P - 1][0],
182
516
            f.coeffs[1].coeffs[1].conjugate() * FROBENIUS_COEFFS[P - 1][2],
183
516
            f.coeffs[1].coeffs[2].conjugate() * FROBENIUS_COEFFS[P - 1][4],
184
516
        }),
185
516
    });
186
516
}
187
188
/// Computes Frobenius operator for Fq12 field member values
189
/// This specialization computes Frobenius^2
190
template <int P>
191
constexpr Fq12 endomorphism(const Fq12& f) noexcept
192
    requires(P == 2)
193
1.54k
{
194
1.54k
    return Fq12({
195
1.54k
        Fq6({
196
1.54k
            f.coeffs[0].coeffs[0],
197
1.54k
            f.coeffs[0].coeffs[1] * FROBENIUS_COEFFS[1][1],
198
1.54k
            f.coeffs[0].coeffs[2] * FROBENIUS_COEFFS[1][3],
199
1.54k
        }),
200
1.54k
        Fq6({
201
1.54k
            f.coeffs[1].coeffs[0] * FROBENIUS_COEFFS[1][0],
202
1.54k
            f.coeffs[1].coeffs[1] * FROBENIUS_COEFFS[1][2],
203
1.54k
            f.coeffs[1].coeffs[2] * FROBENIUS_COEFFS[1][4],
204
1.54k
        }),
205
1.54k
    });
206
1.54k
}
207
208
209
/// Computes `P0 + P1` in Jacobian coordinates.
210
constexpr ecc::JacPoint<Fq2> add(
211
    const ecc::JacPoint<Fq2>& P0, const ecc::JacPoint<Fq2>& P1) noexcept
212
30.3k
{
213
30.3k
    const auto& x0 = P0.x;
214
30.3k
    const auto& y0 = P0.y;
215
30.3k
    const auto& z0 = P0.z;
216
217
30.3k
    const auto& x1 = P1.x;
218
30.3k
    const auto& y1 = P1.y;
219
30.3k
    const auto& z1 = P1.z;
220
221
30.3k
    const auto z0_squared = z0 * z0;
222
30.3k
    const auto z0_cubed = z0 * z0_squared;
223
224
30.3k
    const auto z1_squared = z1 * z1;
225
30.3k
    const auto z1_cubed = z1 * z1_squared;
226
227
30.3k
    const auto U1 = x0 * z1_squared;
228
30.3k
    const auto U2 = x1 * z0_squared;
229
30.3k
    const auto S1 = y0 * z1_cubed;
230
30.3k
    const auto S2 = y1 * z0_cubed;
231
30.3k
    const auto H = U2 - U1;  // x1 * z0^2 - x0 * z1^2
232
30.3k
    const auto R = S2 - S1;  // y1 * z0^3 - y0 * z1 ^3
233
234
30.3k
    const auto H_squared = H * H;
235
30.3k
    const auto H_cubed = H * H_squared;
236
30.3k
    const auto R_squared = R * R;
237
238
30.3k
    const auto V = U1 * H_squared;
239
240
30.3k
    const auto X3 = R_squared - H_cubed - (V + V);
241
30.3k
    const auto Y3 = R * (U1 * H_squared - X3) - S1 * H_cubed;
242
30.3k
    const auto Z3 = H * z0 * z1;
243
244
30.3k
    return {X3, Y3, Z3};
245
30.3k
}
246
247
/// Computes `Q + Q` in Jacobian coordinates.
248
constexpr ecc::JacPoint<Fq2> dbl(const ecc::JacPoint<Fq2>& Q) noexcept
249
95.6k
{
250
95.6k
    const auto& x = Q.x;
251
95.6k
    const auto& y = Q.y;
252
95.6k
    const auto& z = Q.z;
253
254
95.6k
    const auto y_squared = y * y;
255
95.6k
    const auto x_squared = x * x;
256
95.6k
    const auto z_squared = z * z;
257
95.6k
    const auto y_4 = y_squared * y_squared;
258
95.6k
    const auto _4y_4 = y_4 + y_4 + y_4 + y_4;
259
260
95.6k
    const auto R = y_squared + y_squared;
261
95.6k
    const auto A = (x + R);
262
95.6k
    const auto S = A * A - x_squared - _4y_4;  // 2xR = (x+R)^2 - x^2 - R^2
263
95.6k
    const auto M = x_squared + x_squared + x_squared;
264
265
95.6k
    const auto N = y + z;
266
267
95.6k
    const auto Xp = M * M - (S + S);
268
95.6k
    const auto Yp = M * (S - Xp) - (_4y_4 + _4y_4);
269
95.6k
    const auto Zp = N * N - y_squared - z_squared;  // 2yz = (y+z)^2 - y^2 - z^2
270
271
95.6k
    return {Xp, Yp, Zp};
272
95.6k
}
273
274
/// Computes `N` doubles of the point `a` in Jacobian coordinates.
275
template <int N>
276
constexpr ecc::JacPoint<Fq2> n_dbl(const ecc::JacPoint<Fq2>& a) noexcept
277
12.1k
{
278
12.1k
    auto r = dbl(a);
279
86.5k
    for (int i = 0; i < N - 1; 
++i74.3k
)
  Branch (279:21): [True: 30.3k, False: 6.07k]
+  Branch (279:21): [True: 9.10k, False: 1.51k]
+  Branch (279:21): [True: 21.2k, False: 3.03k]
+  Branch (279:21): [True: 13.6k, False: 1.51k]
+
280
74.3k
        r = dbl(r);
281
282
12.1k
    return r;
283
12.1k
}
evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> evmmax::bn254::n_dbl<6>(evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> const&)
Line
Count
Source
277
6.07k
{
278
6.07k
    auto r = dbl(a);
279
36.4k
    for (int i = 0; i < N - 1; 
++i30.3k
)
  Branch (279:21): [True: 30.3k, False: 6.07k]
+
280
30.3k
        r = dbl(r);
281
282
6.07k
    return r;
283
6.07k
}
evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> evmmax::bn254::n_dbl<7>(evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> const&)
Line
Count
Source
277
1.51k
{
278
1.51k
    auto r = dbl(a);
279
10.6k
    for (int i = 0; i < N - 1; 
++i9.10k
)
  Branch (279:21): [True: 9.10k, False: 1.51k]
+
280
9.10k
        r = dbl(r);
281
282
1.51k
    return r;
283
1.51k
}
evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> evmmax::bn254::n_dbl<8>(evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> const&)
Line
Count
Source
277
3.03k
{
278
3.03k
    auto r = dbl(a);
279
24.2k
    for (int i = 0; i < N - 1; 
++i21.2k
)
  Branch (279:21): [True: 21.2k, False: 3.03k]
+
280
21.2k
        r = dbl(r);
281
282
3.03k
    return r;
283
3.03k
}
evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> evmmax::bn254::n_dbl<10>(evmmax::ecc::JacPoint<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>> const&)
Line
Count
Source
277
1.51k
{
278
1.51k
    auto r = dbl(a);
279
15.1k
    for (int i = 0; i < N - 1; 
++i13.6k
)
  Branch (279:21): [True: 13.6k, False: 1.51k]
+
280
13.6k
        r = dbl(r);
281
282
1.51k
    return r;
283
1.51k
}
284
285
/// Addchain generated algorithm which multiplies point `a` in Jacobian coordinated
286
/// by X (curve seed).
287
constexpr ecc::JacPoint<Fq2> mul_by_X(const ecc::JacPoint<Fq2>& a) noexcept
288
1.51k
{
289
1.51k
    auto t0 = dbl(a);
290
1.51k
    auto t2 = dbl(t0);
291
1.51k
    auto c = dbl(t2);
292
1.51k
    auto t4 = dbl(c);
293
1.51k
    auto t6 = add(a, t4);
294
1.51k
    t4 = add(t6, t0);
295
1.51k
    auto t8 = add(a, t4);
296
1.51k
    auto t10 = add(c, t6);
297
1.51k
    auto t12 = dbl(t6);
298
1.51k
    t8 = add(t8, t4);
299
1.51k
    t4 = add(t8, t0);
300
1.51k
    t12 = n_dbl<6>(t12);
301
1.51k
    t2 = add(t12, t2);
302
1.51k
    t2 = add(t2, t10);
303
1.51k
    t2 = n_dbl<7>(t2);
304
1.51k
    t10 = add(t2, t10);
305
1.51k
    t10 = n_dbl<8>(t10);
306
1.51k
    t10 = add(t10, t4);
307
1.51k
    t0 = add(t10, t0);
308
1.51k
    t0 = n_dbl<6>(t0);
309
1.51k
    t6 = add(t0, t6);
310
1.51k
    t6 = n_dbl<8>(t6);
311
1.51k
    t6 = add(t6, t4);
312
1.51k
    t6 = n_dbl<6>(t6);
313
1.51k
    t6 = add(t6, t4);
314
1.51k
    t6 = n_dbl<10>(t6);
315
1.51k
    t8 = add(t6, t8);
316
1.51k
    t8 = n_dbl<6>(t8);
317
1.51k
    t4 = add(t4, t8);
318
1.51k
    c = add(t4, c);
319
320
1.51k
    return c;
321
1.51k
}
322
323
/// Checks that point `p_aff` is in proper subgroup of points from twisted curve over Fq2 field.
324
/// For more details see https://eprint.iacr.org/2022/348.pdf Example 1 from 3.1.2 Examples
325
constexpr bool g2_subgroup_check(const ecc::Point<Fq2>& p_aff)
326
1.51k
{
327
1.51k
    const auto p = ecc::JacPoint<Fq2>::from(p_aff);
328
329
1.51k
    const auto px = mul_by_X(p);
330
1.51k
    const auto px1 = add(px, p);
331
1.51k
    const auto _2px = dbl(px);
332
333
1.51k
    const auto e_px = endomorphism<1>(px);
334
1.51k
    const auto ee_px = endomorphism<1>(e_px);
335
1.51k
    const auto eee_2px = endomorphism<1>(endomorphism<2>(_2px));
336
337
1.51k
    const auto l = add(add(px1, e_px), ee_px);
338
339
1.51k
    return l == eee_2px;
340
1.51k
}
341
342
/// Computes point Q doubling for twisted curve + line tangent (in untwisted Q) to
343
/// the curve (not twisted curve) evaluated at point P
344
/// Returns live evaluation coefficients (-t, tw, tvw)
345
/// For more details see https://notes.ethereum.org/@ipsilon/Hkn2a2qk0
346
constexpr ecc::JacPoint<Fq2> lin_func_and_dbl(
347
    const ecc::JacPoint<Fq2>& Q, std::array<Fq2, 3>& t) noexcept
348
64.1k
{
349
64.1k
    const auto& x = Q.x;
350
64.1k
    const auto& y = Q.y;
351
64.1k
    const auto& z = Q.z;
352
353
64.1k
    const auto y_squared = y * y;
354
64.1k
    const auto x_squared = x * x;
355
64.1k
    const auto z_squared = z * z;
356
64.1k
    const auto y_4 = y_squared * y_squared;
357
64.1k
    const auto _4y_4 = y_4 + y_4 + y_4 + y_4;
358
359
64.1k
    const auto R = y_squared + y_squared;
360
64.1k
    const auto A = (x + R);
361
64.1k
    const auto S = A * A - x_squared - _4y_4;  // 2xR = (x+R)^2 - x^2 - R^2
362
64.1k
    const auto M = x_squared + x_squared + x_squared;
363
364
64.1k
    const auto N = y + z;
365
366
64.1k
    const auto Xp = M * M - (S + S);
367
64.1k
    const auto Yp = M * (S - Xp) - (_4y_4 + _4y_4);
368
64.1k
    const auto Zp = N * N - y_squared - z_squared;  // 2yz = (y+z)^2 - y^2 - z^2
369
370
64.1k
    t[0] = Zp * z_squared;
371
64.1k
    t[1] = M * z_squared;
372
64.1k
    t[2] = R - M * x;
373
374
64.1k
    return ecc::JacPoint<Fq2>{Xp, Yp, Zp};
375
64.1k
}
376
377
/// Computes points P0 and P1 addition for twisted curve + line defined by untwisted P1 and P2
378
/// points on the curve (not twisted curve) evaluated at point P. Formula is simplified for P1.z
379
/// == 1. For more details see https://notes.ethereum.org/@ipsilon/Hkn2a2qk0
380
[[nodiscard]] constexpr ecc::JacPoint<Fq2> lin_func_and_add(
381
    const ecc::JacPoint<Fq2>& P0, const ecc::Point<Fq2>& P1, std::array<Fq2, 3>& t) noexcept
382
22.0k
{
383
22.0k
    const auto& x0 = P0.x;
384
22.0k
    const auto& y0 = P0.y;
385
22.0k
    const auto& z0 = P0.z;
386
387
22.0k
    const auto& x1 = P1.x;
388
22.0k
    const auto& y1 = P1.y;
389
390
22.0k
    const auto z0_squared = z0 * z0;
391
22.0k
    const auto z0_cubed = z0 * z0_squared;
392
393
22.0k
    const auto U2 = x1 * z0_squared;
394
22.0k
    const auto S2 = y1 * z0_cubed;
395
22.0k
    const auto H = U2 - x0;  // x1 * z0^2 - x0 * z1^2
396
22.0k
    const auto R = S2 - y0;  // y1 * z0^3 - y0 * z1 ^3
397
398
22.0k
    const auto H_squared = H * H;
399
22.0k
    const auto H_cubed = H * H_squared;
400
22.0k
    const auto R_squared = R * R;
401
402
22.0k
    const auto V = x0 * H_squared;
403
404
22.0k
    const auto X3 = R_squared - H_cubed - (V + V);
405
22.0k
    const auto Y3 = R * (x0 * H_squared - X3) - y0 * H_cubed;
406
22.0k
    const auto Z3 = H * z0;
407
408
22.0k
    t[0] = (z0 * z0_squared * x0 - U2 * z0_cubed);
409
22.0k
    t[1] = (S2 * z0_squared - y0 * z0_squared);
410
22.0k
    t[2] = y0 * U2 - x0 * S2;
411
412
22.0k
    return ecc::JacPoint<Fq2>{X3, Y3, Z3};
413
22.0k
}
414
415
/// Computes points P0 and P1 addition for twisted curve + line defined by untwisted P1 and P2
416
/// points on the curve (not twisted curve) evaluated at point P. Formula is simplified for P1.z
417
/// == 1. For more details see https://notes.ethereum.org/@ipsilon/Hkn2a2qk0
418
constexpr void lin_func(
419
    const ecc::JacPoint<Fq2>& P0, const ecc::Point<Fq2>& P1, std::array<Fq2, 3>& t) noexcept
420
1.00k
{
421
1.00k
    const auto& x0 = P0.x;
422
1.00k
    const auto& y0 = P0.y;
423
1.00k
    const auto& z0 = P0.z;
424
425
1.00k
    const auto& x1 = P1.x;
426
1.00k
    const auto& y1 = P1.y;
427
428
1.00k
    const auto z0_squared = z0 * z0;
429
1.00k
    const auto z0_cubed = z0 * z0_squared;
430
431
1.00k
    const auto U2 = x1 * z0_squared;
432
1.00k
    const auto S2 = y1 * z0_cubed;
433
434
1.00k
    t[0] = (z0 * z0_squared * x0 - U2 * z0_cubed);
435
1.00k
    t[1] = (S2 * z0_squared - y0 * z0_squared);
436
1.00k
    t[2] = y0 * U2 - x0 * S2;
437
1.00k
}
438
439
/// Computes f^2 for f in Fq12. For more ref https://eprint.iacr.org/2010/354.pdf Algorithm 22
440
[[nodiscard]] constexpr Fq12 square(const Fq12& f) noexcept
441
64.1k
{
442
64.1k
    const Fq2& ksi = Fq6Config::ksi;
443
444
64.1k
    const auto& a0 = f.coeffs[0];
445
64.1k
    const auto& a1 = f.coeffs[1];
446
64.1k
    auto c0 = a0 - a1;
447
64.1k
    auto c3 = a0 - Fq6({ksi * a1.coeffs[2], a1.coeffs[0], a1.coeffs[1]});
448
64.1k
    auto c2 = a0 * a1;
449
64.1k
    c0 = c0 * c3 + c2;
450
64.1k
    const auto c1 = c2 + c2;
451
64.1k
    c2 = Fq6({ksi * c2.coeffs[2], c2.coeffs[0], c2.coeffs[1]});
452
64.1k
    c0 = c0 + c2;
453
454
64.1k
    return Fq12({c0, c1});
455
64.1k
}
456
457
/// Computes `a^2` for `a` from `Fq^4 = Fq^2[V](V^2 - ksi)` where `V` is from Fq^2 extended field.
458
/// For more reference see https://eprint.iacr.org/2010/354.pdf Algorithm 9
459
constexpr std::pair<Fq2, Fq2> fq4_square(const std::pair<Fq2, Fq2>& a)
460
294k
{
461
294k
    const auto& a0 = a.first;
462
294k
    const auto& a1 = a.second;
463
464
294k
    const auto t0 = a0 * a0;
465
294k
    const auto t1 = a1 * a1;
466
467
294k
    const auto c0 = t1 * Fq6Config::ksi + t0;
468
294k
    auto c1 = a0 + a1;
469
294k
    c1 = c1 * c1 - t0 - t1;
470
471
294k
    return {c0, c1};
472
294k
}
473
474
/// Computes `c^2` for `x` from Fq^12 where `x^(FieldPrime^6 - 1) == 1`.
475
/// This is Fq^12 subgroup called cyclotomic polynomials or group of `r` roots of unity.
476
constexpr Fq12 cyclotomic_square(const Fq12& c)
477
98.0k
{
478
98.0k
    const auto& g = c.coeffs[0];
479
98.0k
    const auto& h = c.coeffs[1];
480
481
98.0k
    const auto& g0 = g.coeffs[0];
482
98.0k
    const auto& g1 = g.coeffs[1];
483
98.0k
    const auto& g2 = g.coeffs[2];
484
485
98.0k
    const auto& h0 = h.coeffs[0];
486
98.0k
    const auto& h1 = h.coeffs[1];
487
98.0k
    const auto& h2 = h.coeffs[2];
488
489
98.0k
    const auto [t00, t11] = fq4_square({g0, h1});
490
98.0k
    const auto [t01, t12] = fq4_square({h0, g2});  // Typo in paper t01 <-> t12
491
98.0k
    const auto [t02, aux] = fq4_square({g1, h2});
492
493
98.0k
    const auto t10 = aux * Fq6Config::ksi;
494
495
98.0k
    const auto c00 = (t00 + t00 + t00) - (g0 + g0);
496
98.0k
    const auto c01 = (t01 + t01 + t01) - (g1 + g1);
497
98.0k
    const auto c02 = (t02 + t02 + t02) - (g2 + g2);
498
499
98.0k
    const auto c10 = h0 + h0 + t10 + t10 + t10;
500
98.0k
    const auto c11 = h1 + h1 + t11 + t11 + t11;
501
98.0k
    const auto c12 = h2 + h2 + t12 + t12 + t12;
502
503
98.0k
    return Fq12({Fq6({c00, c01, c02}), Fq6({c10, c11, c12})});
504
98.0k
}
505
506
/// Computes `cyclotomic_square` N times.
507
template <int N>
508
constexpr Fq12 n_cyclotomic_square(const Fq12& c)
509
12.3k
{
510
12.3k
    auto r = c;
511
100k
    for (int i = 0; i < N; 
++i88.2k
)
  Branch (511:21): [True: 37.1k, False: 6.19k]
+  Branch (511:21): [True: 10.8k, False: 1.54k]
+  Branch (511:21): [True: 24.7k, False: 3.09k]
+  Branch (511:21): [True: 15.4k, False: 1.54k]
+
512
88.2k
        r = cyclotomic_square(r);
513
514
12.3k
    return r;
515
12.3k
}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> evmmax::bn254::n_cyclotomic_square<6>(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&)
Line
Count
Source
509
6.19k
{
510
6.19k
    auto r = c;
511
43.3k
    for (int i = 0; i < N; 
++i37.1k
)
  Branch (511:21): [True: 37.1k, False: 6.19k]
+
512
37.1k
        r = cyclotomic_square(r);
513
514
6.19k
    return r;
515
6.19k
}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> evmmax::bn254::n_cyclotomic_square<7>(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&)
Line
Count
Source
509
1.54k
{
510
1.54k
    auto r = c;
511
12.3k
    for (int i = 0; i < N; 
++i10.8k
)
  Branch (511:21): [True: 10.8k, False: 1.54k]
+
512
10.8k
        r = cyclotomic_square(r);
513
514
1.54k
    return r;
515
1.54k
}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> evmmax::bn254::n_cyclotomic_square<8>(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&)
Line
Count
Source
509
3.09k
{
510
3.09k
    auto r = c;
511
27.8k
    for (int i = 0; i < N; 
++i24.7k
)
  Branch (511:21): [True: 24.7k, False: 3.09k]
+
512
24.7k
        r = cyclotomic_square(r);
513
514
3.09k
    return r;
515
3.09k
}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> evmmax::bn254::n_cyclotomic_square<10>(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&)
Line
Count
Source
509
1.54k
{
510
1.54k
    auto r = c;
511
17.0k
    for (int i = 0; i < N; 
++i15.4k
)
  Branch (511:21): [True: 15.4k, False: 1.54k]
+
512
15.4k
        r = cyclotomic_square(r);
513
514
1.54k
    return r;
515
1.54k
}
516
517
/// Computes `a^X` where `X` is the curve seed parameter
518
/// and `a` is from cyclotomic subgroup of Fq^12.
519
constexpr Fq12 cyclotomic_pow_to_X(const Fq12& a)
520
1.54k
{
521
1.54k
    auto t0 = cyclotomic_square(a);
522
1.54k
    auto t2 = cyclotomic_square(t0);
523
1.54k
    auto c = cyclotomic_square(t2);
524
1.54k
    auto t4 = cyclotomic_square(c);
525
1.54k
    auto t6 = a * t4;
526
1.54k
    t4 = t6 * t0;
527
1.54k
    auto t8 = a * t4;
528
1.54k
    auto t10 = c * t6;
529
1.54k
    auto t12 = cyclotomic_square(t6);
530
1.54k
    t8 = t8 * t4;
531
1.54k
    t4 = t8 * t0;
532
1.54k
    t12 = n_cyclotomic_square<6>(t12);
533
1.54k
    t2 = t12 * t2;
534
1.54k
    t2 = t2 * t10;
535
1.54k
    t2 = n_cyclotomic_square<7>(t2);
536
1.54k
    t10 = t2 * t10;
537
1.54k
    t10 = n_cyclotomic_square<8>(t10);
538
1.54k
    t10 = t10 * t4;
539
1.54k
    t0 = t10 * t0;
540
1.54k
    t0 = n_cyclotomic_square<6>(t0);
541
1.54k
    t6 = t0 * t6;
542
1.54k
    t6 = n_cyclotomic_square<8>(t6);
543
1.54k
    t6 = t6 * t4;
544
1.54k
    t6 = n_cyclotomic_square<6>(t6);
545
1.54k
    t6 = t6 * t4;
546
1.54k
    t6 = n_cyclotomic_square<10>(t6);
547
1.54k
    t8 = t6 * t8;
548
1.54k
    t8 = n_cyclotomic_square<6>(t8);
549
1.54k
    t4 = t4 * t8;
550
1.54k
    c = t4 * c;
551
552
1.54k
    return c;
553
1.54k
}
554
555
}  // namespace evmmax::bn254
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/field_template.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/field_template.hpp.html new file mode 100644 index 0000000000..81da887aeb --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/field_template.hpp.html @@ -0,0 +1,18 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/pairing/field_template.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <array>
7
8
namespace evmmax::ecc
9
{
10
/// Implements computations over base field defined by prime number.
11
/// Wraps around ModArith struct and implements additional functions needed for pairing.
12
/// It is a template struct which can be reused for different pairing implementations.
13
template <typename ConfigT>
14
class BaseFieldElem
15
{
16
    using ValueT = typename ConfigT::ValueT;
17
18
    static constexpr ModArith<ValueT> Fp = ConfigT::MOD_ARITH;
19
20
    ValueT m_value;
21
22
public:
23
119k
    constexpr BaseFieldElem() noexcept = default;
24
25
71.3M
    explicit constexpr BaseFieldElem(const ValueT& v) noexcept : m_value(v) {}
26
27
    static constexpr BaseFieldElem from_int(const ValueT& v) noexcept
28
11.5k
    {
29
11.5k
        return BaseFieldElem(Fp.to_mont(v));
30
11.5k
    }
31
32
516
    constexpr const ValueT& value() const noexcept { return m_value; }
33
34
516
    BaseFieldElem inv() const noexcept { return inverse(*this); }
35
36
2.28k
    constexpr bool is_zero() const noexcept { return m_value == 0; }
37
38
5.35k
    static constexpr BaseFieldElem one() noexcept { return BaseFieldElem(ConfigT::ONE); }
39
40
    static constexpr BaseFieldElem zero() noexcept { return BaseFieldElem(0); }
41
42
    friend constexpr BaseFieldElem operator+(
43
        const BaseFieldElem& e1, const BaseFieldElem& e2) noexcept
44
24.2M
    {
45
24.2M
        return BaseFieldElem(Fp.add(e1.m_value, e2.m_value));
46
24.2M
    }
47
48
    friend constexpr BaseFieldElem operator-(
49
        const BaseFieldElem& e1, const BaseFieldElem& e2) noexcept
50
16.4M
    {
51
16.4M
        return BaseFieldElem(Fp.sub(e1.m_value, e2.m_value));
52
16.4M
    }
53
54
    friend constexpr BaseFieldElem operator*(
55
        const BaseFieldElem& e1, const BaseFieldElem& e2) noexcept
56
30.5M
    {
57
30.5M
        return BaseFieldElem(Fp.mul(e1.m_value, e2.m_value));
58
30.5M
    }
59
60
    friend constexpr BaseFieldElem operator-(const BaseFieldElem& e) noexcept
61
58.3k
    {
62
58.3k
        return BaseFieldElem(Fp.sub(ValueT{0}, e.m_value));
63
58.3k
    }
64
65
    friend constexpr bool operator==(
66
17.5k
        const BaseFieldElem& e1, const BaseFieldElem& e2) noexcept = default;
67
};
68
69
/// Implements extension field over the base field or other extension fields.
70
/// It is a template struct which can be reused for different pairing implementations.
71
template <typename ConfigT>
72
struct ExtFieldElem
73
{
74
    using ValueT = typename ConfigT::ValueT;
75
    using Base = typename ConfigT::BaseFieldT;
76
    static constexpr auto DEGREE = ConfigT::DEGREE;
77
    using CoeffArrT = std::array<ValueT, DEGREE>;
78
79
    // TODO: Add operator[] for nicer access.
80
    CoeffArrT coeffs = {};
81
82
58.2k
    constexpr ExtFieldElem() noexcept = default;
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config>::ExtFieldElem()
Line
Count
Source
82
2.83k
    constexpr ExtFieldElem() noexcept = default;
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config>::ExtFieldElem()
Line
Count
Source
82
8.49k
    constexpr ExtFieldElem() noexcept = default;
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>::ExtFieldElem()
Line
Count
Source
82
46.8k
    constexpr ExtFieldElem() noexcept = default;
83
84
    /// Create an element from an array of coefficients.
85
    /// TODO: This constructor may be optimized to avoid copying the array.
86
21.7M
    explicit constexpr ExtFieldElem(const CoeffArrT& cs) noexcept : coeffs{cs} {}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>::ExtFieldElem(std::array<evmmax::ecc::BaseFieldElem<evmmax::bn254::BaseFieldConfig>, 2ul> const&)
Line
Count
Source
86
20.4M
    explicit constexpr ExtFieldElem(const CoeffArrT& cs) noexcept : coeffs{cs} {}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config>::ExtFieldElem(std::array<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>, 3ul> const&)
Line
Count
Source
86
1.10M
    explicit constexpr ExtFieldElem(const CoeffArrT& cs) noexcept : coeffs{cs} {}
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config>::ExtFieldElem(std::array<evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config>, 2ul> const&)
Line
Count
Source
86
204k
    explicit constexpr ExtFieldElem(const CoeffArrT& cs) noexcept : coeffs{cs} {}
87
88
    constexpr ExtFieldElem conjugate() const noexcept
89
34.2k
    {
90
34.2k
        auto res = this->coeffs;
91
68.4k
        for (size_t i = 1; i < DEGREE; 
i += 234.2k
)
  Branch (91:28): [True: 31.1k, False: 31.1k]
+
  Branch (91:28): [True: 3.09k, False: 3.09k]
+
92
34.2k
            res[i] = -res[i];
93
34.2k
        return ExtFieldElem(res);
94
34.2k
    }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>::conjugate() const
Line
Count
Source
89
31.1k
    {
90
31.1k
        auto res = this->coeffs;
91
62.2k
        for (size_t i = 1; i < DEGREE; 
i += 231.1k
)
  Branch (91:28): [True: 31.1k, False: 31.1k]
+
92
31.1k
            res[i] = -res[i];
93
31.1k
        return ExtFieldElem(res);
94
31.1k
    }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config>::conjugate() const
Line
Count
Source
89
3.09k
    {
90
3.09k
        auto res = this->coeffs;
91
6.19k
        for (size_t i = 1; i < DEGREE; 
i += 23.09k
)
  Branch (91:28): [True: 3.09k, False: 3.09k]
+
92
3.09k
            res[i] = -res[i];
93
3.09k
        return ExtFieldElem(res);
94
3.09k
    }
95
96
    static constexpr ExtFieldElem one() noexcept
97
11.0k
    {
98
11.0k
        ExtFieldElem res;
99
11.0k
        res.coeffs[0] = ValueT::one();
100
11.0k
        return res;
101
11.0k
    }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config>::one()
Line
Count
Source
97
2.83k
    {
98
2.83k
        ExtFieldElem res;
99
2.83k
        res.coeffs[0] = ValueT::one();
100
2.83k
        return res;
101
2.83k
    }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config>::one()
Line
Count
Source
97
2.83k
    {
98
2.83k
        ExtFieldElem res;
99
2.83k
        res.coeffs[0] = ValueT::one();
100
2.83k
        return res;
101
2.83k
    }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>::one()
Line
Count
Source
97
5.35k
    {
98
5.35k
        ExtFieldElem res;
99
5.35k
        res.coeffs[0] = ValueT::one();
100
5.35k
        return res;
101
5.35k
    }
102
103
2.19k
    static constexpr ExtFieldElem zero() noexcept { return ExtFieldElem{}; }
104
105
1.54k
    constexpr ExtFieldElem inv() const noexcept { return inverse(*this); }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config>::inv() const
Line
Count
Source
105
516
    constexpr ExtFieldElem inv() const noexcept { return inverse(*this); }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config>::inv() const
Line
Count
Source
105
516
    constexpr ExtFieldElem inv() const noexcept { return inverse(*this); }
evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config>::inv() const
Line
Count
Source
105
516
    constexpr ExtFieldElem inv() const noexcept { return inverse(*this); }
106
107
    friend constexpr ExtFieldElem operator+(const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept
108
8.65M
    {
109
8.65M
        auto res = e1.coeffs;
110
26.2M
        for (size_t i = 0; i < DEGREE; 
++i17.6M
)
  Branch (110:28): [True: 16.7M, False: 8.35M]
+
  Branch (110:28): [True: 892k, False: 297k]
+
111
17.6M
            res[i] = res[i] + e2.coeffs[i];
112
8.65M
        return ExtFieldElem(res);
113
8.65M
    }
evmmax::ecc::operator+(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&)
Line
Count
Source
108
8.35M
    {
109
8.35M
        auto res = e1.coeffs;
110
25.0M
        for (size_t i = 0; i < DEGREE; 
++i16.7M
)
  Branch (110:28): [True: 16.7M, False: 8.35M]
+
111
16.7M
            res[i] = res[i] + e2.coeffs[i];
112
8.35M
        return ExtFieldElem(res);
113
8.35M
    }
evmmax::ecc::operator+(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&)
Line
Count
Source
108
297k
    {
109
297k
        auto res = e1.coeffs;
110
1.19M
        for (size_t i = 0; i < DEGREE; 
++i892k
)
  Branch (110:28): [True: 892k, False: 297k]
+
111
892k
            res[i] = res[i] + e2.coeffs[i];
112
297k
        return ExtFieldElem(res);
113
297k
    }
114
115
    friend constexpr ExtFieldElem operator-(const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept
116
4.65M
    {
117
4.65M
        auto res = e1.coeffs;
118
14.1M
        for (size_t i = 0; i < DEGREE; 
++i9.51M
)
  Branch (118:28): [True: 8.91M, False: 4.45M]
+
  Branch (118:28): [True: 596k, False: 198k]
+
119
9.51M
            res[i] = res[i] - e2.coeffs[i];
120
4.65M
        return ExtFieldElem(res);
121
4.65M
    }
evmmax::ecc::operator-(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&)
Line
Count
Source
116
4.45M
    {
117
4.45M
        auto res = e1.coeffs;
118
13.3M
        for (size_t i = 0; i < DEGREE; 
++i8.91M
)
  Branch (118:28): [True: 8.91M, False: 4.45M]
+
119
8.91M
            res[i] = res[i] - e2.coeffs[i];
120
4.45M
        return ExtFieldElem(res);
121
4.45M
    }
evmmax::ecc::operator-(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&)
Line
Count
Source
116
198k
    {
117
198k
        auto res = e1.coeffs;
118
795k
        for (size_t i = 0; i < DEGREE; 
++i596k
)
  Branch (118:28): [True: 596k, False: 198k]
+
119
596k
            res[i] = res[i] - e2.coeffs[i];
120
198k
        return ExtFieldElem(res);
121
198k
    }
122
123
    friend constexpr ExtFieldElem operator-(const ExtFieldElem& e) noexcept
124
16.4k
    {
125
16.4k
        CoeffArrT ret;
126
52.9k
        for (size_t i = 0; i < DEGREE; 
++i36.5k
)
  Branch (126:28): [True: 25.6k, False: 12.8k]
+
  Branch (126:28): [True: 10.8k, False: 3.61k]
+
127
36.5k
            ret[i] = -e.coeffs[i];
128
16.4k
        return ExtFieldElem(ret);
129
16.4k
    }
evmmax::ecc::operator-(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&)
Line
Count
Source
124
12.8k
    {
125
12.8k
        CoeffArrT ret;
126
38.5k
        for (size_t i = 0; i < DEGREE; 
++i25.6k
)
  Branch (126:28): [True: 25.6k, False: 12.8k]
+
127
25.6k
            ret[i] = -e.coeffs[i];
128
12.8k
        return ExtFieldElem(ret);
129
12.8k
    }
evmmax::ecc::operator-(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&)
Line
Count
Source
124
3.61k
    {
125
3.61k
        CoeffArrT ret;
126
14.4k
        for (size_t i = 0; i < DEGREE; 
++i10.8k
)
  Branch (126:28): [True: 10.8k, False: 3.61k]
+
127
10.8k
            ret[i] = -e.coeffs[i];
128
3.61k
        return ExtFieldElem(ret);
129
3.61k
    }
130
131
    friend constexpr ExtFieldElem operator*(const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept
132
7.81M
    {
133
7.81M
        return multiply(e1, e2);
134
7.81M
    }
evmmax::ecc::operator*(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&)
Line
Count
Source
132
7.54M
    {
133
7.54M
        return multiply(e1, e2);
134
7.54M
    }
evmmax::ecc::operator*(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&)
Line
Count
Source
132
35.0k
    {
133
35.0k
        return multiply(e1, e2);
134
35.0k
    }
evmmax::ecc::operator*(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&)
Line
Count
Source
132
235k
    {
133
235k
        return multiply(e1, e2);
134
235k
    }
135
136
    friend constexpr bool operator==(
137
10.5k
        const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept = default;
evmmax::ecc::operator==(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq2Config> const&)
Line
Count
Source
137
9.06k
        const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept = default;
evmmax::ecc::operator==(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq12Config> const&)
Line
Count
Source
137
516
        const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept = default;
evmmax::ecc::operator==(evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&, evmmax::ecc::ExtFieldElem<evmmax::bn254::Fq6Config> const&)
Line
Count
Source
137
954
        const ExtFieldElem& e1, const ExtFieldElem& e2) noexcept = default;
138
139
    friend constexpr ExtFieldElem operator*(const ExtFieldElem& e, const Base& s) noexcept
140
174k
    {
141
174k
        auto res = e;
142
174k
        for (auto& c : res.coeffs)
  Branch (142:22): [True: 348k, False: 174k]
+
143
348k
            c = c * s;
144
174k
        return res;
145
174k
    }
146
};
147
148
}  // namespace evmmax::ecc
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/ripemd160.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/ripemd160.cpp.html new file mode 100644 index 0000000000..ea346d4856 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/ripemd160.cpp.html @@ -0,0 +1,165 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/ripemd160.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "ripemd160.hpp"
6
#include <algorithm>
7
#include <array>
8
#include <bit>
9
#include <cstdint>
10
#include <type_traits>
11
#include <utility>
12
13
#if defined(_LIBCPP_VERSION) && _LIBCPP_VERSION < 180000
14
// libc++ before version 18 has incorrect std::rotl signature
15
// https://github.com/llvm/llvm-project/commit/45500fa08acdf3849de9de470cdee5f4c8ee2f32
16
#pragma clang diagnostic ignored "-Wsign-conversion"
17
#endif
18
19
namespace evmone::crypto
20
{
21
namespace
22
{
23
// TODO(C++23): Use std::byteswap.
24
template <std::integral T>
25
constexpr T byteswap(T value) noexcept
26
{
27
    static_assert(std::has_unique_object_representations_v<T>, "T may not have padding bits");
28
    auto value_representation = std::bit_cast<std::array<std::byte, sizeof(T)>>(value);
29
    std::ranges::reverse(value_representation);
30
    return std::bit_cast<T>(value_representation);
31
}
32
33
/// @file
34
/// The implementation of the RIPEMD-160 hash function
35
/// based on the "RIPEMD-160: A Strengthened Version of RIPEMD"
36
/// https://homes.esat.kuleuven.be/~bosselae/ripemd160/pdf/AB-9601/AB-9601.pdf
37
38
constexpr size_t L = 2;      ///< Number of lines.
39
constexpr size_t R = 5;      ///< Number of rounds.
40
constexpr size_t B = 16;     ///< Number of steps per round and words in a block.
41
constexpr size_t N = R * B;  ///< Number of steps.
42
43
using State = std::array<uint32_t, RIPEMD160_HASH_SIZE / sizeof(uint32_t)>;
44
45
using BinaryFunction = uint32_t (*)(uint32_t, uint32_t, uint32_t) noexcept;
46
47
// TODO: Functions from the array of function pointers are not inlined by GCC:
48
//       https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114452
49
// TODO(C++23): Mark these as [[always_inline]]
50
constexpr BinaryFunction binary_functions[R] = {
51
    // f₁(x, y, z) = x ⊕ y ⊕ z
52
184k
    [](uint32_t x, uint32_t y, uint32_t z) noexcept { return x ^ y ^ z; },
53
54
    // f₂(x, y, z) = (x ∧ y) ∨ (¬x ∧ z) ⇔ ((y ⊕ z) ∧ x) ⊕ z
55
184k
    [](uint32_t x, uint32_t y, uint32_t z) noexcept { return ((y ^ z) & x) ^ z; },
56
57
    // f₃(x, y, z) = (x ∨ ¬y) ⊕ z
58
184k
    [](uint32_t x, uint32_t y, uint32_t z) noexcept { return (x | ~y) ^ z; },
59
60
    // f₄(x, y, z) = (x ∧ z) ∨ (y ∧ ¬z) ⇔ ((x ⊕ y) ∧ z) ⊕ y
61
184k
    [](uint32_t x, uint32_t y, uint32_t z) noexcept { return ((x ^ y) & z) ^ y; },
62
63
    // f₅(x, y, z) = x ⊕ (y ∨ ¬z)
64
184k
    [](uint32_t x, uint32_t y, uint32_t z) noexcept { return x ^ (y | ~z); },
65
};
66
67
/// Added constants.
68
constexpr uint32_t constants[L][R] = {
69
    {
70
        0,
71
        0x5a827999,
72
        0x6ed9eba1,
73
        0x8f1bbcdc,
74
        0xa953fd4e,
75
    },
76
    {
77
        0x50a28be6,
78
        0x5c4dd124,
79
        0x6d703ef3,
80
        0x7a6d76e9,
81
        0,
82
    },
83
};
84
85
86
/// Selection of message word.
87
constexpr size_t word_index[L][N] = {
88
    {
89
        /*r ( 0..15) = */ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,  //
90
        /*r (16..31) = */ 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,  //
91
        /*r (32..47) = */ 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,  //
92
        /*r (48..63) = */ 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,  //
93
        /*r (64..79) = */ 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13,  //
94
    },
95
    {
96
        /*r′( 0..15) = */ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,  //
97
        /*r′(16..31) = */ 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,  //
98
        /*r′(32..47) = */ 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,  //
99
        /*r′(48..63) = */ 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,  //
100
        /*r′(64..79) = */ 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11,  //
101
    },
102
};
103
104
/// Amount for rotate left.
105
constexpr int rotate_amount[L][N] = {
106
    {
107
        /* s ( 0..15) = */ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,  //
108
        /* s (16..31) = */ 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,  //
109
        /* s (32..47) = */ 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,  //
110
        /* s (48..63) = */ 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,  //
111
        /* s (64..79) = */ 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6,  //
112
    },
113
    {
114
        /* s′( 0..15) = */ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,  //
115
        /* s′(16..31) = */ 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,  //
116
        /* s′(32..47) = */ 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,  //
117
        /* s′(48..63) = */ 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,  //
118
        /* s′(64..79) = */ 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11,  //
119
    },
120
};
121
122
/// Converts native representation to/from little-endian.
123
inline auto to_le(std::integral auto x) noexcept
124
930k
{
125
    if constexpr (std::endian::native == std::endian::big)
126
        return byteswap(x);
127
930k
    return x;
128
930k
}
ripemd160.cpp:auto evmone::crypto::(anonymous namespace)::to_le<unsigned int>(unsigned int)
Line
Count
Source
124
929k
{
125
    if constexpr (std::endian::native == std::endian::big)
126
        return byteswap(x);
127
929k
    return x;
128
929k
}
ripemd160.cpp:auto evmone::crypto::(anonymous namespace)::to_le<unsigned long>(unsigned long)
Line
Count
Source
124
1.16k
{
125
    if constexpr (std::endian::native == std::endian::big)
126
        return byteswap(x);
127
1.16k
    return x;
128
1.16k
}
129
130
template <typename T>
131
inline T load_le(const std::byte* data) noexcept
132
923k
{
133
923k
    std::array<std::byte, sizeof(T)> bytes{};
134
923k
    std::copy_n(data, sizeof(T), bytes.begin());
135
923k
    return to_le(std::bit_cast<T>(bytes));
136
923k
}
137
138
inline std::byte* store_le(std::byte* out, std::integral auto x) noexcept
139
6.99k
{
140
6.99k
    return std::ranges::copy(std::bit_cast<std::array<std::byte, sizeof(x)>>(to_le(x)), out).out;
141
6.99k
}
ripemd160.cpp:std::byte* evmone::crypto::(anonymous namespace)::store_le<unsigned long>(std::byte*, unsigned long)
Line
Count
Source
139
1.16k
{
140
1.16k
    return std::ranges::copy(std::bit_cast<std::array<std::byte, sizeof(x)>>(to_le(x)), out).out;
141
1.16k
}
ripemd160.cpp:std::byte* evmone::crypto::(anonymous namespace)::store_le<unsigned int>(std::byte*, unsigned int)
Line
Count
Source
139
5.83k
{
140
5.83k
    return std::ranges::copy(std::bit_cast<std::array<std::byte, sizeof(x)>>(to_le(x)), out).out;
141
5.83k
}
142
143
template <size_t J>
144
inline void step(State z[L], const std::byte* block) noexcept
145
461k
{
146
461k
    static constexpr auto I = J / B;  // round index
147
461k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
1.38M
    for (size_t i = 0; i < L; 
++i923k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
923k
    {
151
923k
        const auto f = fs[i];
152
923k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
923k
        const auto k = constants[i][I];
154
923k
        const auto s = rotate_amount[i][J];
155
156
923k
        const auto a = z[i][0];
157
923k
        const auto b = z[i][1];
158
923k
        const auto c = z[i][2];
159
923k
        const auto d = z[i][3];
160
923k
        const auto e = z[i][4];
161
162
923k
        z[i][0] = e;
163
923k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
923k
        z[i][2] = b;
165
923k
        z[i][3] = std::rotl(c, 10);
166
923k
        z[i][4] = d;
167
923k
    }
168
461k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<0ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<1ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<2ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<3ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<4ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<5ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<6ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<7ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<8ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<9ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<10ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<11ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<12ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<13ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<14ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<15ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<16ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<17ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<18ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<19ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<20ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<21ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<22ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<23ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<24ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<25ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<26ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<27ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<28ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<29ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<30ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<31ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<32ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<33ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<34ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<35ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<36ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<37ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<38ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<39ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<40ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<41ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<42ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<43ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<44ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<45ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<46ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<47ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<48ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<49ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<50ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<51ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<52ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<53ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<54ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<55ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<56ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<57ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<58ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<59ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<60ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<61ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<62ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<63ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<64ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<65ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<66ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<67ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<68ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<69ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<70ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<71ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<72ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<73ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<74ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<75ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<76ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<77ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<78ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
ripemd160.cpp:void evmone::crypto::(anonymous namespace)::step<79ul>(std::array<unsigned int, 5ul>*, std::byte const*)
Line
Count
Source
145
5.77k
{
146
5.77k
    static constexpr auto I = J / B;  // round index
147
5.77k
    static constexpr BinaryFunction fs[]{binary_functions[I], binary_functions[R - 1 - I]};
148
149
17.3k
    for (size_t i = 0; i < L; 
++i11.5k
)
  Branch (149:24): [True: 11.5k, False: 5.77k]
+
150
11.5k
    {
151
11.5k
        const auto f = fs[i];
152
11.5k
        const auto w = load_le<uint32_t>(&block[sizeof(uint32_t) * word_index[i][J]]);
153
11.5k
        const auto k = constants[i][I];
154
11.5k
        const auto s = rotate_amount[i][J];
155
156
11.5k
        const auto a = z[i][0];
157
11.5k
        const auto b = z[i][1];
158
11.5k
        const auto c = z[i][2];
159
11.5k
        const auto d = z[i][3];
160
11.5k
        const auto e = z[i][4];
161
162
11.5k
        z[i][0] = e;
163
11.5k
        z[i][1] = std::rotl(a + f(b, c, d) + w + k, s) + e;
164
11.5k
        z[i][2] = b;
165
11.5k
        z[i][3] = std::rotl(c, 10);
166
11.5k
        z[i][4] = d;
167
11.5k
    }
168
5.77k
}
169
170
171
// TODO(C++23): This could be a lambda, but [[always_inline]] does not work.
172
// TODO: Try arguments instead of capture.
173
template <std::size_t... J>
174
[[gnu::always_inline]] inline void steps(
175
    State z[L], const std::byte* block, std::integer_sequence<std::size_t, J...>) noexcept
176
5.77k
{
177
5.77k
    (step<J>(z, block), ...);
178
5.77k
}
179
180
void compress(State& h, const std::byte* block) noexcept
181
5.77k
{
182
5.77k
    State z[L]{h, h};
183
5.77k
    steps(z, block, std::make_index_sequence<N>{});
184
185
5.77k
    State t;
186
34.6k
    for (size_t i = 0, M = t.size(); i < M; 
++i28.8k
)
  Branch (186:38): [True: 28.8k, False: 5.77k]
+
187
28.8k
        t[i] = h[(i + 1) % M] + z[0][(i + 2) % M] + z[1][(i + 3) % M];
188
5.77k
    h = t;
189
5.77k
}
190
}  // namespace
191
192
void ripemd160(std::byte hash[RIPEMD160_HASH_SIZE], const std::byte* data, size_t size) noexcept
193
1.16k
{
194
1.16k
    static constexpr size_t BLOCK_SIZE = B * sizeof(uint32_t);
195
1.16k
    State h{0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0};
196
197
1.16k
    const auto tail_size = size % BLOCK_SIZE;
198
5.56k
    for (const auto tail_begin = &data[size - tail_size]; data != tail_begin; 
data += BLOCK_SIZE4.39k
)
  Branch (198:59): [True: 4.39k, False: 1.16k]
+
199
4.39k
        compress(h, data);
200
201
1.16k
    {
202
1.16k
        std::array<std::byte, BLOCK_SIZE> padding_block{};
203
1.16k
        const auto padded_tail_end = std::copy_n(data, tail_size, padding_block.data());
204
1.16k
        *padded_tail_end = std::byte{0x80};  // The padding bit placed just after the input bytes.
205
206
        // Store the input length in bits in the last two words of the padded block.
207
1.16k
        const auto length_in_bits = uint64_t{size} * 8;
208
1.16k
        const auto length_begin = &padding_block[BLOCK_SIZE - sizeof(length_in_bits)];
209
1.16k
        if (padded_tail_end >= length_begin)  // If not enough space, create one more block.
  Branch (209:13): [True: 208, False: 958]
+
210
208
        {
211
208
            compress(h, padding_block.data());
212
208
            padding_block = {};
213
208
        }
214
1.16k
        store_le(length_begin, length_in_bits);
215
1.16k
        compress(h, padding_block.data());
216
1.16k
    }
217
218
1.16k
    for (const auto e : h)
  Branch (218:23): [True: 5.83k, False: 1.16k]
+
219
5.83k
        hash = store_le(hash, e);
220
1.16k
}
221
}  // namespace evmone::crypto
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/secp256k1.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/secp256k1.cpp.html new file mode 100644 index 0000000000..59eca56bba --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/secp256k1.cpp.html @@ -0,0 +1,47 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/secp256k1.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#include "secp256k1.hpp"
5
#include "keccak.hpp"
6
7
namespace evmmax::secp256k1
8
{
9
namespace
10
{
11
constexpr auto B = Curve::Fp.to_mont(7);
12
13
constexpr AffinePoint G{0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798_u256,
14
    0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8_u256};
15
}  // namespace
16
17
// FIXME: Change to "uncompress_point".
18
std::optional<uint256> calculate_y(
19
    const ModArith<uint256>& m, const uint256& x, bool y_parity) noexcept
20
938
{
21
    // Calculate sqrt(x^3 + 7)
22
938
    const auto x3 = m.mul(m.mul(x, x), x);
23
938
    const auto y = field_sqrt(m, m.add(x3, B));
24
938
    if (!y.has_value())
  Branch (24:9): [True: 48, False: 890]
+
25
48
        return std::nullopt;
26
27
    // Negate if different parity requested
28
890
    const auto candidate_parity = (m.from_mont(*y) & 1) != 0;
29
890
    return (candidate_parity == y_parity) ? 
*y360
:
m.sub(0, *y)530
;
  Branch (29:12): [True: 360, False: 530]
+
30
938
}
31
32
evmc::address to_address(const AffinePoint& pt) noexcept
33
832
{
34
    // This performs Ethereum's address hashing on an uncompressed pubkey.
35
832
    uint8_t serialized[64];
36
832
    pt.to_bytes(serialized);
37
38
832
    const auto hashed = ethash::keccak256(serialized, sizeof(serialized));
39
832
    evmc::address ret{};
40
832
    std::memcpy(ret.bytes, hashed.bytes + 12, 20);
41
42
832
    return ret;
43
832
}
44
45
std::optional<AffinePoint> secp256k1_ecdsa_recover(
46
    const ethash::hash256& e, const uint256& r, const uint256& s, bool v) noexcept
47
1.26k
{
48
    // Follows
49
    // https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Public_key_recovery
50
51
    // 1. Validate r and s are within [1, n-1].
52
1.26k
    if (r == 0 || 
r >= Curve::ORDER1.23k
||
s == 01.19k
||
s >= Curve::ORDER976
)
  Branch (52:9): [True: 326, False: 938]
+  Branch (52:9): [True: 32, False: 1.23k]
+  Branch (52:19): [True: 38, False: 1.19k]
+  Branch (52:40): [True: 218, False: 976]
+  Branch (52:50): [True: 38, False: 938]
+
  MC/DC Decision Region (52:9) to (52:67)
+
+  Number of Conditions: 4
+     Condition C1 --> (52:9)
+     Condition C2 --> (52:19)
+     Condition C3 --> (52:40)
+     Condition C4 --> (52:50)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3, C4    Result
+  1 { F,  F,  F,  F  = F      }
+  2 { F,  F,  F,  T  = T      }
+  3 { F,  F,  T,  -  = T      }
+  4 { F,  T,  -,  -  = T      }
+  5 { T,  -,  -,  -  = T      }
+
+  C1-Pair: covered: (1,5)
+  C2-Pair: covered: (1,4)
+  C3-Pair: covered: (1,3)
+  C4-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
53
326
        return std::nullopt;
54
55
    // 3. Hash of the message is already calculated in e.
56
    // 4. Convert hash e to z field element by doing z = e % n.
57
    //    https://www.rfc-editor.org/rfc/rfc6979#section-2.3.2
58
    //    We can do this by n - e because n > 2^255.
59
938
    static_assert(Curve::ORDER > 1_u256 << 255);
60
938
    auto z = intx::be::load<uint256>(e.bytes);
61
938
    if (z >= Curve::ORDER)
  Branch (61:9): [True: 26, False: 912]
+
62
26
        z -= Curve::ORDER;
63
64
938
    const ModArith n{Curve::ORDER};
65
66
    // 5. Calculate u1 and u2.
67
938
    const auto r_n = n.to_mont(r);
68
938
    const auto r_inv = n.inv(r_n);
69
70
938
    const auto z_mont = n.to_mont(z);
71
938
    const auto z_neg = n.sub(0, z_mont);
72
938
    const auto u1_mont = n.mul(z_neg, r_inv);
73
938
    const auto u1 = n.from_mont(u1_mont);
74
75
938
    const auto s_mont = n.to_mont(s);
76
938
    const auto u2_mont = n.mul(s_mont, r_inv);
77
938
    const auto u2 = n.from_mont(u2_mont);
78
938
    assert(u2 != 0);  // Because s != 0 and r_inv != 0.
79
80
    // 2. Calculate y coordinate of R from r and v.
81
938
    static constexpr auto& Fp = Curve::Fp;
82
938
    const auto r_mont = Fp.to_mont(r);
83
938
    const auto y_mont = calculate_y(Fp, r_mont, v);
84
938
    if (!y_mont.has_value())
  Branch (84:9): [True: 48, False: 890]
+
85
48
        return std::nullopt;
86
87
    // 6. Calculate public key point Q.
88
890
    const auto R = AffinePoint{AffinePoint::FE::wrap(r_mont), AffinePoint::FE::wrap(*y_mont)};
89
    // u1 and u2 are less than `Curve::ORDER`, so the multiplications will not reduce.
90
890
    const auto T1 = ecc::mul(G, u1);
91
890
    const auto T2 = ecc::mul(R, u2);
92
890
    assert(T2 != 0);  // Because u2 != 0 and R != 0.
93
890
    const auto pQ = ecc::add(T1, T2);
94
95
890
    const auto Q = ecc::to_affine<Curve>(pQ);
96
97
890
    if (Q == 0)
  Branch (97:9): [True: 58, False: 832]
+
98
58
        return std::nullopt;
99
100
832
    return Q;
101
890
}
102
103
std::optional<evmc::address> ecrecover(
104
    const ethash::hash256& e, const uint256& r, const uint256& s, bool v) noexcept
105
1.26k
{
106
1.26k
    const auto point = secp256k1_ecdsa_recover(e, r, s, v);
107
1.26k
    if (!point.has_value())
  Branch (107:9): [True: 432, False: 832]
+
108
432
        return std::nullopt;
109
110
832
    return to_address(*point);
111
1.26k
}
112
113
std::optional<uint256> field_sqrt(const ModArith<uint256>& m, const uint256& x) noexcept
114
938
{
115
    // Computes modular exponentiation
116
    // x^0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff0c
117
    // Operations: 253 squares 13 multiplies
118
    // Main part generated by github.com/mmcloughlin/addchain v0.4.0.
119
    //   addchain search 0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff0c
120
    //     > secp256k1_sqrt.acc
121
    //   addchain gen -tmpl expmod.tmpl secp256k1_sqrt.acc
122
    //     > secp256k1_sqrt.cpp
123
    //
124
    // Exponentiation computation is derived from the addition chain:
125
    //
126
    // _10      = 2*1
127
    // _11      = 1 + _10
128
    // _1100    = _11 << 2
129
    // _1111    = _11 + _1100
130
    // _11110   = 2*_1111
131
    // _11111   = 1 + _11110
132
    // _1111100 = _11111 << 2
133
    // _1111111 = _11 + _1111100
134
    // x11      = _1111111 << 4 + _1111
135
    // x22      = x11 << 11 + x11
136
    // x27      = x22 << 5 + _11111
137
    // x54      = x27 << 27 + x27
138
    // x108     = x54 << 54 + x54
139
    // x216     = x108 << 108 + x108
140
    // x223     = x216 << 7 + _1111111
141
    // return     ((x223 << 23 + x22) << 6 + _11) << 2
142
143
    // Allocate Temporaries.
144
938
    uint256 z;
145
938
    uint256 t0;
146
938
    uint256 t1;
147
938
    uint256 t2;
148
938
    uint256 t3;
149
150
151
    // Step 1: z = x^0x2
152
938
    z = m.mul(x, x);
153
154
    // Step 2: z = x^0x3
155
938
    z = m.mul(x, z);
156
157
    // Step 4: t0 = x^0xc
158
938
    t0 = m.mul(z, z);
159
1.87k
    for (int i = 1; i < 2; 
++i938
)
  Branch (159:21): [True: 938, False: 938]
+
160
938
        t0 = m.mul(t0, t0);
161
162
    // Step 5: t0 = x^0xf
163
938
    t0 = m.mul(z, t0);
164
165
    // Step 6: t1 = x^0x1e
166
938
    t1 = m.mul(t0, t0);
167
168
    // Step 7: t2 = x^0x1f
169
938
    t2 = m.mul(x, t1);
170
171
    // Step 9: t1 = x^0x7c
172
938
    t1 = m.mul(t2, t2);
173
1.87k
    for (int i = 1; i < 2; 
++i938
)
  Branch (173:21): [True: 938, False: 938]
+
174
938
        t1 = m.mul(t1, t1);
175
176
    // Step 10: t1 = x^0x7f
177
938
    t1 = m.mul(z, t1);
178
179
    // Step 14: t3 = x^0x7f0
180
938
    t3 = m.mul(t1, t1);
181
3.75k
    for (int i = 1; i < 4; 
++i2.81k
)
  Branch (181:21): [True: 2.81k, False: 938]
+
182
2.81k
        t3 = m.mul(t3, t3);
183
184
    // Step 15: t0 = x^0x7ff
185
938
    t0 = m.mul(t0, t3);
186
187
    // Step 26: t3 = x^0x3ff800
188
938
    t3 = m.mul(t0, t0);
189
10.3k
    for (int i = 1; i < 11; 
++i9.38k
)
  Branch (189:21): [True: 9.38k, False: 938]
+
190
9.38k
        t3 = m.mul(t3, t3);
191
192
    // Step 27: t0 = x^0x3fffff
193
938
    t0 = m.mul(t0, t3);
194
195
    // Step 32: t3 = x^0x7ffffe0
196
938
    t3 = m.mul(t0, t0);
197
4.69k
    for (int i = 1; i < 5; 
++i3.75k
)
  Branch (197:21): [True: 3.75k, False: 938]
+
198
3.75k
        t3 = m.mul(t3, t3);
199
200
    // Step 33: t2 = x^0x7ffffff
201
938
    t2 = m.mul(t2, t3);
202
203
    // Step 60: t3 = x^0x3ffffff8000000
204
938
    t3 = m.mul(t2, t2);
205
25.3k
    for (int i = 1; i < 27; 
++i24.3k
)
  Branch (205:21): [True: 24.3k, False: 938]
+
206
24.3k
        t3 = m.mul(t3, t3);
207
208
    // Step 61: t2 = x^0x3fffffffffffff
209
938
    t2 = m.mul(t2, t3);
210
211
    // Step 115: t3 = x^0xfffffffffffffc0000000000000
212
938
    t3 = m.mul(t2, t2);
213
50.6k
    for (int i = 1; i < 54; 
++i49.7k
)
  Branch (213:21): [True: 49.7k, False: 938]
+
214
49.7k
        t3 = m.mul(t3, t3);
215
216
    // Step 116: t2 = x^0xfffffffffffffffffffffffffff
217
938
    t2 = m.mul(t2, t3);
218
219
    // Step 224: t3 = x^0xfffffffffffffffffffffffffff000000000000000000000000000
220
938
    t3 = m.mul(t2, t2);
221
101k
    for (int i = 1; i < 108; 
++i100k
)
  Branch (221:21): [True: 100k, False: 938]
+
222
100k
        t3 = m.mul(t3, t3);
223
224
    // Step 225: t2 = x^0xffffffffffffffffffffffffffffffffffffffffffffffffffffff
225
938
    t2 = m.mul(t2, t3);
226
227
    // Step 232: t2 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffffffff80
228
7.50k
    for (int i = 0; i < 7; 
++i6.56k
)
  Branch (228:21): [True: 6.56k, False: 938]
+
229
6.56k
        t2 = m.mul(t2, t2);
230
231
    // Step 233: t1 = x^0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffff
232
938
    t1 = m.mul(t1, t2);
233
234
    // Step 256: t1 = x^0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffff800000
235
22.5k
    for (int i = 0; i < 23; 
++i21.5k
)
  Branch (235:21): [True: 21.5k, False: 938]
+
236
21.5k
        t1 = m.mul(t1, t1);
237
238
    // Step 257: t0 = x^0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff
239
938
    t0 = m.mul(t0, t1);
240
241
    // Step 263: t0 = x^0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc0
242
6.56k
    for (int i = 0; i < 6; 
++i5.62k
)
  Branch (242:21): [True: 5.62k, False: 938]
+
243
5.62k
        t0 = m.mul(t0, t0);
244
245
    // Step 264: z = x^0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc3
246
938
    z = m.mul(z, t0);
247
248
    // Step 266: z = x^0x3fffffffffffffffffffffffffffffffffffffffffffffffffffffffbfffff0c
249
2.81k
    for (int i = 0; i < 2; 
++i1.87k
)
  Branch (249:21): [True: 1.87k, False: 938]
+
250
1.87k
        z = m.mul(z, z);
251
252
938
    if (m.mul(z, z) != x)
  Branch (252:9): [True: 48, False: 890]
+
253
48
        return std::nullopt;  // Computed value is not the square root.
254
255
890
    return z;
256
938
}
257
}  // namespace evmmax::secp256k1
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/secp256r1.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/secp256r1.cpp.html new file mode 100644 index 0000000000..670f6e5023 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/secp256r1.cpp.html @@ -0,0 +1,49 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/secp256r1.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2025 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#include "secp256r1.hpp"
5
6
namespace evmmax::secp256r1
7
{
8
namespace
9
{
10
bool is_on_curve(const AffinePoint& p) noexcept
11
608
{
12
608
    static constexpr AffinePoint::FE A{Curve::A};
13
608
    static constexpr AffinePoint::FE B{Curve::B};
14
608
    return p.y * p.y == p.x * p.x * p.x + A * p.x + B;
15
608
}
16
}  // namespace
17
18
bool verify(const ethash::hash256& h, const uint256& r, const uint256& s, const uint256& qx,
19
    const uint256& qy) noexcept
20
782
{
21
    // The implementation follows "Elliptic Curve Digital Signature Algorithm"
22
    // https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Signature_verification_algorithm
23
    // but EIP-7951 spec is also a good source:
24
    // https://eips.ethereum.org/EIPS/eip-7951#signature-verification-algorithm
25
26
    // 1. Validate r and s are within [1, n-1].
27
782
    if (r == 0 || 
r >= Curve::ORDER750
||
s == 0668
||
s >= Curve::ORDER658
)
  Branch (27:9): [True: 150, False: 632]
+  Branch (27:9): [True: 32, False: 750]
+  Branch (27:19): [True: 82, False: 668]
+  Branch (27:40): [True: 10, False: 658]
+  Branch (27:50): [True: 26, False: 632]
+
  MC/DC Decision Region (27:9) to (27:67)
+
+  Number of Conditions: 4
+     Condition C1 --> (27:9)
+     Condition C2 --> (27:19)
+     Condition C3 --> (27:40)
+     Condition C4 --> (27:50)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3, C4    Result
+  1 { F,  F,  F,  F  = F      }
+  2 { F,  F,  F,  T  = T      }
+  3 { F,  F,  T,  -  = T      }
+  4 { F,  T,  -,  -  = T      }
+  5 { T,  -,  -,  -  = T      }
+
+  C1-Pair: covered: (1,5)
+  C2-Pair: covered: (1,4)
+  C3-Pair: covered: (1,3)
+  C4-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
28
150
        return false;
29
30
    // Check that Q is not equal to the identity element O, and its coordinates are otherwise valid.
31
632
    if (qx >= Curve::FIELD_PRIME || 
qy >= Curve::FIELD_PRIME620
)
  Branch (31:9): [True: 12, False: 620]
+  Branch (31:37): [True: 6, False: 614]
+
  MC/DC Decision Region (31:9) to (31:61)
+
+  Number of Conditions: 2
+     Condition C1 --> (31:9)
+     Condition C2 --> (31:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
32
18
        return false;
33
614
    const AffinePoint Q{AffinePoint::FE{qx}, AffinePoint::FE{qy}};
34
614
    if (Q == 0)
  Branch (34:9): [True: 6, False: 608]
+
35
6
        return false;
36
37
    // Check that Q lies on the curve.
38
608
    if (!is_on_curve(Q))
  Branch (38:9): [True: 52, False: 556]
+
39
52
        return false;
40
41
556
    const ModArith n{Curve::ORDER};
42
43
    // 3. Let z be the Lₙ leftmost bits of e = HASH(m).
44
556
    static_assert(Curve::ORDER > 1_u256 << 255);
45
556
    const auto z = intx::be::load<uint256>(h.bytes);
46
47
    // 4. Calculate u₁ = zs⁻¹ mod n and u₂ = rs⁻¹ mod n.
48
556
    const auto s_inv = n.inv(n.to_mont(s));
49
556
    const auto u1 = n.from_mont(n.mul(n.to_mont(z), s_inv));
50
556
    const auto u2 = n.from_mont(n.mul(n.to_mont(r), s_inv));
51
52
    // 5. Calculate the curve point R = (x₁, y₁) = u₁×G + u₂×Q.
53
    // u1 and u2 are less than `Curve::ORDER`, so the multiplications will not reduce.
54
556
    const auto T1 = ecc::mul(G, u1);
55
556
    const auto T2 = ecc::mul(Q, u2);
56
556
    assert(T2 != 0);  // Because u2 != 0 and R != 0.
57
556
    const auto jR = ecc::add(T1, T2);
58
556
    const auto R = ecc::to_affine(jR);
59
60
    //    If R is at infinity, the signature is invalid.
61
    //    In this case x₁ is 0 and cannot be equal to r.
62
    // 6. The signature is valid if r ≡ x₁ (mod n).
63
556
    auto x1 = R.x.value();
64
556
    if (x1 >= Curve::ORDER)
  Branch (64:9): [True: 10, False: 546]
+
65
10
        x1 -= Curve::ORDER;
66
67
556
    return x1 == r;
68
608
}
69
}  // namespace evmmax::secp256r1
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/sha256.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/sha256.cpp.html new file mode 100644 index 0000000000..ceb1aed867 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/lib/evmone_precompiles/sha256.cpp.html @@ -0,0 +1,48 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/lib/evmone_precompiles/sha256.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The Silkworm & evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
/// @file
6
/// SHA256 implementation.
7
/// Initial version copied from the Silkworm project (https://github.com/erigontech/silkworm).
8
/// Based on several bits of code released to public domain:
9
/// https://github.com/amosnier/sha-2 (Author: Alain Mosnier)
10
/// https://github.com/noloader/SHA-Intrinsics (Author: Jeffrey Walton)
11
/// https://github.com/Mysticial/FeatureDetector (Author: Alexander Yee)
12
13
#include "sha256.hpp"
14
#include <bit>
15
#include <cstdint>
16
#include <cstring>
17
18
#if defined(__x86_64__)  // NOLINT(readability-use-concise-preprocessor-directives)
19
20
#include <cpuid.h>
21
#include <x86intrin.h>
22
23
#elif defined(__aarch64__) && defined(__APPLE__)
24
25
#include <arm_neon.h>
26
27
#if defined(__linux__)
28
#include <asm/hwcap.h>
29
#include <sys/auxv.h>
30
#elif defined(__APPLE__)
31
#include <sys/sysctl.h>
32
#endif  // defined(__linux__), defined(__APPLE__)
33
34
#endif  // defined(__x86_64__), defined(__aarch64__)
35
36
namespace evmone::crypto
37
{
38
39
231k
#define CHUNK_SIZE 64
40
132k
#define TOTAL_LEN_LEN 8
41
42
/*
43
 * Comments from pseudo-code at https://en.wikipedia.org/wiki/SHA-2 are reproduced here.
44
 * When useful for clarification, portions of the pseudo-code are reproduced here too.
45
 */
46
47
/*
48
 * Initialize array of round constants:
49
 * (first 32 bits of the fractional parts of the cube roots of the first 64 primes 2..311):
50
 */
51
static const uint32_t k[] = {0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,
52
    0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe,
53
    0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa,
54
    0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,
55
    0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb,
56
    0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624,
57
    0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,
58
    0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb,
59
    0xbef9a3f7, 0xc67178f2};
60
61
struct BufferState
62
{
63
    const std::byte* p;
64
    size_t len;
65
    size_t total_len;
66
    bool single_one_delivered = false;
67
    bool total_len_delivered = false;
68
69
    constexpr BufferState(const std::byte* input, size_t size)
70
66.3k
      : p{input}, len{size}, total_len{size}
71
66.3k
    {}
72
};
73
74
static bool calc_chunk(uint8_t chunk[CHUNK_SIZE], struct BufferState* state)
75
157k
{
76
157k
    if (state->total_len_delivered)
  Branch (76:9): [True: 66.3k, False: 90.9k]
+
77
66.3k
    {
78
66.3k
        return false;
79
66.3k
    }
80
81
90.9k
    if (state->len >= CHUNK_SIZE)
  Branch (81:9): [True: 24.5k, False: 66.3k]
+
82
24.5k
    {
83
24.5k
        memcpy(chunk, state->p, CHUNK_SIZE);
84
24.5k
        state->p += CHUNK_SIZE;
85
24.5k
        state->len -= CHUNK_SIZE;
86
24.5k
        return true;
87
24.5k
    }
88
89
66.3k
    size_t space_in_chunk = CHUNK_SIZE - state->len;
90
66.3k
    if (state->len != 0)
  Branch (90:9): [True: 3.71k, False: 62.6k]
+
91
3.71k
    {  // avoid adding 0 to nullptr
92
3.71k
        memcpy(chunk, state->p, state->len);
93
3.71k
        chunk += state->len;
94
3.71k
        state->p += state->len;
95
3.71k
    }
96
66.3k
    state->len = 0;
97
98
    /* If we are here, space_in_chunk is one at minimum. */
99
66.3k
    if (!state->single_one_delivered)
  Branch (99:9): [True: 66.3k, False: 6]
+
100
66.3k
    {
101
66.3k
        *chunk++ = 0x80;
102
66.3k
        space_in_chunk -= 1;
103
66.3k
        state->single_one_delivered = true;
104
66.3k
    }
105
106
    /*
107
     * Now:
108
     * - either there is enough space left for the total length, and we can conclude,
109
     * - or there is too little space left, and we have to pad the rest of this chunk with zeroes.
110
     * In the latter case, we will conclude at the next invocation of this function.
111
     */
112
66.3k
    if (space_in_chunk >= TOTAL_LEN_LEN)
  Branch (112:9): [True: 66.3k, False: 6]
+
113
66.3k
    {
114
66.3k
        const size_t left = space_in_chunk - TOTAL_LEN_LEN;
115
66.3k
        size_t len = state->total_len;
116
66.3k
        int i = 0;
117
66.3k
        memset(chunk, 0x00, left);
118
66.3k
        chunk += left;
119
120
        /* Storing of len * 8 as a big endian 64-bit without overflow. */
121
66.3k
        chunk[7] = (uint8_t)(len << 3);
122
66.3k
        len >>= 5;
123
531k
        for (i = 6; i >= 0; 
i--464k
)
  Branch (123:21): [True: 464k, False: 66.3k]
+
124
464k
        {
125
464k
            chunk[i] = (uint8_t)len;
126
464k
            len >>= 8;
127
464k
        }
128
66.3k
        state->total_len_delivered = true;
129
66.3k
    }
130
6
    else
131
6
    {
132
6
        memset(chunk, 0x00, space_in_chunk);
133
6
    }
134
135
66.3k
    return true;
136
90.9k
}
137
138
[[gnu::always_inline, msvc::forceinline]] static void sha_256_implementation(
139
    uint32_t h[8], const std::byte* input, size_t len)
140
0
{
141
    /*
142
     * Note 1: All integers (expect indexes) are 32-bit unsigned integers and addition is calculated
143
     * modulo 2^32.
144
     *
145
     * Note 2: For each round, there is one round constant k[i] and one entry in the message
146
     * schedule array w[i], 0 = i = 63
147
     *
148
     * Note 3: The compression function uses 8 working variables, a through h
149
     *
150
     * Note 4: Big-endian convention is used when expressing the constants in this pseudocode,
151
     *     and when parsing message block data from bytes to words, for example,
152
     *     the first word of the input message "abc" after padding is 0x61626380
153
     */
154
155
0
    BufferState state{input, len};
156
157
    /* 512-bit chunks is what we will operate on. */
158
0
    uint8_t chunk[CHUNK_SIZE];
159
160
0
    while (calc_chunk(chunk, &state))
  Branch (160:12): [True: 0, False: 0]
+
161
0
    {
162
0
        unsigned i = 0;
163
0
        unsigned j = 0;
164
165
0
        uint32_t ah[8];
166
        /* Initialize working variables to current hash value: */
167
0
        for (i = 0; i < 8; i++)
  Branch (167:21): [True: 0, False: 0]
+
168
0
        {
169
0
            ah[i] = h[i];
170
0
        }
171
172
0
        const uint8_t* p = chunk;
173
174
        /*
175
         * The w-array is really w[64], but since we only need 16 of them at a time, we save stack
176
         * by calculating 16 at a time.
177
         *
178
         * This optimization was not there initially and the rest of the comments about w[64] are
179
         * kept in their initial state.
180
         */
181
182
        /*
183
         * create a 64-entry message schedule array w[0..63] of 32-bit words (The initial values in
184
         * w[0..63] don't matter, so many implementations zero them here) copy chunk into first 16
185
         * words w[0..15] of the message schedule array
186
         */
187
0
        uint32_t w[16];
188
189
        /* Compression function main loop: */
190
0
        for (i = 0; i < 4; i++)
  Branch (190:21): [True: 0, False: 0]
+
191
0
        {
192
0
            for (j = 0; j < 16; j++)
  Branch (192:25): [True: 0, False: 0]
+
193
0
            {
194
0
                if (i == 0)
  Branch (194:21): [True: 0, False: 0]
+
195
0
                {
196
0
                    w[j] = (uint32_t)p[0] << 24 | (uint32_t)p[1] << 16 | (uint32_t)p[2] << 8 |
197
0
                           (uint32_t)p[3];
198
0
                    p += 4;
199
0
                }
200
0
                else
201
0
                {
202
                    /* Extend the first 16 words into the remaining 48 words w[16..63] of the
203
                     * message schedule array: */
204
0
                    const uint32_t s0 = std::rotr(w[(j + 1) & 0xf], 7) ^
205
0
                                        std::rotr(w[(j + 1) & 0xf], 18) ^ (w[(j + 1) & 0xf] >> 3);
206
0
                    const uint32_t s1 = std::rotr(w[(j + 14) & 0xf], 17) ^
207
0
                                        std::rotr(w[(j + 14) & 0xf], 19) ^
208
0
                                        (w[(j + 14) & 0xf] >> 10);
209
0
                    w[j] = w[j] + s0 + w[(j + 9) & 0xf] + s1;
210
0
                }
211
0
                const uint32_t s1 =
212
0
                    std::rotr(ah[4], 6) ^ std::rotr(ah[4], 11) ^ std::rotr(ah[4], 25);
213
0
                const uint32_t ch = (ah[4] & ah[5]) ^ (~ah[4] & ah[6]);
214
0
                const uint32_t temp1 = ah[7] + s1 + ch + k[i << 4 | j] + w[j];
215
0
                const uint32_t s0 =
216
0
                    std::rotr(ah[0], 2) ^ std::rotr(ah[0], 13) ^ std::rotr(ah[0], 22);
217
0
                const uint32_t maj = (ah[0] & ah[1]) ^ (ah[0] & ah[2]) ^ (ah[1] & ah[2]);
218
0
                const uint32_t temp2 = s0 + maj;
219
220
0
                ah[7] = ah[6];
221
0
                ah[6] = ah[5];
222
0
                ah[5] = ah[4];
223
0
                ah[4] = ah[3] + temp1;
224
0
                ah[3] = ah[2];
225
0
                ah[2] = ah[1];
226
0
                ah[1] = ah[0];
227
0
                ah[0] = temp1 + temp2;
228
0
            }
229
0
        }
230
231
        /* Add the compressed chunk to the current hash value: */
232
0
        for (i = 0; i < 8; i++)
  Branch (232:21): [True: 0, False: 0]
+
233
0
        {
234
0
            h[i] += ah[i];
235
0
        }
236
0
    }
237
0
}
238
239
static void sha_256_generic(uint32_t h[8], const std::byte* input, size_t len)
240
0
{
241
0
    sha_256_implementation(h, input, len);
242
0
}
243
244
static void (*sha_256_best)(uint32_t h[8], const std::byte* input, size_t len) = sha_256_generic;
245
246
#if defined(__x86_64__)  // NOLINT(readability-use-concise-preprocessor-directives)
247
248
__attribute__((target("bmi,bmi2"))) static void sha_256_x86_bmi(
249
    uint32_t h[8], const std::byte* input, size_t len)
250
0
{
251
0
    sha_256_implementation(h, input, len);
252
0
}
253
254
[[gnu::always_inline]] static __m128i set(uint64_t a, uint64_t b) noexcept
255
1.52M
{
256
    // NOLINTNEXTLINE(*-runtime-int)
257
1.52M
    return _mm_set_epi64x(static_cast<long long>(a), static_cast<long long>(b));
258
1.52M
}
259
260
// The following function was adapted from
261
// https://github.com/noloader/SHA-Intrinsics/blob/master/sha256-x86.c
262
/*   Intel SHA extensions using C intrinsics               */
263
/*   Written and place in public domain by Jeffrey Walton  */
264
/*   Based on code from Intel, and by Sean Gulley for      */
265
/*   the miTLS project.                                    */
266
__attribute__((target("sha,sse4.1"))) static void sha_256_x86_sha(
267
    uint32_t h[8], const std::byte* input, size_t len)
268
66.3k
{
269
    // NOLINTBEGIN(readability-isolate-declaration)
270
66.3k
    __m128i STATE0, STATE1;
271
66.3k
    __m128i MSG, TMP;
272
66.3k
    __m128i MSG0, MSG1, MSG2, MSG3;
273
66.3k
    __m128i ABEF_SAVE, CDGH_SAVE;
274
    // NOLINTEND(readability-isolate-declaration)
275
276
66.3k
    const __m128i MASK = set(0x0c0d0e0f08090a0b, 0x0405060700010203);
277
278
    // NOLINTBEGIN(cppcoreguidelines-pro-type-cstyle-cast)
279
    // NOLINTBEGIN(portability-simd-intrinsics)
280
    /* Load initial values */
281
66.3k
    TMP = _mm_loadu_si128((const __m128i*)&h[0]);
282
66.3k
    STATE1 = _mm_loadu_si128((const __m128i*)&h[4]);
283
284
66.3k
    TMP = _mm_shuffle_epi32(TMP, 0xB1);          /* CDAB */
285
66.3k
    STATE1 = _mm_shuffle_epi32(STATE1, 0x1B);    /* EFGH */
286
66.3k
    STATE0 = _mm_alignr_epi8(TMP, STATE1, 8);    /* ABEF */
287
66.3k
    STATE1 = _mm_blend_epi16(STATE1, TMP, 0xF0); /* CDGH */
288
289
66.3k
    BufferState state{input, len};
290
291
    /* 512-bit chunks is what we will operate on. */
292
66.3k
    uint8_t chunk[CHUNK_SIZE];
293
294
157k
    while (calc_chunk(chunk, &state))
  Branch (294:12): [True: 90.9k, False: 66.3k]
+
295
90.9k
    {
296
        /* Save current state */
297
90.9k
        ABEF_SAVE = STATE0;
298
90.9k
        CDGH_SAVE = STATE1;
299
300
        /* Rounds 0-3 */
301
90.9k
        MSG = _mm_loadu_si128((const __m128i*)(chunk + 0));
302
90.9k
        MSG0 = _mm_shuffle_epi8(MSG, MASK);
303
90.9k
        MSG = _mm_add_epi32(MSG0, set(0xE9B5DBA5B5C0FBCF, 0x71374491428A2F98));
304
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
305
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
306
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
307
308
        /* Rounds 4-7 */
309
90.9k
        MSG1 = _mm_loadu_si128((const __m128i*)(chunk + 16));
310
90.9k
        MSG1 = _mm_shuffle_epi8(MSG1, MASK);
311
90.9k
        MSG = _mm_add_epi32(MSG1, set(0xAB1C5ED5923F82A4, 0x59F111F13956C25B));
312
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
313
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
314
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
315
90.9k
        MSG0 = _mm_sha256msg1_epu32(MSG0, MSG1);
316
317
        /* Rounds 8-11 */
318
90.9k
        MSG2 = _mm_loadu_si128((const __m128i*)(chunk + 32));
319
90.9k
        MSG2 = _mm_shuffle_epi8(MSG2, MASK);
320
90.9k
        MSG = _mm_add_epi32(MSG2, set(0x550C7DC3243185BE, 0x12835B01D807AA98));
321
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
322
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
323
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
324
90.9k
        MSG1 = _mm_sha256msg1_epu32(MSG1, MSG2);
325
326
        /* Rounds 12-15 */
327
90.9k
        MSG3 = _mm_loadu_si128((const __m128i*)(chunk + 48));
328
90.9k
        MSG3 = _mm_shuffle_epi8(MSG3, MASK);
329
90.9k
        MSG = _mm_add_epi32(MSG3, set(0xC19BF1749BDC06A7, 0x80DEB1FE72BE5D74));
330
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
331
90.9k
        TMP = _mm_alignr_epi8(MSG3, MSG2, 4);
332
90.9k
        MSG0 = _mm_add_epi32(MSG0, TMP);
333
90.9k
        MSG0 = _mm_sha256msg2_epu32(MSG0, MSG3);
334
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
335
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
336
90.9k
        MSG2 = _mm_sha256msg1_epu32(MSG2, MSG3);
337
338
        /* Rounds 16-19 */
339
90.9k
        MSG = _mm_add_epi32(MSG0, set(0x240CA1CC0FC19DC6, 0xEFBE4786E49B69C1));
340
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
341
90.9k
        TMP = _mm_alignr_epi8(MSG0, MSG3, 4);
342
90.9k
        MSG1 = _mm_add_epi32(MSG1, TMP);
343
90.9k
        MSG1 = _mm_sha256msg2_epu32(MSG1, MSG0);
344
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
345
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
346
90.9k
        MSG3 = _mm_sha256msg1_epu32(MSG3, MSG0);
347
348
        /* Rounds 20-23 */
349
90.9k
        MSG = _mm_add_epi32(MSG1, set(0x76F988DA5CB0A9DC, 0x4A7484AA2DE92C6F));
350
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
351
90.9k
        TMP = _mm_alignr_epi8(MSG1, MSG0, 4);
352
90.9k
        MSG2 = _mm_add_epi32(MSG2, TMP);
353
90.9k
        MSG2 = _mm_sha256msg2_epu32(MSG2, MSG1);
354
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
355
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
356
90.9k
        MSG0 = _mm_sha256msg1_epu32(MSG0, MSG1);
357
358
        /* Rounds 24-27 */
359
90.9k
        MSG = _mm_add_epi32(MSG2, set(0xBF597FC7B00327C8, 0xA831C66D983E5152));
360
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
361
90.9k
        TMP = _mm_alignr_epi8(MSG2, MSG1, 4);
362
90.9k
        MSG3 = _mm_add_epi32(MSG3, TMP);
363
90.9k
        MSG3 = _mm_sha256msg2_epu32(MSG3, MSG2);
364
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
365
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
366
90.9k
        MSG1 = _mm_sha256msg1_epu32(MSG1, MSG2);
367
368
        /* Rounds 28-31 */
369
90.9k
        MSG = _mm_add_epi32(MSG3, set(0x1429296706CA6351, 0xD5A79147C6E00BF3));
370
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
371
90.9k
        TMP = _mm_alignr_epi8(MSG3, MSG2, 4);
372
90.9k
        MSG0 = _mm_add_epi32(MSG0, TMP);
373
90.9k
        MSG0 = _mm_sha256msg2_epu32(MSG0, MSG3);
374
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
375
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
376
90.9k
        MSG2 = _mm_sha256msg1_epu32(MSG2, MSG3);
377
378
        /* Rounds 32-35 */
379
90.9k
        MSG = _mm_add_epi32(MSG0, set(0x53380D134D2C6DFC, 0x2E1B213827B70A85));
380
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
381
90.9k
        TMP = _mm_alignr_epi8(MSG0, MSG3, 4);
382
90.9k
        MSG1 = _mm_add_epi32(MSG1, TMP);
383
90.9k
        MSG1 = _mm_sha256msg2_epu32(MSG1, MSG0);
384
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
385
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
386
90.9k
        MSG3 = _mm_sha256msg1_epu32(MSG3, MSG0);
387
388
        /* Rounds 36-39 */
389
90.9k
        MSG = _mm_add_epi32(MSG1, set(0x92722C8581C2C92E, 0x766A0ABB650A7354));
390
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
391
90.9k
        TMP = _mm_alignr_epi8(MSG1, MSG0, 4);
392
90.9k
        MSG2 = _mm_add_epi32(MSG2, TMP);
393
90.9k
        MSG2 = _mm_sha256msg2_epu32(MSG2, MSG1);
394
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
395
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
396
90.9k
        MSG0 = _mm_sha256msg1_epu32(MSG0, MSG1);
397
398
        /* Rounds 40-43 */
399
90.9k
        MSG = _mm_add_epi32(MSG2, set(0xC76C51A3C24B8B70, 0xA81A664BA2BFE8A1));
400
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
401
90.9k
        TMP = _mm_alignr_epi8(MSG2, MSG1, 4);
402
90.9k
        MSG3 = _mm_add_epi32(MSG3, TMP);
403
90.9k
        MSG3 = _mm_sha256msg2_epu32(MSG3, MSG2);
404
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
405
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
406
90.9k
        MSG1 = _mm_sha256msg1_epu32(MSG1, MSG2);
407
408
        /* Rounds 44-47 */
409
90.9k
        MSG = _mm_add_epi32(MSG3, set(0x106AA070F40E3585, 0xD6990624D192E819));
410
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
411
90.9k
        TMP = _mm_alignr_epi8(MSG3, MSG2, 4);
412
90.9k
        MSG0 = _mm_add_epi32(MSG0, TMP);
413
90.9k
        MSG0 = _mm_sha256msg2_epu32(MSG0, MSG3);
414
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
415
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
416
90.9k
        MSG2 = _mm_sha256msg1_epu32(MSG2, MSG3);
417
418
        /* Rounds 48-51 */
419
90.9k
        MSG = _mm_add_epi32(MSG0, set(0x34B0BCB52748774C, 0x1E376C0819A4C116));
420
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
421
90.9k
        TMP = _mm_alignr_epi8(MSG0, MSG3, 4);
422
90.9k
        MSG1 = _mm_add_epi32(MSG1, TMP);
423
90.9k
        MSG1 = _mm_sha256msg2_epu32(MSG1, MSG0);
424
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
425
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
426
90.9k
        MSG3 = _mm_sha256msg1_epu32(MSG3, MSG0);
427
428
        /* Rounds 52-55 */
429
90.9k
        MSG = _mm_add_epi32(MSG1, set(0x682E6FF35B9CCA4F, 0x4ED8AA4A391C0CB3));
430
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
431
90.9k
        TMP = _mm_alignr_epi8(MSG1, MSG0, 4);
432
90.9k
        MSG2 = _mm_add_epi32(MSG2, TMP);
433
90.9k
        MSG2 = _mm_sha256msg2_epu32(MSG2, MSG1);
434
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
435
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
436
437
        /* Rounds 56-59 */
438
90.9k
        MSG = _mm_add_epi32(MSG2, set(0x8CC7020884C87814, 0x78A5636F748F82EE));
439
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
440
90.9k
        TMP = _mm_alignr_epi8(MSG2, MSG1, 4);
441
90.9k
        MSG3 = _mm_add_epi32(MSG3, TMP);
442
90.9k
        MSG3 = _mm_sha256msg2_epu32(MSG3, MSG2);
443
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
444
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
445
446
        /* Rounds 60-63 */
447
90.9k
        MSG = _mm_add_epi32(MSG3, set(0xC67178F2BEF9A3F7, 0xA4506CEB90BEFFFA));
448
90.9k
        STATE1 = _mm_sha256rnds2_epu32(STATE1, STATE0, MSG);
449
90.9k
        MSG = _mm_shuffle_epi32(MSG, 0x0E);
450
90.9k
        STATE0 = _mm_sha256rnds2_epu32(STATE0, STATE1, MSG);
451
452
        /* Combine state  */
453
90.9k
        STATE0 = _mm_add_epi32(STATE0, ABEF_SAVE);
454
90.9k
        STATE1 = _mm_add_epi32(STATE1, CDGH_SAVE);
455
90.9k
    }
456
457
66.3k
    TMP = _mm_shuffle_epi32(STATE0, 0x1B);       /* FEBA */
458
66.3k
    STATE1 = _mm_shuffle_epi32(STATE1, 0xB1);    /* DCHG */
459
66.3k
    STATE0 = _mm_blend_epi16(TMP, STATE1, 0xF0); /* DCBA */
460
66.3k
    STATE1 = _mm_alignr_epi8(STATE1, TMP, 8);    /* ABEF */
461
462
    /* Save state */
463
66.3k
    _mm_storeu_si128((__m128i*)&h[0], STATE0);
464
66.3k
    _mm_storeu_si128((__m128i*)&h[4], STATE1);
465
    // NOLINTEND(portability-simd-intrinsics)
466
    // NOLINTEND(cppcoreguidelines-pro-type-cstyle-cast)
467
66.3k
}
468
469
// https://stackoverflow.com/questions/6121792/how-to-check-if-a-cpu-supports-the-sse3-instruction-set
470
static void cpuid(int info[4], int InfoType)  // NOLINT(readability-non-const-parameter)
471
6
{
472
6
    __cpuid_count(InfoType, 0, info[0], info[1], info[2], info[3]);
473
6
}
474
475
__attribute__((constructor)) static void select_sha256_implementation()
476
2
{
477
2
    int info[4];
478
2
    cpuid(info, 0);
479
2
    const int nIds = info[0];
480
481
2
    bool hw_sse41 = false;
482
2
    bool hw_bmi1 = false;
483
2
    bool hw_bmi2 = false;
484
2
    bool hw_sha = false;
485
486
2
    if (nIds >= 0x00000001)
  Branch (486:9): [True: 2, False: 0]
+
487
2
    {
488
2
        cpuid(info, 0x00000001);
489
2
        hw_sse41 = (info[2] & (1 << 19)) != 0;
490
2
    }
491
2
    if (nIds >= 0x00000007)
  Branch (491:9): [True: 2, False: 0]
+
492
2
    {
493
2
        cpuid(info, 0x00000007);
494
2
        hw_bmi1 = (info[1] & (1 << 3)) != 0;
495
2
        hw_bmi2 = (info[1] & (1 << 8)) != 0;
496
2
        hw_sha = (info[1] & (1 << 29)) != 0;
497
2
    }
498
499
2
    if (hw_sse41 && hw_sha)
  Branch (499:9): [True: 2, False: 0]
+  Branch (499:21): [True: 2, False: 0]
+
  MC/DC Decision Region (499:9) to (499:27)
+
+  Number of Conditions: 2
+     Condition C1 --> (499:9)
+     Condition C2 --> (499:21)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { T,  T  = T      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
500
2
    {
501
2
        sha_256_best = sha_256_x86_sha;
502
2
    }
503
0
    else if (hw_bmi1 && hw_bmi2)
  Branch (503:14): [True: 0, False: 0]
+  Branch (503:25): [True: 0, False: 0]
+
  MC/DC Decision Region (503:14) to (503:32)
+
+  Number of Conditions: 2
+     Condition C1 --> (503:14)
+     Condition C2 --> (503:25)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
504
0
    {
505
0
        sha_256_best = sha_256_x86_bmi;
506
0
    }
507
2
}
508
509
#elif defined(__aarch64__) && defined(__APPLE__)
510
511
// The following function was adapted from
512
// https://github.com/noloader/SHA-Intrinsics/blob/master/sha256-arm.c
513
/* sha256-arm.c - ARMv8 SHA extensions using C intrinsics     */
514
/*   Written and placed in public domain by Jeffrey Walton    */
515
/*   Based on code from ARM, and by Johannes Schneiders, Skip */
516
/*   Hovsmith and Barry O'Rourke for the mbedTLS project.     */
517
static void sha_256_arm_v8(uint32_t h[8], const std::byte* input, size_t len)
518
{
519
    uint32x4_t STATE0, STATE1, ABEF_SAVE, CDGH_SAVE;
520
    uint32x4_t MSG0, MSG1, MSG2, MSG3;
521
    uint32x4_t TMP0, TMP1, TMP2;
522
523
    /* Load state */
524
    STATE0 = vld1q_u32(&h[0]);
525
    STATE1 = vld1q_u32(&h[4]);
526
527
    BufferState state{input, len};
528
529
    /* 512-bit chunks is what we will operate on. */
530
    uint8_t chunk[CHUNK_SIZE];
531
532
    while (calc_chunk(chunk, &state))
533
    {
534
        /* Save state */
535
        ABEF_SAVE = STATE0;
536
        CDGH_SAVE = STATE1;
537
538
        /* Load message */
539
        MSG0 = vld1q_u32((const uint32_t*)(chunk + 0));
540
        MSG1 = vld1q_u32((const uint32_t*)(chunk + 16));
541
        MSG2 = vld1q_u32((const uint32_t*)(chunk + 32));
542
        MSG3 = vld1q_u32((const uint32_t*)(chunk + 48));
543
544
        /* Reverse for little endian */
545
        MSG0 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG0)));
546
        MSG1 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG1)));
547
        MSG2 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG2)));
548
        MSG3 = vreinterpretq_u32_u8(vrev32q_u8(vreinterpretq_u8_u32(MSG3)));
549
550
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&k[0x00]));
551
552
        /* Rounds 0-3 */
553
        MSG0 = vsha256su0q_u32(MSG0, MSG1);
554
        TMP2 = STATE0;
555
        TMP1 = vaddq_u32(MSG1, vld1q_u32(&k[0x04]));
556
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
557
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
558
        MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);
559
560
        /* Rounds 4-7 */
561
        MSG1 = vsha256su0q_u32(MSG1, MSG2);
562
        TMP2 = STATE0;
563
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&k[0x08]));
564
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
565
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
566
        MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);
567
568
        /* Rounds 8-11 */
569
        MSG2 = vsha256su0q_u32(MSG2, MSG3);
570
        TMP2 = STATE0;
571
        TMP1 = vaddq_u32(MSG3, vld1q_u32(&k[0x0c]));
572
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
573
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
574
        MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);
575
576
        /* Rounds 12-15 */
577
        MSG3 = vsha256su0q_u32(MSG3, MSG0);
578
        TMP2 = STATE0;
579
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&k[0x10]));
580
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
581
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
582
        MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);
583
584
        /* Rounds 16-19 */
585
        MSG0 = vsha256su0q_u32(MSG0, MSG1);
586
        TMP2 = STATE0;
587
        TMP1 = vaddq_u32(MSG1, vld1q_u32(&k[0x14]));
588
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
589
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
590
        MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);
591
592
        /* Rounds 20-23 */
593
        MSG1 = vsha256su0q_u32(MSG1, MSG2);
594
        TMP2 = STATE0;
595
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&k[0x18]));
596
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
597
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
598
        MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);
599
600
        /* Rounds 24-27 */
601
        MSG2 = vsha256su0q_u32(MSG2, MSG3);
602
        TMP2 = STATE0;
603
        TMP1 = vaddq_u32(MSG3, vld1q_u32(&k[0x1c]));
604
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
605
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
606
        MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);
607
608
        /* Rounds 28-31 */
609
        MSG3 = vsha256su0q_u32(MSG3, MSG0);
610
        TMP2 = STATE0;
611
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&k[0x20]));
612
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
613
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
614
        MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);
615
616
        /* Rounds 32-35 */
617
        MSG0 = vsha256su0q_u32(MSG0, MSG1);
618
        TMP2 = STATE0;
619
        TMP1 = vaddq_u32(MSG1, vld1q_u32(&k[0x24]));
620
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
621
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
622
        MSG0 = vsha256su1q_u32(MSG0, MSG2, MSG3);
623
624
        /* Rounds 36-39 */
625
        MSG1 = vsha256su0q_u32(MSG1, MSG2);
626
        TMP2 = STATE0;
627
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&k[0x28]));
628
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
629
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
630
        MSG1 = vsha256su1q_u32(MSG1, MSG3, MSG0);
631
632
        /* Rounds 40-43 */
633
        MSG2 = vsha256su0q_u32(MSG2, MSG3);
634
        TMP2 = STATE0;
635
        TMP1 = vaddq_u32(MSG3, vld1q_u32(&k[0x2c]));
636
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
637
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
638
        MSG2 = vsha256su1q_u32(MSG2, MSG0, MSG1);
639
640
        /* Rounds 44-47 */
641
        MSG3 = vsha256su0q_u32(MSG3, MSG0);
642
        TMP2 = STATE0;
643
        TMP0 = vaddq_u32(MSG0, vld1q_u32(&k[0x30]));
644
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
645
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
646
        MSG3 = vsha256su1q_u32(MSG3, MSG1, MSG2);
647
648
        /* Rounds 48-51 */
649
        TMP2 = STATE0;
650
        TMP1 = vaddq_u32(MSG1, vld1q_u32(&k[0x34]));
651
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
652
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
653
654
        /* Rounds 52-55 */
655
        TMP2 = STATE0;
656
        TMP0 = vaddq_u32(MSG2, vld1q_u32(&k[0x38]));
657
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
658
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
659
660
        /* Rounds 56-59 */
661
        TMP2 = STATE0;
662
        TMP1 = vaddq_u32(MSG3, vld1q_u32(&k[0x3c]));
663
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP0);
664
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP0);
665
666
        /* Rounds 60-63 */
667
        TMP2 = STATE0;
668
        STATE0 = vsha256hq_u32(STATE0, STATE1, TMP1);
669
        STATE1 = vsha256h2q_u32(STATE1, TMP2, TMP1);
670
671
        /* Combine state */
672
        STATE0 = vaddq_u32(STATE0, ABEF_SAVE);
673
        STATE1 = vaddq_u32(STATE1, CDGH_SAVE);
674
    }
675
676
    /* Save state */
677
    vst1q_u32(&h[0], STATE0);
678
    vst1q_u32(&h[4], STATE1);
679
}
680
681
__attribute__((constructor)) static void select_sha256_implementation(void)
682
{
683
#if defined(__linux__)
684
    if ((getauxval(AT_HWCAP) & HWCAP_SHA2) != 0)
685
    {
686
        sha_256_best = sha_256_arm_v8;
687
    }
688
#elif defined(__APPLE__)
689
    int64_t hw_cap = 0;
690
    size_t size = sizeof(hw_cap);
691
692
    if (sysctlbyname("hw.optional.armv8_2_sha3", &hw_cap, &size, NULL, 0) == 0)
693
    {
694
        // Use SHA3 as proxy for SHA2 (sysctl hw doesn't list SHA2 for Apple M1)
695
        if (hw_cap == 1)
696
        {
697
            sha_256_best = sha_256_arm_v8;
698
        }
699
    }
700
#endif  // defined(__linux__), defined(__APPLE__)
701
}
702
703
#endif  // defined(__x86_64__), defined(__aarch64__)
704
705
/*
706
 * Limitations:
707
 * - Since input is a pointer in RAM, the data to hash should be in RAM, which could be a problem
708
 *   for large data sizes.
709
 * - SHA algorithms theoretically operate on bit strings. However, this implementation has no
710
 * support for bit string lengths that are not multiples of eight, and it really operates on arrays
711
 * of bytes. In particular, the len parameter is a number of bytes.
712
 */
713
void sha256(std::byte hash[SHA256_HASH_SIZE], const std::byte* data, size_t size)
714
66.3k
{
715
    /*
716
     * Initialize hash values:
717
     * (first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19):
718
     */
719
66.3k
    uint32_t h[] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c,
720
66.3k
        0x1f83d9ab, 0x5be0cd19};
721
722
66.3k
    sha_256_best(h, data, size);
723
724
    /* Produce the final hash value (big-endian): */
725
597k
    for (unsigned i = 0, j = 0; i < 8; 
i++531k
)
  Branch (725:33): [True: 531k, False: 66.3k]
+
726
531k
    {
727
531k
        hash[j++] = static_cast<std::byte>(h[i] >> 24);
728
531k
        hash[j++] = static_cast<std::byte>(h[i] >> 16);
729
531k
        hash[j++] = static_cast<std::byte>(h[i] >> 8);
730
531k
        hash[j++] = static_cast<std::byte>(h[i]);
731
531k
    }
732
66.3k
}
733
734
}  // namespace evmone::crypto
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/blockchaintest/blockchaintest.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/blockchaintest/blockchaintest.cpp.html new file mode 100644 index 0000000000..ad237519ee --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/blockchaintest/blockchaintest.cpp.html @@ -0,0 +1,26 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/blockchaintest/blockchaintest.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "blockchaintest_runner.hpp"
6
#include <CLI/CLI.hpp>
7
#include <evmone/evmone.h>
8
#include <evmone/version.h>
9
#include <gtest/gtest.h>
10
#include <iostream>
11
12
namespace fs = std::filesystem;
13
14
namespace
15
{
16
/// Implementation of a gtest Test which runs all blockchain tests from a given file.
17
class BlockchainGTestFile : public testing::Test
18
{
19
    fs::path m_json_test_file;
20
    evmc::VM& m_vm;
21
22
public:
23
    explicit BlockchainGTestFile(fs::path json_test_file, evmc::VM& vm) noexcept
24
2.81k
      : m_json_test_file{std::move(json_test_file)}, m_vm{vm}
25
2.81k
    {}
26
27
    void TestBody() final
28
2.81k
    {
29
2.81k
        std::ifstream f{m_json_test_file};
30
31
2.81k
        try
32
2.81k
        {
33
2.81k
            evmone::test::run_blockchain_tests(evmone::test::load_blockchain_tests(f), m_vm);
34
2.81k
        }
35
2.81k
        catch (const evmone::test::UnsupportedTestFeature& ex)
36
2.81k
        {
37
2
            GTEST_SKIP() << ex.what();
38
2
        }
39
2.81k
    }
40
41
    static void register_one(const std::string& suite_name, const fs::path& file, evmc::VM& vm)
42
2.81k
    {
43
2.81k
        testing::RegisterTest(suite_name.c_str(), file.stem().string().c_str(), nullptr, nullptr,
44
2.81k
            file.string().c_str(), 0,
45
2.81k
            [file, &vm]() -> testing::Test* { return new BlockchainGTestFile(file, vm); });
46
2.81k
    }
47
};
48
49
/// Implementation of a gtest Test which runs a single blockchain test.
50
class BlockchainGTest : public testing::Test
51
{
52
    const evmone::test::BlockchainTest m_blockchain_test;
53
    evmc::VM& m_vm;
54
55
public:
56
    explicit BlockchainGTest(evmone::test::BlockchainTest blockchain_test, evmc::VM& vm) noexcept
57
0
      : m_blockchain_test{std::move(blockchain_test)}, m_vm{vm}
58
0
    {}
59
60
    void TestBody() final
61
0
    {
62
0
        evmone::test::run_blockchain_tests(std::array{m_blockchain_test}, m_vm);
63
0
    }
64
65
    static void register_one(const evmone::test::BlockchainTest& test,
66
        const std::string& suite_name, const std::string& test_name, const fs::path& file,
67
        evmc::VM& vm)
68
0
    {
69
0
        testing::RegisterTest(suite_name.c_str(), test_name.c_str(), nullptr, nullptr,
70
0
            file.string().c_str(), 0,
71
0
            [test, &vm]() -> testing::Test* { return new BlockchainGTest(test, vm); });
72
0
    }
73
};
74
75
void register_test_files(const fs::path& root, evmc::VM& vm)
76
1
{
77
1
    if (is_directory(root))
  Branch (77:9): [True: 1, False: 0]
+
78
1
    {
79
1
        std::vector<fs::path> test_files;
80
1
        std::copy_if(fs::recursive_directory_iterator{root}, fs::recursive_directory_iterator{},
81
2.95k
            std::back_inserter(test_files), [](const fs::directory_entry& entry) {
82
                // "index.json" files are just lists of tests generated by other tools.
83
2.95k
                return entry.is_regular_file() && 
entry.path().extension() == ".json"2.81k
&&
  Branch (83:24): [True: 2.81k, False: 132]
+  Branch (83:51): [True: 2.81k, False: 0]
+
84
2.95k
                       
entry.path().filename() != "index.json"2.81k
;
  Branch (84:24): [True: 2.81k, False: 0]
+
  MC/DC Decision Region (83:24) to (84:63)
+
+  Number of Conditions: 3
+     Condition C1 --> (83:24)
+     Condition C2 --> (83:51)
+     Condition C3 --> (84:24)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  T,  T  = T      }
+
+  C1-Pair: covered: (1,2)
+  C2-Pair: not covered
+  C3-Pair: not covered
+  MC/DC Coverage for Expression: 33.33%
+
85
2.95k
            });
86
1
        std::ranges::sort(test_files);
87
88
1
        for (const auto& p : test_files)
  Branch (88:28): [True: 2.81k, False: 1]
+
89
2.81k
            BlockchainGTestFile::register_one(fs::relative(p, root).parent_path().string(), p, vm);
90
1
    }
91
0
    else  // Treat as a file.
92
0
    {
93
0
        std::ifstream f{root};
94
0
        try
95
0
        {
96
0
            const auto tests = evmone::test::load_blockchain_tests(f);
97
0
            for (const auto& test : tests)
  Branch (97:35): [True: 0, False: 0]
+
98
0
                BlockchainGTest::register_one(test, root.string(), test.name, root, vm);
99
0
        }
100
0
        catch (const evmone::test::UnsupportedTestFeature& ex)
101
0
        {
102
0
            std::cerr << ex.what() << ": " << root.string() << '\n';
103
0
        }
104
0
    }
105
1
}
106
}  // namespace
107
108
109
int main(int argc, char* argv[])
110
1
{
111
1
    try
112
1
    {
113
1
        testing::InitGoogleTest(&argc, argv);  // Process GoogleTest flags.
114
115
1
        CLI::App app{"evmone blockchain test runner"};
116
117
1
        app.set_version_flag("--version", "evmone-blockchaintest " EVMONE_VERSION);
118
119
1
        std::vector<std::string> paths;
120
1
        app.add_option("path", paths,
121
1
               "Path to test file or directory. For a directory, all .json "
122
1
               "files (except index.json) are considered test files, and each file is treated as a "
123
1
               "separate test. For a file, all tests in the file are treated as separate tests.")
124
1
            ->required()
125
1
            ->check(CLI::ExistingPath);
126
127
1
        bool trace_flag = false;
128
1
        app.add_flag("--trace", trace_flag, "Enable EVM tracing");
129
130
1
        CLI11_PARSE(app, argc, argv);
131
132
1
        evmc::VM vm{evmc_create_evmone()};
133
134
1
        if (trace_flag)
  Branch (134:13): [True: 0, False: 1]
+
135
0
            vm.set_option("trace", "1");
136
137
1
        for (const auto& p : paths)
  Branch (137:28): [True: 1, False: 1]
+
138
1
            register_test_files(p, vm);
139
140
1
        return RUN_ALL_TESTS();
141
1
    }
142
1
    catch (const std::exception& ex)
143
1
    {
144
0
        std::cerr << ex.what() << "\n";
145
0
        return -1;
146
0
    }
147
1
}
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/blockchaintest/blockchaintest_runner.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/blockchaintest/blockchaintest_runner.cpp.html new file mode 100644 index 0000000000..252d0b20f9 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/blockchaintest/blockchaintest_runner.cpp.html @@ -0,0 +1,242 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/blockchaintest/blockchaintest_runner.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "blockchaintest_runner.hpp"
6
#include <gtest/gtest.h>
7
#include <test/state/ethash_difficulty.hpp>
8
#include <test/state/requests.hpp>
9
#include <test/utils/mpt_hash.hpp>
10
#include <test/utils/rlp.hpp>
11
#include <test/utils/rlp_encode.hpp>
12
#include <test/utils/statetest.hpp>
13
14
namespace evmone::test
15
{
16
17
/// The CL gossip protocol constraint of the maximum block size (EIP-7934).
18
constexpr size_t MAX_BLOCK_SIZE = 10 * 1024 * 1024;
19
/// The safety margin for beacon block content (EIP-7934).
20
constexpr size_t SAFETY_MARGIN = 2 * 1024 * 1024;
21
/// The maximum EL block size when RLP encoded (EIP-7934).
22
constexpr size_t MAX_RLP_BLOCK_SIZE = MAX_BLOCK_SIZE - SAFETY_MARGIN;
23
24
struct RejectedTransaction
25
{
26
    hash256 hash;
27
    size_t index;
28
    std::string message;
29
};
30
31
struct TransitionResult
32
{
33
    std::vector<state::TransactionReceipt> receipts;
34
    std::vector<RejectedTransaction> rejected;
35
    std::optional<std::vector<state::Requests>> requests;
36
    int64_t gas_used;
37
    state::BloomFilter bloom;
38
    int64_t blob_gas_left;
39
    TestState block_state;
40
};
41
42
namespace
43
{
44
TransitionResult apply_block(const TestState& state, evmc::VM& vm, const state::BlockInfo& block,
45
    const state::BlockHashes& block_hashes, const std::vector<state::Transaction>& txs,
46
    evmc_revision rev, std::optional<int64_t> block_reward)
47
89.8k
{
48
89.8k
    TestState block_state(state);
49
89.8k
    system_call_block_start(block_state, block, block_hashes, rev, vm);
50
51
89.8k
    std::vector<state::Log> txs_logs;
52
89.8k
    int64_t block_gas_left = block.gas_limit;
53
89.8k
    auto blob_gas_left = static_cast<int64_t>(block.blob_gas_used.value_or(0));
54
55
89.8k
    std::vector<RejectedTransaction> rejected_txs;
56
89.8k
    std::vector<state::TransactionReceipt> receipts;
57
58
89.8k
    int64_t cumulative_gas_used = 0;
59
60
181k
    for (size_t i = 0; i < txs.size(); 
++i91.5k
)
  Branch (60:24): [True: 91.5k, False: 89.8k]
+
61
91.5k
    {
62
91.5k
        const auto& tx = txs[i];
63
64
91.5k
        const auto computed_tx_hash = keccak256(rlp::encode(tx));
65
91.5k
        auto res = test::transition(
66
91.5k
            block_state, block, block_hashes, tx, rev, vm, block_gas_left, blob_gas_left);
67
68
91.5k
        if (holds_alternative<std::error_code>(res))
  Branch (68:13): [True: 3.57k, False: 87.9k]
+
69
3.57k
        {
70
3.57k
            const auto ec = std::get<std::error_code>(res);
71
3.57k
            rejected_txs.push_back({computed_tx_hash, i, ec.message()});
72
3.57k
        }
73
87.9k
        else
74
87.9k
        {
75
87.9k
            auto& receipt = get<state::TransactionReceipt>(res);
76
77
87.9k
            const auto& tx_logs = receipt.logs;
78
79
87.9k
            txs_logs.insert(txs_logs.end(), tx_logs.begin(), tx_logs.end());
80
87.9k
            cumulative_gas_used += receipt.gas_used;
81
87.9k
            receipt.cumulative_gas_used = cumulative_gas_used;
82
87.9k
            if (rev < EVMC_BYZANTIUM)
  Branch (82:17): [True: 1.94k, False: 86.0k]
+
83
1.94k
                receipt.post_state = state::mpt_hash(block_state);
84
85
87.9k
            block_gas_left -= receipt.gas_used;
86
87.9k
            blob_gas_left -= static_cast<int64_t>(tx.blob_gas_used());
87
87.9k
            receipts.emplace_back(std::move(receipt));
88
87.9k
        }
89
91.5k
    }
90
91
89.8k
    auto requests = [&]() -> std::optional<std::vector<state::Requests>> {
92
89.8k
        std::vector<state::Requests> collected;
93
94
89.8k
        if (rev >= EVMC_PRAGUE)
  Branch (94:13): [True: 47.0k, False: 42.7k]
+
95
47.0k
        {
96
47.0k
            auto opt_deposits = collect_deposit_requests(receipts);
97
47.0k
            if (!opt_deposits.has_value())
  Branch (97:17): [True: 44, False: 47.0k]
+
98
44
                return std::nullopt;
99
47.0k
            collected.emplace_back(std::move(*opt_deposits));
100
47.0k
        }
101
102
89.7k
        auto requests_result = system_call_block_end(block_state, block, block_hashes, rev, vm);
103
89.7k
        if (!requests_result.has_value())
  Branch (103:13): [True: 16, False: 89.7k]
+
104
16
            return std::nullopt;
105
89.7k
        std::ranges::move(*requests_result, std::back_inserter(collected));
106
107
89.7k
        return collected;
108
89.7k
    }();
109
110
89.8k
    finalize(block_state, rev, block.coinbase, block_reward, block.ommers, block.withdrawals);
111
112
89.8k
    const auto bloom = compute_bloom_filter(receipts);
113
114
89.8k
    return {std::move(receipts), std::move(rejected_txs), std::move(requests), cumulative_gas_used,
115
89.8k
        bloom, blob_gas_left, std::move(block_state)};
116
89.8k
}
117
118
bool validate_block(evmc_revision rev, state::BlobParams blob_params, const TestBlock& test_block,
119
    const BlockHeader* parent_header, bool parent_has_ommers) noexcept
120
91.1k
{
121
    // NOTE: includes only block validity unrelated to individual txs. See `apply_block`.
122
123
    // Fail if parent header was not found.
124
91.1k
    if (parent_header == nullptr)
  Branch (124:9): [True: 0, False: 91.1k]
+
125
0
        return false;
126
127
91.1k
    if (test_block.block_info.number != parent_header->block_number + 1)
  Branch (127:9): [True: 13, False: 91.1k]
+
128
13
        return false;
129
130
91.1k
    if (test_block.block_info.gas_used > test_block.block_info.gas_limit)
  Branch (130:9): [True: 13, False: 91.1k]
+
131
13
        return false;
132
133
    // Some tests have gas limit at INT64_MAX, so we cast to uint64_t to avoid overflow.
134
91.1k
    const auto parent_header_gas_limit_u64 = static_cast<uint64_t>(parent_header->gas_limit);
135
91.1k
    const auto test_block_gas_limit_u64 = static_cast<uint64_t>(test_block.block_info.gas_limit);
136
91.1k
    if (test_block_gas_limit_u64 >=
  Branch (136:9): [True: 13, False: 91.1k]
+
137
91.1k
        parent_header_gas_limit_u64 + parent_header_gas_limit_u64 / 1024)
138
13
        return false;
139
91.1k
    if (test_block_gas_limit_u64 <=
  Branch (139:9): [True: 39, False: 91.0k]
+
140
91.1k
        parent_header_gas_limit_u64 - parent_header_gas_limit_u64 / 1024)
141
39
        return false;
142
143
    // Block gas limit minimum from Yellow Paper.
144
91.0k
    if (test_block.block_info.gas_limit < 5000)
  Branch (144:9): [True: 13, False: 91.0k]
+
145
13
        return false;
146
147
    // FIXME: Some tests have timestamp not fitting into int64_t, type has to be uint64_t.
148
91.0k
    if (static_cast<uint64_t>(test_block.block_info.timestamp) <=
  Branch (148:9): [True: 13, False: 91.0k]
+
149
91.0k
        static_cast<uint64_t>(parent_header->timestamp))
150
13
        return false;
151
152
91.0k
    if (test_block.block_info.difficulty != state::calculate_difficulty(parent_header->difficulty,
  Branch (152:9): [True: 0, False: 91.0k]
+
153
91.0k
                                                parent_has_ommers, parent_header->timestamp,
154
91.0k
                                                test_block.block_info.timestamp,
155
91.0k
                                                test_block.block_info.number, rev))
156
0
        return false;
157
158
91.0k
    if (rev >= EVMC_PARIS && 
!test_block.block_info.ommers.empty()74.8k
)
  Branch (158:9): [True: 74.8k, False: 16.1k]
+  Branch (158:30): [True: 0, False: 74.8k]
+
  MC/DC Decision Region (158:9) to (158:67)
+
+  Number of Conditions: 2
+     Condition C1 --> (158:9)
+     Condition C2 --> (158:30)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
159
0
        return false;
160
161
162
91.0k
    for (const auto& ommer : test_block.block_info.ommers)
  Branch (162:28): [True: 0, False: 91.0k]
+
163
0
    {
164
        // Check that ommer block number difference with current block is within allowed range.
165
        // https://github.com/ethereum/execution-specs/blob/ee73be5c4d83a2e3c358bd14990878002e52ba9e/src/ethereum/gray_glacier/fork.py#L623
166
0
        if (ommer.delta < 1 || ommer.delta > 6)
  Branch (166:13): [True: 0, False: 0]
+  Branch (166:32): [True: 0, False: 0]
+
  MC/DC Decision Region (166:13) to (166:47)
+
+  Number of Conditions: 2
+     Condition C1 --> (166:13)
+     Condition C2 --> (166:32)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
167
0
            return false;
168
0
    }
169
170
91.0k
    if (test_block.block_info.extra_data.size() > 32)
  Branch (170:9): [True: 0, False: 91.0k]
+
171
0
        return false;
172
173
91.0k
    if (rev >= EVMC_LONDON)
  Branch (173:9): [True: 77.8k, False: 13.1k]
+
174
77.8k
    {
175
77.8k
        const auto calculated_base_fee = state::calc_base_fee(
176
77.8k
            parent_header->gas_limit, parent_header->gas_used, parent_header->base_fee_per_gas);
177
77.8k
        if (test_block.block_info.base_fee != calculated_base_fee)
  Branch (177:13): [True: 6, False: 77.8k]
+
178
6
            return false;
179
77.8k
    }
180
181
91.0k
    if (rev >= EVMC_CANCUN)
  Branch (181:9): [True: 68.1k, False: 22.9k]
+
182
68.1k
    {
183
        // `excess_blob_gas` and `blob_gas_used` mandatory after Cancun and invalid before.
184
68.1k
        if (!test_block.block_info.excess_blob_gas.has_value() ||
  Branch (184:13): [True: 2, False: 68.1k]
+
185
68.1k
            
!test_block.block_info.blob_gas_used.has_value()68.1k
)
  Branch (185:13): [True: 1, False: 68.1k]
+
  MC/DC Decision Region (184:13) to (185:61)
+
+  Number of Conditions: 2
+     Condition C1 --> (184:13)
+     Condition C2 --> (185:13)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
186
3
            return false;
187
188
        // Check that the excess blob gas was updated correctly.
189
        // According to EIP-7918 current blocks params (`rev`) should be used for parent base fee
190
        // calculation.
191
68.1k
        const auto parent_blob_base_fee =
192
68.1k
            state::compute_blob_gas_price(blob_params, parent_header->excess_blob_gas.value_or(0));
193
68.1k
        if (*test_block.block_info.excess_blob_gas !=
  Branch (193:13): [True: 1.00k, False: 67.1k]
+
194
68.1k
            state::calc_excess_blob_gas(rev, blob_params, parent_header->blob_gas_used.value_or(0),
195
68.1k
                parent_header->excess_blob_gas.value_or(0), parent_header->base_fee_per_gas,
196
68.1k
                parent_blob_base_fee))
197
1.00k
            return false;
198
199
        // Ensure the total blob gas spent is at most equal to the limit
200
67.1k
        if (*test_block.block_info.blob_gas_used > state::max_blob_gas_per_block(blob_params))
  Branch (200:13): [True: 209, False: 66.8k]
+
201
209
            return false;
202
67.1k
    }
203
22.9k
    else
204
22.9k
    {
205
22.9k
        if (test_block.block_info.excess_blob_gas.has_value() ||
  Branch (205:13): [True: 2, False: 22.9k]
+
206
22.9k
            
test_block.block_info.blob_gas_used.has_value()22.9k
)
  Branch (206:13): [True: 1, False: 22.9k]
+
  MC/DC Decision Region (205:13) to (206:60)
+
+  Number of Conditions: 2
+     Condition C1 --> (205:13)
+     Condition C2 --> (206:13)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
207
3
            return false;
208
22.9k
    }
209
210
    // Block is invalid if some of the withdrawal fields failed to be parsed.
211
89.8k
    if (!test_block.withdrawals_parse_success)
  Branch (211:9): [True: 0, False: 89.8k]
+
212
0
        return false;
213
214
89.8k
    if (rev >= EVMC_OSAKA && 
test_block.rlp_size > MAX_RLP_BLOCK_SIZE23.6k
)
  Branch (214:9): [True: 23.6k, False: 66.2k]
+  Branch (214:30): [True: 2, False: 23.5k]
+
  MC/DC Decision Region (214:9) to (214:70)
+
+  Number of Conditions: 2
+     Condition C1 --> (214:9)
+     Condition C2 --> (214:30)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
215
2
        return false;
216
217
89.8k
    return true;
218
89.8k
}
219
220
std::optional<int64_t> mining_reward(evmc_revision rev) noexcept
221
89.8k
{
222
89.8k
    if (rev < EVMC_BYZANTIUM)
  Branch (222:9): [True: 2.46k, False: 87.3k]
+
223
2.46k
        return 5'000000000'000000000;
224
87.3k
    if (rev < EVMC_CONSTANTINOPLE)
  Branch (224:9): [True: 1.80k, False: 85.5k]
+
225
1.80k
        return 3'000000000'000000000;
226
85.5k
    if (rev < EVMC_PARIS)
  Branch (226:9): [True: 11.9k, False: 73.6k]
+
227
11.9k
        return 2'000000000'000000000;
228
73.6k
    return std::nullopt;
229
85.5k
}
230
231
std::string print_state(const TestState& s)
232
0
{
233
0
    std::stringstream out;
234
235
0
    for (const auto& [key, acc] : s)
  Branch (235:33): [True: 0, False: 0]
+
236
0
    {
237
0
        out << key << " : \n";
238
0
        out << "\tnonce : " << acc.nonce << "\n";
239
0
        out << "\tbalance : " << hex0x(acc.balance) << "\n";
240
0
        out << "\tcode : " << hex0x(acc.code) << "\n";
241
242
0
        if (!acc.storage.empty())
  Branch (242:13): [True: 0, False: 0]
+
243
0
        {
244
0
            out << "\tstorage : \n";
245
0
            for (const auto& [s_key, val] : acc.storage)
  Branch (245:43): [True: 0, False: 0]
+
246
0
            {
247
0
                if (!is_zero(val))  // Skip 0 values.
  Branch (247:21): [True: 0, False: 0]
+
248
0
                    out << "\t\t" << s_key << " : " << hex0x(val) << "\n";
249
0
            }
250
0
        }
251
0
    }
252
253
0
    return out.str();
254
0
}
255
}  // namespace
256
257
void run_blockchain_tests(std::span<const BlockchainTest> tests, evmc::VM& vm)
258
2.81k
{
259
72.3k
    for (size_t case_index = 0; case_index != tests.size(); 
++case_index69.5k
)
  Branch (259:33): [True: 69.5k, False: 2.81k]
+
260
69.5k
    {
261
69.5k
        const auto& c = tests[case_index];
262
69.5k
        const auto rev_schedule = to_rev_schedule(c.network);
263
69.5k
        SCOPED_TRACE(std::string{evmc::to_string(rev_schedule.get_revision(0))} + '/' +
264
69.5k
                     std::to_string(case_index) + '/' + c.name);
265
266
        // Validate the genesis block header.
267
69.5k
        EXPECT_EQ(c.genesis_block_header.block_number, 0);
  Branch (267:9): [True: 69.5k, False: 0]
+  Branch (267:9): [True: 0, False: 69.5k]
+  Branch (267:9): [True: 69.5k, False: 0]
+
268
69.5k
        EXPECT_EQ(c.genesis_block_header.gas_used, 0);
  Branch (268:9): [True: 69.5k, False: 0]
+  Branch (268:9): [True: 0, False: 69.5k]
+  Branch (268:9): [True: 69.5k, False: 0]
+
269
69.5k
        EXPECT_EQ(c.genesis_block_header.transactions_root, state::EMPTY_MPT_HASH);
  Branch (269:9): [True: 69.5k, False: 0]
+  Branch (269:9): [True: 0, False: 69.5k]
+  Branch (269:9): [True: 69.5k, False: 0]
+
270
69.5k
        EXPECT_EQ(c.genesis_block_header.receipts_root, state::EMPTY_MPT_HASH);
  Branch (270:9): [True: 69.5k, False: 0]
+  Branch (270:9): [True: 0, False: 69.5k]
+  Branch (270:9): [True: 69.5k, False: 0]
+
271
69.5k
        EXPECT_EQ(c.genesis_block_header.withdrawal_root,
  Branch (271:9): [True: 69.5k, False: 0]
+  Branch (271:9): [True: 0, False: 69.5k]
+  Branch (271:9): [True: 69.5k, False: 0]
+
272
69.5k
            rev_schedule.get_revision(c.genesis_block_header.timestamp) >= EVMC_SHANGHAI ?
273
69.5k
                state::EMPTY_MPT_HASH :
274
69.5k
                bytes32{});
275
69.5k
        EXPECT_EQ(c.genesis_block_header.logs_bloom, bytes_view{state::BloomFilter{}});
  Branch (275:9): [True: 69.5k, False: 0]
+  Branch (275:9): [True: 0, False: 69.5k]
+  Branch (275:9): [True: 69.5k, False: 0]
+
276
277
69.5k
        TestBlockHashes block_hashes{
278
69.5k
            {c.genesis_block_header.block_number, c.genesis_block_header.hash}};
279
280
69.5k
        struct BlockData
281
69.5k
        {
282
69.5k
            const BlockHeader* header;
283
69.5k
            bool has_ommers = false;
284
69.5k
            TestState post_state;
285
69.5k
            intx::uint256 total_difficulty;
286
69.5k
        };
287
69.5k
        std::unordered_map<hash256, BlockData> block_data{{{c.genesis_block_header.hash,
288
69.5k
            {&c.genesis_block_header, false, c.pre_state, c.genesis_block_header.difficulty}}}};
289
69.5k
        const auto* canonical_state = &c.pre_state;
290
69.5k
        intx::uint256 max_total_difficulty = c.genesis_block_header.difficulty;
291
292
160k
        for (size_t i = 0; i < c.test_blocks.size(); 
++i91.1k
)
  Branch (292:28): [True: 91.1k, False: 69.5k]
+
293
91.1k
        {
294
91.1k
            const auto& test_block = c.test_blocks[i];
295
91.1k
            const auto& bi = test_block.block_info;
296
297
91.1k
            const auto parent_data_it = block_data.find(test_block.block_info.parent_hash);
298
91.1k
            const auto* parent_header =
299
91.1k
                parent_data_it != block_data.end() ? parent_data_it->second.header : 
nullptr0
;
  Branch (299:17): [True: 91.1k, False: 0]
+
300
91.1k
            const auto parent_has_ommers =
301
91.1k
                parent_data_it != block_data.end() && parent_data_it->second.has_ommers;
  Branch (301:17): [True: 91.1k, False: 0]
+  Branch (301:55): [True: 0, False: 91.1k]
+
  MC/DC Decision Region (301:17) to (301:88)
+
+  Number of Conditions: 2
+     Condition C1 --> (301:17)
+     Condition C2 --> (301:55)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { T,  F  = F      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
302
303
91.1k
            const auto rev = rev_schedule.get_revision(bi.timestamp);
304
91.1k
            const auto blob_params = get_blob_params(c.network, c.blob_schedule, bi.timestamp);
305
306
91.1k
            SCOPED_TRACE(std::string{evmc::to_string(rev)} + '/' + std::to_string(case_index) +
307
91.1k
                         '/' + c.name + '/' + std::to_string(test_block.block_info.number));
308
309
91.1k
            if (test_block.valid)
  Branch (309:17): [True: 85.9k, False: 5.15k]
+
310
85.9k
            {
311
171k
                
ASSERT_TRUE85.9k
(
  Branch (311:17): [True: 85.9k, False: 0]
+  Branch (311:17): [True: 0, False: 85.9k]
+  Branch (311:17): [True: 85.9k, False: 0]
+
312
171k
                    validate_block(rev, blob_params, test_block, parent_header, parent_has_ommers))
313
171k
                    << "Expected block to be valid (validate_block)";
314
315
                // Block being valid guarantees its parent was found.
316
85.9k
                assert(parent_data_it != block_data.end());
317
85.9k
                const auto& pre_state = parent_data_it->second.post_state;
318
319
85.9k
                auto res = apply_block(pre_state, vm, bi, block_hashes, test_block.transactions,
320
85.9k
                    rev, mining_reward(rev));
321
322
85.9k
                ASSERT_TRUE(res.requests.has_value());
  Branch (322:17): [True: 85.9k, False: 0]
+  Branch (322:17): [True: 0, False: 85.9k]
+  Branch (322:17): [True: 85.9k, False: 0]
+
323
324
85.9k
                block_hashes[test_block.expected_block_header.block_number] =
325
85.9k
                    test_block.expected_block_header.hash;
326
85.9k
                const auto [inserted_it, _] = block_data.insert({test_block.block_info.hash,
327
85.9k
                    {
328
85.9k
                        .header = &test_block.expected_block_header,
329
85.9k
                        .has_ommers = !test_block.block_info.ommers.empty(),
330
85.9k
                        .post_state = std::move(res.block_state),
331
85.9k
                        .total_difficulty = parent_data_it->second.total_difficulty +
332
85.9k
                                            test_block.block_info.difficulty,
333
85.9k
                    }});
334
85.9k
                if (inserted_it->second.total_difficulty >= max_total_difficulty)
  Branch (334:21): [True: 85.9k, False: 0]
+
335
85.9k
                {
336
85.9k
                    canonical_state = &inserted_it->second.post_state;
337
85.9k
                    max_total_difficulty = inserted_it->second.total_difficulty;
338
85.9k
                }
339
340
171k
                
EXPECT_TRUE85.9k
(res.rejected.empty())
  Branch (340:17): [True: 85.9k, False: 0]
+  Branch (340:17): [True: 0, False: 85.9k]
+  Branch (340:17): [True: 85.9k, False: 0]
+
341
171k
                    << "Invalid transaction in block expected to be valid";
342
171k
                
EXPECT_TRUE85.9k
(res.blob_gas_left == 0)
  Branch (342:17): [True: 85.9k, False: 0]
+  Branch (342:17): [True: 0, False: 85.9k]
+  Branch (342:17): [True: 85.9k, False: 0]
+
343
171k
                    << "Transactions used more or less blob gas than expected in block header";
344
345
85.9k
                EXPECT_EQ(state::mpt_hash(inserted_it->second.post_state),
  Branch (345:17): [True: 85.9k, False: 0]
+  Branch (345:17): [True: 0, False: 85.9k]
+  Branch (345:17): [True: 85.9k, False: 0]
+
346
85.9k
                    test_block.expected_block_header.state_root);
347
348
85.9k
                if (rev >= EVMC_SHANGHAI)
  Branch (348:21): [True: 67.3k, False: 18.6k]
+
349
67.3k
                {
350
67.3k
                    EXPECT_EQ(state::mpt_hash(test_block.block_info.withdrawals),
  Branch (350:21): [True: 67.3k, False: 0]
+  Branch (350:21): [True: 0, False: 67.3k]
+  Branch (350:21): [True: 67.3k, False: 0]
+
351
67.3k
                        test_block.expected_block_header.withdrawal_root);
352
67.3k
                }
353
354
85.9k
                EXPECT_EQ(state::mpt_hash(test_block.transactions),
  Branch (354:17): [True: 85.9k, False: 0]
+  Branch (354:17): [True: 0, False: 85.9k]
+  Branch (354:17): [True: 85.9k, False: 0]
+
355
85.9k
                    test_block.expected_block_header.transactions_root);
356
85.9k
                EXPECT_EQ(
  Branch (356:17): [True: 85.9k, False: 0]
+  Branch (356:17): [True: 0, False: 85.9k]
+  Branch (356:17): [True: 85.9k, False: 0]
+
357
85.9k
                    state::mpt_hash(res.receipts), test_block.expected_block_header.receipts_root);
358
85.9k
                if (rev >= EVMC_PRAGUE)
  Branch (358:21): [True: 44.8k, False: 41.1k]
+
359
44.8k
                {
360
44.8k
                    EXPECT_EQ(calculate_requests_hash(*res.requests),
  Branch (360:21): [True: 44.8k, False: 0]
+  Branch (360:21): [True: 0, False: 44.8k]
+  Branch (360:21): [True: 44.8k, False: 0]
+
361
44.8k
                        test_block.expected_block_header.requests_hash);
362
44.8k
                }
363
85.9k
                EXPECT_EQ(res.gas_used, test_block.expected_block_header.gas_used);
  Branch (363:17): [True: 85.9k, False: 0]
+  Branch (363:17): [True: 0, False: 85.9k]
+  Branch (363:17): [True: 85.9k, False: 0]
+
364
85.9k
                EXPECT_EQ(
  Branch (364:17): [True: 85.9k, False: 0]
+  Branch (364:17): [True: 0, False: 85.9k]
+  Branch (364:17): [True: 85.9k, False: 0]
+
365
85.9k
                    bytes_view{res.bloom}, bytes_view{test_block.expected_block_header.logs_bloom});
366
85.9k
            }
367
5.15k
            else
368
5.15k
            {
369
5.15k
                if (!validate_block(rev, blob_params, test_block, parent_header, parent_has_ommers))
  Branch (369:21): [True: 1.32k, False: 3.82k]
+
370
1.32k
                    continue;
371
372
                // Block being valid guarantees its parent was found.
373
5.15k
                assert(parent_data_it != block_data.end());
374
3.82k
                const auto& pre_state = parent_data_it->second.post_state;
375
376
3.82k
                const auto res = apply_block(pre_state, vm, bi, block_hashes,
377
3.82k
                    test_block.transactions, rev, mining_reward(rev));
378
3.82k
                if (!res.requests.has_value())
  Branch (378:21): [True: 60, False: 3.76k]
+
379
60
                    continue;
380
3.76k
                if (!res.rejected.empty())
  Branch (380:21): [True: 3.55k, False: 209]
+
381
3.55k
                    continue;
382
209
                if (res.blob_gas_left != 0)
  Branch (382:21): [True: 111, False: 98]
+
383
111
                    continue;
384
385
98
                if (state::mpt_hash(res.block_state) != test_block.expected_block_header.state_root)
  Branch (385:21): [True: 0, False: 98]
+
386
0
                    continue;
387
388
98
                if (rev >= EVMC_SHANGHAI && state::mpt_hash(test_block.block_info.withdrawals) !=
  Branch (388:21): [True: 12, False: 86]
+  Branch (388:21): [True: 98, False: 0]
+  Branch (388:45): [True: 12, False: 86]
+
389
98
                                                test_block.expected_block_header.withdrawal_root)
  MC/DC Decision Region (388:21) to (389:97)
+
+  Number of Conditions: 2
+     Condition C1 --> (388:21)
+     Condition C2 --> (388:45)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { T,  F  = F      }
+  2 { T,  T  = T      }
+
+  C1-Pair: not covered
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 50.00%
+
390
12
                    continue;
391
86
                if (state::mpt_hash(test_block.transactions) !=
  Branch (391:21): [True: 0, False: 86]
+
392
86
                    test_block.expected_block_header.transactions_root)
393
0
                    continue;
394
86
                if (state::mpt_hash(res.receipts) != test_block.expected_block_header.receipts_root)
  Branch (394:21): [True: 0, False: 86]
+
395
0
                    continue;
396
86
                if (rev >= EVMC_PRAGUE && calculate_requests_hash(*res.requests) !=
  Branch (396:21): [True: 86, False: 0]
+  Branch (396:21): [True: 86, False: 0]
+  Branch (396:43): [True: 86, False: 0]
+
397
86
                                              test_block.expected_block_header.requests_hash)
  MC/DC Decision Region (396:21) to (397:93)
+
+  Number of Conditions: 2
+     Condition C1 --> (396:21)
+     Condition C2 --> (396:43)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { T,  T  = T      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
398
86
                    continue;
399
0
                if (res.gas_used != test_block.expected_block_header.gas_used)
  Branch (399:21): [True: 0, False: 0]
+
400
0
                    continue;
401
0
                if (bytes_view{res.bloom} !=
  Branch (401:21): [True: 0, False: 0]
+
402
0
                    bytes_view{test_block.expected_block_header.logs_bloom})
403
0
                    continue;
404
405
0
                EXPECT_TRUE(false) << "Expected block to be invalid but resulted valid";
  Branch (405:17): [True: 0, False: 0]
+  Branch (405:17): [True: 0, False: 0]
+  Branch (405:17): [True: 0, False: 0]
+
406
0
            }
407
91.1k
        }
408
69.5k
        const auto expected_post_hash =
409
69.5k
            std::holds_alternative<TestState>(c.expectation.post_state) ?
  Branch (409:13): [True: 69.5k, False: 0]
+
410
69.5k
                state::mpt_hash(std::get<TestState>(c.expectation.post_state)) :
411
69.5k
                
std::get<hash256>(c.expectation.post_state)0
;
412
139k
        
EXPECT_EQ69.5k
(state::mpt_hash(*canonical_state), expected_post_hash)
  Branch (412:9): [True: 69.5k, False: 0]
+  Branch (412:9): [True: 0, False: 69.5k]
+  Branch (412:9): [True: 69.5k, False: 0]
+
413
139k
            << "Result state:\n"
414
139k
            << print_state(*canonical_state)
415
139k
            << (
std::holds_alternative<TestState>(c.expectation.post_state)0
?
  Branch (415:17): [True: 0, False: 0]
+
416
0
                       "\n\nExpected state:\n" +
417
0
                           print_state(std::get<TestState>(c.expectation.post_state)) :
418
139k
                       
""0
);
419
69.5k
    }
420
2.81k
}
421
422
}  // namespace evmone::test
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/account.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/account.hpp.html new file mode 100644 index 0000000000..7fcac2f419 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/account.hpp.html @@ -0,0 +1,23 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/account.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2021 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <evmc/evmc.hpp>
7
#include <intx/intx.hpp>
8
#include <unordered_map>
9
10
namespace evmone::state
11
{
12
using evmc::address;
13
using evmc::bytes;
14
using evmc::bytes32;
15
using namespace evmc::literals;
16
17
/// The representation of the account storage value.
18
struct StorageValue
19
{
20
    /// The current value.
21
    bytes32 current;
22
23
    /// The original value.
24
    bytes32 original;
25
26
    evmc_access_status access_status = EVMC_ACCESS_COLD;
27
};
28
29
/// The state account.
30
struct Account
31
{
32
    /// The maximum allowed nonce value.
33
    static constexpr auto NonceMax = std::numeric_limits<uint64_t>::max();
34
35
    /// The keccak256 hash of the empty input. Used to identify empty account's code.
36
    static constexpr auto EMPTY_CODE_HASH =
37
        0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470_bytes32;
38
39
    /// The account nonce.
40
    uint64_t nonce = 0;
41
42
    /// The account balance.
43
    intx::uint256 balance;
44
45
    bytes32 code_hash = EMPTY_CODE_HASH;
46
47
    /// If the account has non-empty initial storage (when accessing the cold account).
48
    bool has_initial_storage = false;
49
50
    /// The cached and modified account storage entries.
51
    std::unordered_map<bytes32, StorageValue> storage;
52
53
    /// The EIP-1153 transient (transaction-level lifetime) storage.
54
    std::unordered_map<bytes32, bytes32> transient_storage;
55
56
    /// The cache of the account code.
57
    ///
58
    /// Check code_hash to know if an account code is empty.
59
    /// Empty here only means it has not been loaded from the initial storage.
60
    bytes code;
61
62
    /// The account has been destructed and should be erased at the end of a transaction.
63
    bool destructed = false;
64
65
    /// The account should be erased if it is empty at the end of a transaction.
66
    /// This flag means the account has been "touched" as defined in EIP-161,
67
    /// or it is a newly created temporary account.
68
    ///
69
    /// Yellow Paper uses term "delete" but it is a keyword in C++ while
70
    /// the term "erase" is used for deleting objects from C++ collections.
71
    bool erase_if_empty = false;
72
73
    /// The account has been created in the current transaction.
74
    bool just_created = false;
75
76
    // This account's code has been modified.
77
    bool code_changed = false;
78
79
    evmc_access_status access_status = EVMC_ACCESS_COLD;
80
81
    [[nodiscard]] bool is_empty() const noexcept
82
2.32M
    {
83
2.32M
        return nonce == 0 && 
balance == 01.98M
&&
code_hash == EMPTY_CODE_HASH1.03M
;
  Branch (83:16): [True: 1.98M, False: 345k]
+  Branch (83:30): [True: 1.03M, False: 942k]
+  Branch (83:46): [True: 306k, False: 730k]
+
  MC/DC Decision Region (83:16) to (83:74)
+
+  Number of Conditions: 3
+     Condition C1 --> (83:16)
+     Condition C2 --> (83:30)
+     Condition C3 --> (83:46)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  F,  -  = F      }
+  3 { T,  T,  F  = F      }
+  4 { T,  T,  T  = T      }
+
+  C1-Pair: covered: (1,4)
+  C2-Pair: covered: (2,4)
+  C3-Pair: covered: (3,4)
+  MC/DC Coverage for Expression: 100.00%
+
84
2.32M
    }
85
};
86
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/block.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/block.cpp.html new file mode 100644 index 0000000000..edd0af618e --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/block.cpp.html @@ -0,0 +1,25 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/block.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "block.hpp"
6
#include "transaction.hpp"
7
8
namespace evmone::state
9
{
10
static constexpr auto GAS_LIMIT_ELASTICITY_MULTIPLIER = 2;
11
static constexpr auto BASE_FEE_MAX_CHANGE_DENOMINATOR = 8;
12
13
uint64_t calc_base_fee(
14
    int64_t parent_gas_limit, int64_t parent_gas_used, uint64_t parent_base_fee) noexcept
15
77.8k
{
16
77.8k
    auto parent_gas_target = parent_gas_limit / GAS_LIMIT_ELASTICITY_MULTIPLIER;
17
18
    // Special logic for block activating EIP-1559 is not implemented, because test don't cover it.
19
77.8k
    if (parent_gas_used == parent_gas_target)
  Branch (19:9): [True: 672, False: 77.2k]
+
20
672
    {
21
672
        return parent_base_fee;
22
672
    }
23
77.2k
    else if (parent_gas_used > parent_gas_target)
  Branch (23:14): [True: 15, False: 77.2k]
+
24
15
    {
25
15
        const auto gas_used_delta = parent_gas_used - parent_gas_target;
26
15
        const auto base_fee_delta =
27
15
            std::max(intx::uint256{parent_base_fee} * gas_used_delta / parent_gas_target /
28
15
                         BASE_FEE_MAX_CHANGE_DENOMINATOR,
29
15
                intx::uint256{1});
30
15
        return parent_base_fee + static_cast<uint64_t>(base_fee_delta);
31
15
    }
32
77.2k
    else
33
77.2k
    {
34
77.2k
        const auto gas_used_delta = parent_gas_target - parent_gas_used;
35
77.2k
        const auto base_fee_delta = intx::uint256{parent_base_fee} * gas_used_delta /
36
77.2k
                                    parent_gas_target / BASE_FEE_MAX_CHANGE_DENOMINATOR;
37
77.2k
        return parent_base_fee - static_cast<uint64_t>(base_fee_delta);
38
77.2k
    }
39
77.8k
}
40
41
uint64_t max_blob_gas_per_block(const BlobParams& blob_params) noexcept
42
130k
{
43
130k
    return blob_params.max * GAS_PER_BLOB;
44
130k
}
45
46
47
intx::uint256 compute_blob_gas_price(
48
    const BlobParams& blob_params, uint64_t excess_blob_gas) noexcept
49
200k
{
50
    /// A helper function approximating `factor * e ** (numerator / denominator)`.
51
    /// https://eips.ethereum.org/EIPS/eip-4844#helpers
52
200k
    static constexpr auto fake_exponential = [](uint64_t factor, uint64_t numerator,
53
200k
                                                 uint64_t denominator) noexcept {
54
200k
        intx::uint256 i = 1;
55
200k
        intx::uint256 output = 0;
56
200k
        intx::uint256 numerator_accum = factor * denominator;
57
200k
        const intx::uint256 numerator256 = numerator;
58
507k
        while (numerator_accum > 0)
  Branch (58:16): [True: 307k, False: 199k]
+
59
307k
        {
60
307k
            output += numerator_accum;
61
            // Ensure the multiplication won't overflow 256 bits.
62
307k
            if (const auto p = intx::umul(numerator_accum, numerator256);
63
307k
                p <= std::numeric_limits<intx::uint256>::max())
  Branch (63:17): [True: 307k, False: 480]
+
64
307k
                numerator_accum = intx::uint256(p) / (denominator * i);
65
480
            else
66
480
                return std::numeric_limits<intx::uint256>::max();
67
307k
            i += 1;
68
307k
        }
69
199k
        return output / denominator;
70
200k
    };
71
72
200k
    static constexpr auto MIN_BLOB_GASPRICE = 1;
73
200k
    const auto fraction = blob_params.base_fee_update_fraction;
74
200k
    return fake_exponential(MIN_BLOB_GASPRICE, excess_blob_gas, fraction);
75
200k
}
76
77
uint64_t calc_excess_blob_gas(evmc_revision rev, const BlobParams& blob_params,
78
    uint64_t parent_blob_gas_used, uint64_t parent_excess_blob_gas, uint64_t parent_base_fee,
79
    const intx::uint256& parent_blob_base_fee) noexcept
80
68.1k
{
81
    /// The base cost of a blob (EIP-7918).
82
68.1k
    constexpr auto BLOB_BASE_COST = 0x2000;
83
84
68.1k
    const auto target_blob_gas_per_block = uint64_t{blob_params.target} * GAS_PER_BLOB;
85
68.1k
    if (parent_excess_blob_gas + parent_blob_gas_used < target_blob_gas_per_block)
  Branch (85:9): [True: 60.4k, False: 7.70k]
+
86
60.4k
        return 0;
87
88
7.70k
    if (rev >= EVMC_OSAKA && 
BLOB_BASE_COST * parent_base_fee > GAS_PER_BLOB * parent_blob_base_fee2.85k
)
  Branch (88:9): [True: 201, False: 7.50k]
+  Branch (88:9): [True: 2.85k, False: 4.84k]
+  Branch (88:30): [True: 201, False: 2.65k]
+
  MC/DC Decision Region (88:9) to (88:100)
+
+  Number of Conditions: 2
+     Condition C1 --> (88:9)
+     Condition C2 --> (88:30)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
89
201
        return parent_excess_blob_gas +
90
201
               parent_blob_gas_used * (blob_params.max - blob_params.target) / blob_params.max;
91
92
7.50k
    return parent_excess_blob_gas + parent_blob_gas_used - target_blob_gas_per_block;
93
7.70k
}
94
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/block.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/block.hpp.html new file mode 100644 index 0000000000..0fa5fdc057 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/block.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/block.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include "blob_params.hpp"
8
#include "hash_utils.hpp"
9
#include <intx/intx.hpp>
10
#include <vector>
11
12
namespace evmone::state
13
{
14
struct Ommer
15
{
16
    address beneficiary;  ///< Ommer block beneficiary address.
17
    uint32_t delta = 0;   ///< Difference between current and ommer block number.
18
};
19
20
struct Withdrawal
21
{
22
    uint64_t index = 0;
23
    uint64_t validator_index = 0;
24
    address recipient;
25
    uint64_t amount_in_gwei = 0;  ///< The amount is denominated in gwei.
26
27
    /// Returns withdrawal amount in wei.
28
    [[nodiscard]] intx::uint256 get_amount() const noexcept
29
4.16k
    {
30
4.16k
        return intx::uint256{amount_in_gwei} * 1'000'000'000;
31
4.16k
    }
32
};
33
34
struct BlockInfo
35
{
36
    int64_t number = 0;
37
    int64_t timestamp = 0;
38
    hash256 hash;
39
    hash256 parent_hash;
40
    int64_t parent_timestamp = 0;
41
    int64_t gas_limit = 0;
42
    int64_t gas_used = 0;
43
    address coinbase;
44
    int64_t difficulty = 0;
45
    int64_t parent_difficulty = 0;
46
    bytes extra_data;
47
    hash256 parent_ommers_hash;
48
    bytes32 prev_randao;
49
    hash256 parent_beacon_block_root;
50
51
    /// The EIP-1559 base fee, since London.
52
    uint64_t base_fee = 0;
53
54
    /// The "blob gas used" parameter from EIP-4844
55
    std::optional<uint64_t> blob_gas_used;
56
57
    /// The "excess blob gas" parameter from EIP-4844
58
    /// for computing the blob gas price in the current block.
59
    std::optional<uint64_t> excess_blob_gas;
60
61
    /// Blob gas price from EIP-4844, computed from excess_blob_gas.
62
    std::optional<intx::uint256> blob_base_fee;
63
64
    std::vector<Ommer> ommers;
65
    std::vector<Withdrawal> withdrawals;
66
};
67
68
/// Base fee per gas for the block.
69
uint64_t calc_base_fee(
70
    int64_t parent_gas_limit, int64_t parent_gas_used, uint64_t parent_base_fee) noexcept;
71
72
/// Max amount of blob gas allowed in block.
73
uint64_t max_blob_gas_per_block(const BlobParams& blob_params) noexcept;
74
75
/// Computes the current blob gas price based on the excess blob gas.
76
intx::uint256 compute_blob_gas_price(
77
    const BlobParams& blob_params, uint64_t excess_blob_gas) noexcept;
78
79
/// Computes the current excess blob gas based on parameters of the parent block.
80
uint64_t calc_excess_blob_gas(evmc_revision rev, const BlobParams& blob_params,
81
    uint64_t parent_blob_gas_used, uint64_t parent_excess_blob_gas, uint64_t parent_base_fee,
82
    const intx::uint256& parent_blob_base_fee) noexcept;
83
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/bloom_filter.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/bloom_filter.cpp.html new file mode 100644 index 0000000000..f5286f6c92 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/bloom_filter.cpp.html @@ -0,0 +1,5 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/bloom_filter.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "bloom_filter.hpp"
6
#include "transaction.hpp"
7
8
namespace evmone::state
9
{
10
11
namespace
12
{
13
/// Adds an entry to the bloom filter.
14
/// based on
15
/// https://ethereum.github.io/execution-specs/autoapi/ethereum/shanghai/bloom/index.html#add-to-bloom
16
inline void add_to(BloomFilter& bf, const bytes_view& entry)
17
69.1k
{
18
69.1k
    const auto hash = keccak256(entry);
19
20
    // take the least significant 11-bits of the first three 16-bit values
21
69.1k
    for (const auto i : {0, 2, 4})
  Branch (21:23): [True: 207k, False: 69.1k]
+
22
207k
    {
23
207k
        const auto bit_to_set = ((hash.bytes[i] & 0x07) << 8) | hash.bytes[i + 1];
24
207k
        const auto bit_index = 0x07FF - bit_to_set;
25
207k
        const auto byte_index = bit_index / 8;
26
207k
        const auto bit_pos = static_cast<uint8_t>(1 << (7 - (bit_index % 8)));
27
207k
        bf.bytes[byte_index] |= bit_pos;
28
207k
    }
29
69.1k
}
30
31
}  // namespace
32
33
BloomFilter compute_bloom_filter(std::span<const Log> logs) noexcept
34
148k
{
35
148k
    BloomFilter res;
36
148k
    for (const auto& log : logs)
  Branch (36:26): [True: 28.6k, False: 148k]
+
37
28.6k
    {
38
28.6k
        add_to(res, log.addr);
39
28.6k
        for (const auto& topic : log.topics)
  Branch (39:32): [True: 40.4k, False: 28.6k]
+
40
40.4k
            add_to(res, topic);
41
28.6k
    }
42
43
148k
    return res;
44
148k
}
45
46
BloomFilter compute_bloom_filter(std::span<const TransactionReceipt> receipts) noexcept
47
89.8k
{
48
89.8k
    BloomFilter res;
49
50
89.8k
    for (const auto& r : receipts)
  Branch (50:24): [True: 87.9k, False: 89.8k]
+
51
87.9k
        std::transform(
52
87.9k
            res.bytes, std::end(res.bytes), r.logs_bloom_filter.bytes, res.bytes, std::bit_or<>());
53
54
89.8k
    return res;
55
89.8k
}
56
57
BloomFilter bloom_filter_from_bytes(const bytes_view& data) noexcept
58
160k
{
59
    assert(data.size() == 256);
60
160k
    BloomFilter res;
61
160k
    std::ranges::copy(data, res.bytes);
62
160k
    return res;
63
160k
}
64
65
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/bloom_filter.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/bloom_filter.hpp.html new file mode 100644 index 0000000000..7d98010a9b --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/bloom_filter.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/bloom_filter.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
#include "hash_utils.hpp"
7
#include <span>
8
9
namespace evmone::state
10
{
11
struct Log;
12
struct TransactionReceipt;
13
14
/// The 2048-bit hash suitable for keeping an Ethereum bloom filter of transactions logs.
15
struct BloomFilter
16
{
17
    //// The 256 bytes of the bloom filter value.
18
    uint8_t bytes[256] = {};
19
20
    /// Implicit operator converting to bytes_view.
21
397k
    constexpr operator bytes_view() const noexcept { return {bytes, sizeof(bytes)}; }
22
};
23
24
/// Computes combined bloom fitter for set of logs.
25
/// It's used to compute bloom filter for single transaction.
26
[[nodiscard]] BloomFilter compute_bloom_filter(std::span<const Log> logs) noexcept;
27
28
/// Computes combined bloom fitter for set of TransactionReceipts
29
/// It's used to compute bloom filter for a block.
30
[[nodiscard]] BloomFilter compute_bloom_filter(
31
    std::span<const TransactionReceipt> receipts) noexcept;
32
33
/// Loads BloomFilter from bytes_view
34
BloomFilter bloom_filter_from_bytes(const bytes_view& data) noexcept;
35
36
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/errors.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/errors.hpp.html new file mode 100644 index 0000000000..d995a6ca7f --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/errors.hpp.html @@ -0,0 +1,23 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/errors.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <cassert>
7
#include <system_error>
8
9
namespace evmone::state
10
{
11
12
enum ErrorCode : int  // NOLINT(*-use-enum-class)
13
{
14
    SUCCESS = 0,
15
    INTRINSIC_GAS_TOO_LOW,
16
    TX_TYPE_NOT_SUPPORTED,
17
    INSUFFICIENT_FUNDS,
18
    NONCE_HAS_MAX_VALUE,
19
    NONCE_TOO_HIGH,
20
    NONCE_TOO_LOW,
21
    TIP_GT_FEE_CAP,
22
    FEE_CAP_LESS_THAN_BLOCKS,
23
    BLOB_FEE_CAP_LESS_THAN_BLOCKS,
24
    GAS_LIMIT_REACHED,
25
    SENDER_NOT_EOA,
26
    INIT_CODE_SIZE_LIMIT_EXCEEDED,
27
    CREATE_BLOB_TX,
28
    EMPTY_BLOB_HASHES_LIST,
29
    INVALID_BLOB_HASH_VERSION,
30
    BLOB_GAS_LIMIT_EXCEEDED,
31
    CREATE_SET_CODE_TX,
32
    EMPTY_AUTHORIZATION_LIST,
33
    MAX_GAS_LIMIT_EXCEEDED,
34
    UNKNOWN_ERROR,
35
};
36
37
/// Obtains a reference to the static error category object for evmone errors.
38
inline const std::error_category& evmone_category() noexcept
39
6.63k
{
40
6.63k
    struct Category : std::error_category
41
6.63k
    {
42
6.63k
        [[nodiscard]] const char* name() const noexcept final 
{ return "evmone"; }0
43
44
6.63k
        [[nodiscard]] std::string message(int ev) const noexcept final
45
6.63k
        {
46
3.57k
            switch (ev)
47
3.57k
            {
48
0
            case SUCCESS:
  Branch (48:13): [True: 0, False: 3.57k]
+
49
0
                return "";
50
2.18k
            case INTRINSIC_GAS_TOO_LOW:
  Branch (50:13): [True: 2.18k, False: 1.39k]
+
51
2.18k
                return "intrinsic gas too low";
52
17
            case TX_TYPE_NOT_SUPPORTED:
  Branch (52:13): [True: 17, False: 3.55k]
+
53
17
                return "transaction type not supported";
54
1.10k
            case INSUFFICIENT_FUNDS:
  Branch (54:13): [True: 1.10k, False: 2.47k]
+
55
1.10k
                return "insufficient funds for gas * price + value";
56
6
            case NONCE_HAS_MAX_VALUE:
  Branch (56:13): [True: 6, False: 3.56k]
+
57
6
                return "nonce has max value:";
58
12
            case NONCE_TOO_HIGH:
  Branch (58:13): [True: 12, False: 3.56k]
+
59
12
                return "nonce too high";
60
2
            case NONCE_TOO_LOW:
  Branch (60:13): [True: 2, False: 3.57k]
+
61
2
                return "nonce too low";
62
5
            case TIP_GT_FEE_CAP:
  Branch (62:13): [True: 5, False: 3.57k]
+
63
5
                return "max priority fee per gas higher than max fee per gas";
64
14
            case FEE_CAP_LESS_THAN_BLOCKS:
  Branch (64:13): [True: 14, False: 3.56k]
+
65
14
                return "max fee per gas less than block base fee";
66
6
            case BLOB_FEE_CAP_LESS_THAN_BLOCKS:
  Branch (66:13): [True: 6, False: 3.56k]
+
67
6
                return "max blob fee per gas less than block base fee";
68
4
            case GAS_LIMIT_REACHED:
  Branch (68:13): [True: 4, False: 3.57k]
+
69
4
                return "gas limit reached";
70
37
            case SENDER_NOT_EOA:
  Branch (70:13): [True: 37, False: 3.53k]
+
71
37
                return "sender not an eoa:";
72
11
            case INIT_CODE_SIZE_LIMIT_EXCEEDED:
  Branch (72:13): [True: 11, False: 3.56k]
+
73
11
                return "max initcode size exceeded";
74
3
            case CREATE_BLOB_TX:
  Branch (74:13): [True: 3, False: 3.57k]
+
75
3
                return "blob transaction must not be a create transaction";
76
6
            case EMPTY_BLOB_HASHES_LIST:
  Branch (76:13): [True: 6, False: 3.56k]
+
77
6
                return "empty blob hashes list";
78
27
            case INVALID_BLOB_HASH_VERSION:
  Branch (78:13): [True: 27, False: 3.54k]
+
79
27
                return "invalid blob hash version";
80
123
            case BLOB_GAS_LIMIT_EXCEEDED:
  Branch (80:13): [True: 123, False: 3.45k]
+
81
123
                return "blob gas limit exceeded";
82
2
            case CREATE_SET_CODE_TX:
  Branch (82:13): [True: 2, False: 3.57k]
+
83
2
                return "set code transaction must not be a create transaction";
84
2
            case EMPTY_AUTHORIZATION_LIST:
  Branch (84:13): [True: 2, False: 3.57k]
+
85
2
                return "empty authorization list";
86
11
            case MAX_GAS_LIMIT_EXCEEDED:
  Branch (86:13): [True: 11, False: 3.56k]
+
87
11
                return "max gas limit exceeded";
88
0
            case UNKNOWN_ERROR:
  Branch (88:13): [True: 0, False: 3.57k]
+
89
0
                return "Unknown error";
90
0
            default:
  Branch (90:13): [True: 0, False: 3.57k]
+
91
0
                assert(false);
92
0
                return "Wrong error code";
93
3.57k
            }
94
3.57k
        }
95
6.63k
    };
96
97
6.63k
    static const Category category_instance;
98
6.63k
    return category_instance;
99
6.63k
}
100
101
/// Creates error_code object out of an evmone error code value.
102
/// This is used by std::error_code to implement implicit conversion
103
/// evmone::ErrorCode -> std::error_code, therefore the definition is
104
/// in the global namespace to match the definition of ethash_errc.
105
inline std::error_code make_error_code(ErrorCode errc) noexcept
106
6.63k
{
107
6.63k
    return {errc, evmone_category()};
108
6.63k
}
109
110
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/ethash_difficulty.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/ethash_difficulty.cpp.html new file mode 100644 index 0000000000..8c0fcbf6b6 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/ethash_difficulty.cpp.html @@ -0,0 +1,16 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/ethash_difficulty.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "ethash_difficulty.hpp"
6
#include <algorithm>
7
#include <cassert>
8
9
namespace evmone::state
10
{
11
namespace
12
{
13
int64_t get_bomb_delay(evmc_revision rev) noexcept
14
13.7k
{
15
13.7k
    switch (rev)
16
13.7k
    {
17
0
    default:
  Branch (17:5): [True: 0, False: 13.7k]
+
18
0
        return 0;
19
1.80k
    case EVMC_BYZANTIUM:
  Branch (19:5): [True: 1.80k, False: 11.9k]
+
20
1.80k
        return 3'000'000;
21
1.98k
    case EVMC_CONSTANTINOPLE:
  Branch (21:5): [True: 1.98k, False: 11.7k]
+
22
3.97k
    case EVMC_PETERSBURG:
  Branch (22:5): [True: 1.99k, False: 11.7k]
+
23
6.11k
    case EVMC_ISTANBUL:
  Branch (23:5): [True: 2.13k, False: 11.5k]
+
24
6.11k
        return 5'000'000;
25
2.77k
    case EVMC_BERLIN:
  Branch (25:5): [True: 2.77k, False: 10.9k]
+
26
2.77k
        return 9'000'000;
27
3.03k
    case EVMC_LONDON:
  Branch (27:5): [True: 3.03k, False: 10.6k]
+
28
3.03k
        return 9'700'000;
29
13.7k
    }
30
13.7k
}
31
32
int64_t calculate_difficulty_pre_byzantium(int64_t parent_difficulty, int64_t parent_timestamp,
33
    int64_t current_timestamp, int64_t block_number, evmc_revision rev)
34
2.46k
{
35
    // According to https://eips.ethereum.org/EIPS/eip-2
36
2.46k
    const auto period_count = block_number / 100'000;
37
2.46k
    const auto offset = parent_difficulty / 2048;
38
39
2.46k
    auto diff = parent_difficulty;
40
41
2.46k
    if (rev < EVMC_HOMESTEAD)
  Branch (41:9): [True: 1.10k, False: 1.35k]
+
42
1.10k
        diff += offset * (current_timestamp - parent_timestamp < 13 ? 
1744
:
-1363
);
  Branch (42:27): [True: 744, False: 363]
+
43
1.35k
    else
44
1.35k
        diff += offset * std::max(1 - (current_timestamp - parent_timestamp) / 10, int64_t{-99});
45
46
2.46k
    if (period_count > 2)
  Branch (46:9): [True: 0, False: 2.46k]
+
47
0
        diff += 2 << (block_number / 100'000 - 3);
48
2.46k
    else if (period_count == 2)
  Branch (48:14): [True: 0, False: 2.46k]
+
49
0
        diff += 1;
50
51
2.46k
    return diff;
52
2.46k
}
53
54
int64_t calculate_difficulty_since_byzantium(int64_t parent_difficulty, bool parent_has_ommers,
55
    int64_t parent_timestamp, int64_t current_timestamp, int64_t block_number,
56
    evmc_revision rev) noexcept
57
13.7k
{
58
13.7k
    const auto delay = get_bomb_delay(rev);
59
13.7k
    const auto fake_block_number = std::max(int64_t{0}, block_number - delay);
60
13.7k
    const auto p = (fake_block_number / 100'000) - 2;
61
13.7k
    assert(p < 63);
62
13.7k
    const auto epsilon = p < 0 ? 0 : 
int64_t{1} << p0
;
  Branch (62:26): [True: 13.7k, False: 0]
+
63
13.7k
    const auto y = parent_has_ommers ? 
20
: 1;
  Branch (63:20): [True: 0, False: 13.7k]
+
64
65
13.7k
    const auto timestamp_diff = current_timestamp - parent_timestamp;
66
13.7k
    assert(timestamp_diff > 0);
67
13.7k
    const auto sigma_2 = std::max(y - timestamp_diff / 9, int64_t{-99});
68
13.7k
    const auto x = parent_difficulty / 2048;
69
13.7k
    return parent_difficulty + x * sigma_2 + epsilon;
70
13.7k
}
71
}  // namespace
72
73
int64_t calculate_difficulty(int64_t parent_difficulty, bool parent_has_ommers,
74
    int64_t parent_timestamp, int64_t current_timestamp, int64_t block_number,
75
    evmc_revision rev) noexcept
76
91.0k
{
77
    // The calculation follows Ethereum Yellow Paper section 4.3.4. "Block Header Validity".
78
91.0k
    static constexpr int64_t MIN_DIFFICULTY = 0x20000;
79
80
91.0k
    if (rev >= EVMC_PARIS)
  Branch (80:9): [True: 74.8k, False: 16.1k]
+
81
74.8k
        return 0;  // No difficulty after the Merge.
82
83
16.1k
    const auto difficulty =
84
16.1k
        (rev < EVMC_BYZANTIUM) ?
  Branch (84:9): [True: 2.46k, False: 13.7k]
+
85
2.46k
            calculate_difficulty_pre_byzantium(
86
2.46k
                parent_difficulty, parent_timestamp, current_timestamp, block_number, rev) :
87
16.1k
            calculate_difficulty_since_byzantium(parent_difficulty, parent_has_ommers,
88
13.7k
                parent_timestamp, current_timestamp, block_number, rev);
89
90
16.1k
    return std::max(MIN_DIFFICULTY, difficulty);
91
91.0k
}
92
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/hash_utils.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/hash_utils.hpp.html new file mode 100644 index 0000000000..208a23079b --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/hash_utils.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/hash_utils.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include <evmc/evmc.hpp>
8
#include <evmc/hex.hpp>
9
#include <evmone_precompiles/keccak.hpp>
10
#include <bit>
11
12
namespace evmone
13
{
14
using evmc::address;
15
using evmc::bytes;
16
using evmc::bytes32;
17
using evmc::bytes_view;
18
using namespace evmc::literals;
19
20
/// Default type for 256-bit hash.
21
///
22
/// Better than ethash::hash256 because has some additional handy constructors.
23
using hash256 = bytes32;
24
25
/// The hash of the empty RLP list, i.e. keccak256({0xc0}).
26
static constexpr auto EmptyListHash =
27
    0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347_bytes32;
28
29
/// Computes Keccak hash out of input bytes (wrapper of ethash::keccak256).
30
inline hash256 keccak256(bytes_view data) noexcept
31
44.0M
{
32
44.0M
    return std::bit_cast<hash256>(ethash::keccak256(data.data(), data.size()));
33
44.0M
}
34
}  // namespace evmone
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/host.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/host.cpp.html new file mode 100644 index 0000000000..940fc2848c --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/host.cpp.html @@ -0,0 +1,331 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/host.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "host.hpp"
6
#include "precompiles.hpp"
7
#include <evmone/constants.hpp>
8
9
namespace evmone::state
10
{
11
bool Host::account_exists(const address& addr) const noexcept
12
60.4k
{
13
60.4k
    const auto* const acc = m_state.find(addr);
14
60.4k
    return acc != nullptr && 
(60.0k
m_rev < EVMC_SPURIOUS_DRAGON60.0k
||
!acc->is_empty()49.4k
);
  Branch (14:12): [True: 60.0k, False: 335]
+  Branch (14:31): [True: 10.6k, False: 49.4k]
+  Branch (14:63): [True: 47.7k, False: 1.66k]
+
  MC/DC Decision Region (14:12) to (14:80)
+
+  Number of Conditions: 3
+     Condition C1 --> (14:12)
+     Condition C2 --> (14:31)
+     Condition C3 --> (14:63)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  F,  F  = F      }
+  3 { T,  F,  T  = T      }
+  4 { T,  T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,4)
+  C3-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
15
60.4k
}
16
17
bytes32 Host::get_storage(const address& addr, const bytes32& key) const noexcept
18
943k
{
19
943k
    return m_state.get_storage(addr, key).current;
20
943k
}
21
22
evmc_storage_status Host::set_storage(
23
    const address& addr, const bytes32& key, const bytes32& value) noexcept
24
4.33M
{
25
    // Follow EVMC documentation https://evmc.ethereum.org/storagestatus.html#autotoc_md3
26
    // and EIP-2200 specification https://eips.ethereum.org/EIPS/eip-2200.
27
28
4.33M
    auto& storage_slot = m_state.get_storage(addr, key);
29
4.33M
    const auto& [current, original, _] = storage_slot;
30
31
4.33M
    const auto dirty = original != current;
32
4.33M
    const auto restored = original == value;
33
4.33M
    const auto current_is_zero = is_zero(current);
34
4.33M
    const auto value_is_zero = is_zero(value);
35
36
4.33M
    auto status = EVMC_STORAGE_ASSIGNED;  // All other cases.
37
4.33M
    if (!dirty && 
!restored2.93M
)
  Branch (37:9): [True: 2.93M, False: 1.39M]
+  Branch (37:19): [True: 1.31M, False: 1.62M]
+
  MC/DC Decision Region (37:9) to (37:28)
+
+  Number of Conditions: 2
+     Condition C1 --> (37:9)
+     Condition C2 --> (37:19)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
38
1.31M
    {
39
1.31M
        if (current_is_zero)
  Branch (39:13): [True: 1.21M, False: 97.5k]
+
40
1.21M
            status = EVMC_STORAGE_ADDED;  // 0 → 0 → Z
41
97.5k
        else if (value_is_zero)
  Branch (41:18): [True: 45.5k, False: 52.0k]
+
42
45.5k
            status = EVMC_STORAGE_DELETED;  // X → X → 0
43
52.0k
        else
44
52.0k
            status = EVMC_STORAGE_MODIFIED;  // X → X → Z
45
1.31M
    }
46
3.01M
    else if (dirty && 
!restored1.39M
)
  Branch (46:14): [True: 1.39M, False: 1.62M]
+  Branch (46:23): [True: 636k, False: 754k]
+
  MC/DC Decision Region (46:14) to (46:32)
+
+  Number of Conditions: 2
+     Condition C1 --> (46:14)
+     Condition C2 --> (46:23)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
47
636k
    {
48
636k
        if (current_is_zero && 
!value_is_zero2.53k
)
  Branch (48:13): [True: 2.53k, False: 634k]
+  Branch (48:32): [True: 48, False: 2.48k]
+
  MC/DC Decision Region (48:13) to (48:46)
+
+  Number of Conditions: 2
+     Condition C1 --> (48:13)
+     Condition C2 --> (48:32)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
49
48
            status = EVMC_STORAGE_DELETED_ADDED;  // X → 0 → Z
50
636k
        else if (!current_is_zero && 
value_is_zero634k
)
  Branch (50:18): [True: 634k, False: 2.48k]
+  Branch (50:38): [True: 222, False: 634k]
+
  MC/DC Decision Region (50:18) to (50:51)
+
+  Number of Conditions: 2
+     Condition C1 --> (50:18)
+     Condition C2 --> (50:38)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
51
222
            status = EVMC_STORAGE_MODIFIED_DELETED;  // X → Y → 0
52
636k
    }
53
2.38M
    else if (dirty)
  Branch (53:14): [True: 754k, False: 1.62M]
+
54
754k
    {
55
754k
        assert(restored);  // Always true.
56
754k
        if (current_is_zero)
  Branch (56:13): [True: 72, False: 754k]
+
57
72
            status = EVMC_STORAGE_DELETED_RESTORED;  // X → 0 → X
58
754k
        else if (value_is_zero)
  Branch (58:18): [True: 754k, False: 24]
+
59
754k
            status = EVMC_STORAGE_ADDED_DELETED;  // 0 → Y → 0
60
24
        else
61
24
            status = EVMC_STORAGE_MODIFIED_RESTORED;  // X → Y → X
62
754k
    }
63
64
    // In Berlin this is handled in access_storage().
65
4.33M
    if (m_rev < EVMC_BERLIN)
  Branch (65:9): [True: 51.2k, False: 4.27M]
+
66
51.2k
        m_state.journal_storage_change(addr, key, storage_slot);
67
4.33M
    storage_slot.current = value;  // Update current value.
68
4.33M
    return status;
69
4.33M
}
70
71
uint256be Host::get_balance(const address& addr) const noexcept
72
80.5k
{
73
80.5k
    const auto* const acc = m_state.find(addr);
74
80.5k
    return (acc != nullptr) ? 
intx::be::store<uint256be>(acc->balance)80.5k
:
uint256be{}15
;
  Branch (74:12): [True: 80.5k, False: 15]
+
75
80.5k
}
76
77
namespace
78
{
79
/// Check if an existing account is the "create collision"
80
/// as defined in the [EIP-7610](https://eips.ethereum.org/EIPS/eip-7610).
81
[[nodiscard]] bool is_create_collision(const Account& acc) noexcept
82
68.5k
{
83
    // TODO: This requires much more testing:
84
    // - what if an account had storage but is destructed?
85
    // - what if an account had cold storage but it was emptied?
86
    // - what if an account without cold storage gain one?
87
68.5k
    if (acc.nonce != 0)
  Branch (87:9): [True: 368, False: 68.1k]
+
88
368
        return true;
89
68.1k
    if (acc.code_hash != Account::EMPTY_CODE_HASH)
  Branch (89:9): [True: 312, False: 67.8k]
+
90
312
        return true;
91
67.8k
    if (acc.has_initial_storage)
  Branch (91:9): [True: 178, False: 67.6k]
+
92
178
        return true;
93
94
    // The hot storage is ignored because it can contain elements from access list.
95
    // TODO: Is this correct for destructed accounts?
96
67.8k
    assert(!acc.destructed && "untested");
97
67.6k
    return false;
98
67.8k
}
99
}  // namespace
100
101
size_t Host::get_code_size(const address& addr) const noexcept
102
471k
{
103
471k
    const auto raw_code = m_state.get_code(addr);
104
471k
    return raw_code.size();
105
471k
}
106
107
bytes32 Host::get_code_hash(const address& addr) const noexcept
108
3.41k
{
109
3.41k
    const auto* const acc = m_state.find(addr);
110
3.41k
    if (acc == nullptr || 
acc->is_empty()3.41k
)
  Branch (110:9): [True: 6, False: 3.41k]
+  Branch (110:27): [True: 688, False: 2.72k]
+
  MC/DC Decision Region (110:9) to (110:42)
+
+  Number of Conditions: 2
+     Condition C1 --> (110:9)
+     Condition C2 --> (110:27)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
111
694
        return {};
112
113
2.72k
    return acc->code_hash;
114
3.41k
}
115
116
size_t Host::copy_code(const address& addr, size_t code_offset, uint8_t* buffer_data,
117
    size_t buffer_size) const noexcept
118
2.36M
{
119
2.36M
    const auto code = m_state.get_code(addr);
120
2.36M
    const auto code_slice = code.substr(std::min(code_offset, code.size()));
121
2.36M
    const auto num_bytes = std::min(buffer_size, code_slice.size());
122
2.36M
    std::copy_n(code_slice.begin(), num_bytes, buffer_data);
123
2.36M
    return num_bytes;
124
2.36M
}
125
126
bool Host::selfdestruct(const address& addr, const address& beneficiary) noexcept
127
7.51k
{
128
7.51k
    if (m_state.find(beneficiary) == nullptr)
  Branch (128:9): [True: 42, False: 7.47k]
+
129
42
        m_state.journal_create(beneficiary, false);
130
7.51k
    auto& acc = m_state.get(addr);
131
7.51k
    const auto balance = acc.balance;
132
7.51k
    auto& beneficiary_acc = m_state.touch(beneficiary);
133
134
7.51k
    m_state.journal_balance_change(beneficiary, beneficiary_acc.balance);
135
7.51k
    m_state.journal_balance_change(addr, balance);
136
137
7.51k
    if (m_rev >= EVMC_CANCUN && 
!acc.just_created6.41k
)
  Branch (137:9): [True: 6.41k, False: 1.09k]
+  Branch (137:33): [True: 2.28k, False: 4.13k]
+
  MC/DC Decision Region (137:9) to (137:50)
+
+  Number of Conditions: 2
+     Condition C1 --> (137:9)
+     Condition C2 --> (137:33)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
138
2.28k
    {
139
        // EIP-6780:
140
        // "SELFDESTRUCT is executed in a transaction that is not the same
141
        // as the contract invoking SELFDESTRUCT was created"
142
2.28k
        acc.balance = 0;
143
2.28k
        beneficiary_acc.balance += balance;  // Keep balance if acc is the beneficiary.
144
145
        // Return "selfdestruct not registered".
146
        // In practice this affects only refunds before Cancun.
147
2.28k
        return false;
148
2.28k
    }
149
150
    // Transfer may happen multiple times per single account as account's balance
151
    // can be increased with a call following previous selfdestruct.
152
5.22k
    beneficiary_acc.balance += balance;
153
5.22k
    acc.balance = 0;  // Zero balance if acc is the beneficiary.
154
155
    // Mark the destruction if not done already.
156
5.22k
    if (!acc.destructed)
  Branch (156:9): [True: 4.34k, False: 884]
+
157
4.34k
    {
158
4.34k
        m_state.journal_destruct(addr);
159
4.34k
        acc.destructed = true;
160
4.34k
        return true;
161
4.34k
    }
162
884
    return false;
163
5.22k
}
164
165
address compute_create_address(const address& sender, uint64_t sender_nonce) noexcept
166
61.6k
{
167
61.6k
    static constexpr auto RLP_STR_BASE = 0x80;
168
61.6k
    static constexpr auto RLP_LIST_BASE = 0xc0;
169
61.6k
    static constexpr auto ADDRESS_SIZE = sizeof(sender);
170
61.6k
    static constexpr std::ptrdiff_t MAX_NONCE_SIZE = sizeof(sender_nonce);
171
172
61.6k
    uint8_t buffer[ADDRESS_SIZE + MAX_NONCE_SIZE + 3];  // 3 for RLP prefix bytes.
173
61.6k
    auto p = &buffer[1];                                // Skip RLP list prefix for now.
174
61.6k
    *p++ = RLP_STR_BASE + ADDRESS_SIZE;                 // Set RLP string prefix for address.
175
61.6k
    p = std::copy_n(sender.bytes, ADDRESS_SIZE, p);
176
177
61.6k
    if (sender_nonce < RLP_STR_BASE)  // Short integer encoding including 0 as empty string (0x80).
  Branch (177:9): [True: 55.7k, False: 5.94k]
+
178
55.7k
    {
179
55.7k
        *p++ = sender_nonce != 0 ? 
static_cast<uint8_t>(sender_nonce)14.7k
:
RLP_STR_BASE40.9k
;
  Branch (179:16): [True: 14.7k, False: 40.9k]
+
180
55.7k
    }
181
5.94k
    else  // Prefixed integer encoding.
182
5.94k
    {
183
        // TODO: bit_width returns int after [LWG 3656](https://cplusplus.github.io/LWG/issue3656).
184
        // NOLINTNEXTLINE(readability-redundant-casting)
185
5.94k
        const auto num_nonzero_bytes = static_cast<int>((std::bit_width(sender_nonce) + 7) / 8);
186
5.94k
        *p++ = static_cast<uint8_t>(RLP_STR_BASE + num_nonzero_bytes);
187
5.94k
        intx::be::unsafe::store(p, sender_nonce);
188
5.94k
        p = std::shift_left(p, p + MAX_NONCE_SIZE, MAX_NONCE_SIZE - num_nonzero_bytes);
189
5.94k
    }
190
191
61.6k
    const auto total_size = static_cast<size_t>(p - buffer);
192
61.6k
    buffer[0] = static_cast<uint8_t>(RLP_LIST_BASE + (total_size - 1));  // Set the RLP list prefix.
193
194
61.6k
    const auto base_hash = keccak256({buffer, total_size});
195
61.6k
    address addr;
196
61.6k
    std::copy_n(&base_hash.bytes[sizeof(base_hash) - ADDRESS_SIZE], ADDRESS_SIZE, addr.bytes);
197
61.6k
    return addr;
198
61.6k
}
199
200
address compute_create2_address(
201
    const address& sender, const bytes32& salt, bytes_view init_code) noexcept
202
13.3k
{
203
13.3k
    const auto init_code_hash = keccak256(init_code);
204
13.3k
    uint8_t buffer[1 + sizeof(sender) + sizeof(salt) + sizeof(init_code_hash)];
205
13.3k
    static_assert(std::size(buffer) == 85);
206
13.3k
    auto it = std::begin(buffer);
207
13.3k
    *it++ = 0xff;
208
13.3k
    it = std::copy_n(sender.bytes, sizeof(sender), it);
209
13.3k
    it = std::copy_n(salt.bytes, sizeof(salt), it);
210
13.3k
    std::copy_n(init_code_hash.bytes, sizeof(init_code_hash), it);
211
13.3k
    const auto base_hash = keccak256({buffer, std::size(buffer)});
212
13.3k
    address addr;
213
13.3k
    std::copy_n(&base_hash.bytes[sizeof(base_hash) - sizeof(addr)], sizeof(addr), addr.bytes);
214
13.3k
    return addr;
215
13.3k
}
216
217
std::optional<evmc_message> Host::prepare_message(evmc_message msg) noexcept
218
4.14M
{
219
4.14M
    assert(msg.kind != EVMC_EOFCREATE);
220
4.14M
    if (msg.depth == 0 || 
msg.kind == EVMC_CREATE3.99M
||
msg.kind == EVMC_CREATE23.97M
)
  Branch (220:9): [True: 148k, False: 3.99M]
+  Branch (220:27): [True: 22.8k, False: 3.97M]
+  Branch (220:54): [True: 13.3k, False: 3.95M]
+
  MC/DC Decision Region (220:9) to (220:78)
+
+  Number of Conditions: 3
+     Condition C1 --> (220:9)
+     Condition C2 --> (220:27)
+     Condition C3 --> (220:54)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  F,  F  = F      }
+  2 { F,  F,  T  = T      }
+  3 { F,  T,  -  = T      }
+  4 { T,  -,  -  = T      }
+
+  C1-Pair: covered: (1,4)
+  C2-Pair: covered: (1,3)
+  C3-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
221
184k
    {
222
184k
        auto& sender_acc = m_state.get(msg.sender);
223
224
        // EIP-2681 (already checked for depth 0 during transaction validation).
225
184k
        if (sender_acc.nonce == Account::NonceMax)
  Branch (225:13): [True: 96, False: 184k]
+
226
96
            return {};  // Light early exception.
227
228
184k
        if (msg.depth != 0)
  Branch (228:13): [True: 36.1k, False: 148k]
+
229
36.1k
        {
230
36.1k
            m_state.journal_bump_nonce(msg.sender);
231
36.1k
            ++sender_acc.nonce;  // Bump sender nonce.
232
36.1k
        }
233
234
184k
        if (msg.kind == EVMC_CREATE || 
msg.kind == EVMC_CREATE2123k
)
  Branch (234:13): [True: 61.6k, False: 123k]
+  Branch (234:40): [True: 13.3k, False: 109k]
+
  MC/DC Decision Region (234:13) to (234:64)
+
+  Number of Conditions: 2
+     Condition C1 --> (234:13)
+     Condition C2 --> (234:40)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
235
74.9k
        {
236
            // Compute and set the address of the account being created.
237
74.9k
            assert(msg.recipient == address{});
238
74.9k
            assert(msg.code_address == address{});
239
            // Nonce was already incremented, but creation calculation needs non-incremented value
240
74.9k
            assert(sender_acc.nonce != 0);
241
74.9k
            const auto creation_sender_nonce = sender_acc.nonce - 1;
242
74.9k
            if (msg.kind == EVMC_CREATE)
  Branch (242:17): [True: 61.6k, False: 13.3k]
+
243
61.6k
                msg.recipient = compute_create_address(msg.sender, creation_sender_nonce);
244
13.3k
            else
245
13.3k
            {
246
13.3k
                assert(msg.kind == EVMC_CREATE2);
247
13.3k
                msg.recipient = compute_create2_address(
248
13.3k
                    msg.sender, msg.create2_salt, {msg.input_data, msg.input_size});
249
13.3k
            }
250
251
            // By EIP-2929, the access to new created address is never reverted.
252
74.9k
            access_account(msg.recipient);
253
74.9k
        }
254
184k
    }
255
256
4.14M
    return msg;
257
4.14M
}
258
259
evmc::Result Host::create(const evmc_message& msg) noexcept
260
74.9k
{
261
74.9k
    assert(msg.kind == EVMC_CREATE || msg.kind == EVMC_CREATE2);
262
263
74.9k
    auto* new_acc = m_state.find(msg.recipient);
264
74.9k
    const bool new_acc_exists = new_acc != nullptr;
265
74.9k
    if (!new_acc_exists)
  Branch (265:9): [True: 6.44k, False: 68.5k]
+
266
6.44k
        new_acc = &m_state.insert(msg.recipient);
267
68.5k
    else if (is_create_collision(*new_acc))
  Branch (267:14): [True: 858, False: 67.6k]
+
268
858
        return evmc::Result{EVMC_FAILURE};  // TODO: Add EVMC errors for creation failures.
269
74.1k
    m_state.journal_create(msg.recipient, new_acc_exists);
270
271
74.1k
    assert(new_acc != nullptr);
272
74.1k
    assert(new_acc->nonce == 0);
273
274
74.1k
    if (m_rev >= EVMC_SPURIOUS_DRAGON)
  Branch (274:9): [True: 72.8k, False: 1.29k]
+
275
72.8k
        new_acc->nonce = 1;  // No need to journal: create revert will 0 the nonce.
276
277
74.1k
    new_acc->just_created = true;
278
279
74.1k
    auto& sender_acc = m_state.get(msg.sender);  // TODO: Duplicated account lookup.
280
74.1k
    const auto value = intx::be::load<intx::uint256>(msg.value);
281
74.1k
    assert(sender_acc.balance >= value && "EVM must guarantee balance");
282
74.1k
    m_state.journal_balance_change(msg.sender, sender_acc.balance);
283
74.1k
    m_state.journal_balance_change(msg.recipient, new_acc->balance);
284
74.1k
    sender_acc.balance -= value;
285
74.1k
    new_acc->balance += value;  // The new account may be prefunded.
286
287
74.1k
    auto create_msg = msg;
288
74.1k
    create_msg.input_data = nullptr;
289
74.1k
    create_msg.input_size = 0;
290
74.1k
    const bytes_view initcode{msg.input_data, msg.input_size};
291
74.1k
    auto result = m_vm.execute(*this, m_rev, create_msg, initcode.data(), initcode.size());
292
74.1k
    if (result.status_code != EVMC_SUCCESS)
  Branch (292:9): [True: 3.84k, False: 70.2k]
+
293
3.84k
    {
294
3.84k
        result.create_address = msg.recipient;
295
3.84k
        return result;
296
3.84k
    }
297
298
70.2k
    auto gas_left = result.gas_left;
299
70.2k
    assert(gas_left >= 0);
300
301
70.2k
    const bytes_view code{result.output_data, result.output_size};
302
303
70.2k
    if (m_rev >= EVMC_SPURIOUS_DRAGON && 
code.size() > MAX_CODE_SIZE69.0k
)
  Branch (303:9): [True: 69.0k, False: 1.26k]
+  Branch (303:42): [True: 94, False: 68.9k]
+
  MC/DC Decision Region (303:9) to (303:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (303:9)
+     Condition C2 --> (303:42)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
304
94
        return evmc::Result{EVMC_FAILURE};
305
306
    // Code deployment cost.
307
70.1k
    const auto cost = std::ssize(code) * 200;
308
70.1k
    gas_left -= cost;
309
70.1k
    if (gas_left < 0)
  Branch (309:9): [True: 346, False: 69.8k]
+
310
346
    {
311
346
        return (m_rev == EVMC_FRONTIER) ?
  Branch (311:16): [True: 2, False: 344]
+
312
2
                   evmc::Result{EVMC_SUCCESS, result.gas_left, result.gas_refund, msg.recipient} :
313
346
                   
evmc::Result{EVMC_FAILURE}344
;
314
346
    }
315
316
69.8k
    if (!code.empty())
  Branch (316:9): [True: 27.7k, False: 42.0k]
+
317
27.7k
    {
318
        // EIP-3541: Reject new contract code starting with the 0xEF byte.
319
27.7k
        if (m_rev >= EVMC_LONDON && 
code[0] == 0xEF20.1k
)
  Branch (319:13): [True: 20.1k, False: 7.66k]
+  Branch (319:37): [True: 84, False: 20.0k]
+
  MC/DC Decision Region (319:13) to (319:52)
+
+  Number of Conditions: 2
+     Condition C1 --> (319:13)
+     Condition C2 --> (319:37)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
320
84
            return evmc::Result{EVMC_CONTRACT_VALIDATION_FAILURE};
321
322
27.6k
        new_acc->code_hash = keccak256(code);
323
27.6k
        new_acc->code = code;
324
27.6k
        new_acc->code_changed = true;
325
27.6k
    }
326
327
69.7k
    return evmc::Result{result.status_code, gas_left, result.gas_refund, msg.recipient};
328
69.8k
}
329
330
evmc::Result Host::execute_message(const evmc_message& msg) noexcept
331
4.14M
{
332
4.14M
    assert(msg.kind != EVMC_EOFCREATE);
333
4.14M
    if (msg.kind == EVMC_CREATE || 
msg.kind == EVMC_CREATE24.08M
)
  Branch (333:9): [True: 61.6k, False: 4.08M]
+  Branch (333:36): [True: 13.3k, False: 4.06M]
+
  MC/DC Decision Region (333:9) to (333:60)
+
+  Number of Conditions: 2
+     Condition C1 --> (333:9)
+     Condition C2 --> (333:36)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
334
74.9k
        return create(msg);
335
336
4.06M
    if (msg.kind == EVMC_CALL)
  Branch (336:9): [True: 3.91M, False: 149k]
+
337
3.91M
    {
338
3.91M
        const auto exists = m_state.find(msg.recipient) != nullptr;
339
3.91M
        if (!exists)
  Branch (339:13): [True: 7.66k, False: 3.91M]
+
340
7.66k
            m_state.journal_create(msg.recipient, exists);
341
3.91M
    }
342
343
4.06M
    if (msg.kind == EVMC_CALL)
  Branch (343:9): [True: 3.91M, False: 149k]
+
344
3.91M
    {
345
3.91M
        if (evmc::is_zero(msg.value))
  Branch (345:13): [True: 3.83M, False: 82.5k]
+
346
3.83M
            m_state.touch(msg.recipient);
347
82.5k
        else
348
82.5k
        {
349
            // We skip touching if we send value, because account cannot end up empty.
350
            // It will either have value, or code that transfers this value out, or will be
351
            // selfdestructed anyway.
352
82.5k
            auto& dst_acc = m_state.get_or_insert(msg.recipient);
353
354
            // Transfer value: sender → recipient.
355
            // The sender's balance is already checked therefore the sender account must exist.
356
82.5k
            const auto value = intx::be::load<intx::uint256>(msg.value);
357
82.5k
            assert(m_state.get(msg.sender).balance >= value);
358
82.5k
            m_state.journal_balance_change(msg.sender, m_state.get(msg.sender).balance);
359
82.5k
            m_state.journal_balance_change(msg.recipient, dst_acc.balance);
360
82.5k
            m_state.get(msg.sender).balance -= value;
361
82.5k
            dst_acc.balance += value;
362
82.5k
        }
363
3.91M
    }
364
365
    // Calls to precompile address via EIP-7702 delegation execute empty code instead of precompile.
366
4.06M
    if ((msg.flags & EVMC_DELEGATED) == 0 && 
is_precompile(m_rev, msg.code_address)4.06M
)
  Branch (366:9): [True: 1.64M, False: 2.42M]
+  Branch (366:9): [True: 4.06M, False: 3.33k]
+  Branch (366:46): [True: 1.64M, False: 2.42M]
+
  MC/DC Decision Region (366:9) to (366:84)
+
+  Number of Conditions: 2
+     Condition C1 --> (366:9)
+     Condition C2 --> (366:46)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
367
1.64M
        return call_precompile(m_rev, msg);
368
369
    // TODO: get_code() performs the account lookup. Add a way to get an account with code?
370
2.42M
    const auto code = m_state.get_code(msg.code_address);
371
2.42M
    if (code.empty())
  Branch (371:9): [True: 59.6k, False: 2.36M]
+
372
59.6k
        return evmc::Result{EVMC_SUCCESS, msg.gas};  // Skip trivial execution.
373
374
2.36M
    return m_vm.execute(*this, m_rev, msg, code.data(), code.size());
375
2.42M
}
376
377
evmc::Result Host::call(const evmc_message& orig_msg) noexcept
378
4.14M
{
379
4.14M
    const auto msg = prepare_message(orig_msg);
380
4.14M
    if (!msg.has_value())
  Branch (380:9): [True: 96, False: 4.14M]
+
381
96
        return evmc::Result{EVMC_FAILURE, orig_msg.gas};  // Light exception.
382
383
4.14M
    const auto logs_checkpoint = m_logs.size();
384
4.14M
    const auto state_checkpoint = m_state.checkpoint();
385
386
4.14M
    auto result = execute_message(*msg);
387
388
4.14M
    if (result.status_code != EVMC_SUCCESS)
  Branch (388:9): [True: 2.41M, False: 1.72M]
+
389
2.41M
    {
390
2.41M
        static constexpr auto addr_03 = 0x03_address;
391
2.41M
        auto* const acc_03 = m_state.find(addr_03);
392
2.41M
        const auto is_03_touched = acc_03 != nullptr && 
acc_03->erase_if_empty401k
;
  Branch (392:36): [True: 401k, False: 2.01M]
+  Branch (392:57): [True: 395k, False: 5.54k]
+
  MC/DC Decision Region (392:36) to (392:79)
+
+  Number of Conditions: 2
+     Condition C1 --> (392:36)
+     Condition C2 --> (392:57)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
393
394
        // Revert.
395
2.41M
        m_state.rollback(state_checkpoint);
396
2.41M
        m_logs.resize(logs_checkpoint);
397
398
        // The 0x03 quirk: the touch on this address is never reverted.
399
2.41M
        if (is_03_touched && 
m_rev >= EVMC_SPURIOUS_DRAGON395k
)
  Branch (399:13): [True: 395k, False: 2.02M]
+  Branch (399:30): [True: 395k, False: 92]
+
  MC/DC Decision Region (399:13) to (399:59)
+
+  Number of Conditions: 2
+     Condition C1 --> (399:13)
+     Condition C2 --> (399:30)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
400
395k
            m_state.touch(addr_03);
401
2.41M
    }
402
4.14M
    return result;
403
4.14M
}
404
405
evmc_tx_context Host::get_tx_context() const noexcept
406
173k
{
407
    // TODO: The effective gas price is already computed in transaction validation.
408
    // TODO: The effective gas price calculation is broken for system calls (gas price 0).
409
173k
    assert(m_tx.max_gas_price >= m_block.base_fee || m_tx.max_gas_price == 0);
410
173k
    const auto priority_gas_price =
411
173k
        std::min(m_tx.max_priority_gas_price, m_tx.max_gas_price - m_block.base_fee);
412
173k
    const auto effective_gas_price = m_block.base_fee + priority_gas_price;
413
414
173k
    return evmc_tx_context{
415
173k
        intx::be::store<uint256be>(effective_gas_price),  // By EIP-1559.
416
173k
        m_tx.sender,
417
173k
        m_block.coinbase,
418
173k
        m_block.number,
419
173k
        m_block.timestamp,
420
173k
        m_block.gas_limit,
421
173k
        m_block.prev_randao,
422
173k
        0x01_bytes32,  // Chain ID is expected to be 1.
423
173k
        uint256be{m_block.base_fee},
424
173k
        intx::be::store<uint256be>(m_block.blob_base_fee.value_or(0)),
425
173k
        m_tx.blob_hashes.data(),
426
173k
        m_tx.blob_hashes.size(),
427
173k
    };
428
173k
}
429
430
bytes32 Host::get_block_hash(int64_t block_number) const noexcept
431
69.7k
{
432
69.7k
    return m_block_hashes.get_block_hash(block_number);
433
69.7k
}
434
435
void Host::emit_log(const address& addr, const uint8_t* data, size_t data_size,
436
    const bytes32 topics[], size_t topics_count) noexcept
437
30.2k
{
438
30.2k
    m_logs.push_back({addr, {data, data_size}, {topics, topics + topics_count}});
439
30.2k
}
440
441
evmc_access_status Host::access_account(const address& addr) noexcept
442
4.83M
{
443
4.83M
    if (m_rev < EVMC_BERLIN)
  Branch (443:9): [True: 17.9k, False: 4.81M]
+
444
17.9k
        return EVMC_ACCESS_COLD;  // Ignore before Berlin.
445
446
4.81M
    auto& acc = m_state.get_or_insert(addr, {.erase_if_empty = true});
447
448
4.81M
    if (acc.access_status == EVMC_ACCESS_WARM || 
is_precompile(m_rev, addr)2.70M
)
  Branch (448:9): [True: 2.11M, False: 2.70M]
+  Branch (448:50): [True: 2.11M, False: 588k]
+
  MC/DC Decision Region (448:9) to (448:76)
+
+  Number of Conditions: 2
+     Condition C1 --> (448:9)
+     Condition C2 --> (448:50)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
449
4.22M
        return EVMC_ACCESS_WARM;
450
451
588k
    m_state.journal_access_account(addr);
452
588k
    acc.access_status = EVMC_ACCESS_WARM;
453
588k
    return EVMC_ACCESS_COLD;
454
4.81M
}
455
456
evmc_access_status Host::access_storage(const address& addr, const bytes32& key) noexcept
457
5.22M
{
458
5.22M
    auto& storage_slot = m_state.get_storage(addr, key);
459
5.22M
    m_state.journal_storage_change(addr, key, storage_slot);
460
5.22M
    return std::exchange(storage_slot.access_status, EVMC_ACCESS_WARM);
461
5.22M
}
462
463
464
evmc::bytes32 Host::get_transient_storage(const address& addr, const bytes32& key) const noexcept
465
1.88M
{
466
1.88M
    const auto& acc = m_state.get(addr);
467
1.88M
    const auto it = acc.transient_storage.find(key);
468
1.88M
    return it != acc.transient_storage.end() ? 
it->second1.88M
:
bytes32{}1.64k
;
  Branch (468:12): [True: 1.88M, False: 1.64k]
+
469
1.88M
}
470
471
void Host::set_transient_storage(
472
    const address& addr, const bytes32& key, const bytes32& value) noexcept
473
9.07M
{
474
9.07M
    auto& slot = m_state.get(addr).transient_storage[key];
475
9.07M
    m_state.journal_transient_storage_change(addr, key, slot);
476
9.07M
    slot = value;
477
9.07M
}
478
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/host.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/host.hpp.html new file mode 100644 index 0000000000..0a5a94c245 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/host.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/host.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include "state.hpp"
8
#include "state_view.hpp"
9
#include <optional>
10
11
namespace evmone::state
12
{
13
using evmc::uint256be;
14
15
/// Computes the address of to-be-created contract with the CREATE scheme.
16
///
17
/// Computes the new account address for the contract creation context of the CREATE instruction
18
/// or a create transaction.
19
/// This is defined by 𝐀𝐃𝐃𝐑 in Yellow Paper, 7. Contract Creation, (88-90), the case for ζ = ∅.
20
///
21
/// @param sender        The address of the message sender. YP: 𝑠.
22
/// @param sender_nonce  The sender's nonce before the increase. YP: 𝑛.
23
/// @return              The address computed with the CREATE scheme.
24
[[nodiscard]] address compute_create_address(const address& sender, uint64_t sender_nonce) noexcept;
25
26
/// Computes the address of to-be-created contract with the CREATE2 scheme.
27
///
28
/// Computes the new account address for the contract creation context of the CREATE2 instruction.
29
///
30
/// @param sender        The address of the message sender.
31
/// @param salt          The salt.
32
/// @param init_code     The init_code to hash (initcode or initcontainer).
33
/// @return              The address computed with the scheme.
34
[[nodiscard]] address compute_create2_address(
35
    const address& sender, const bytes32& salt, bytes_view init_code) noexcept;
36
37
class Host : public evmc::Host
38
{
39
    evmc_revision m_rev;
40
    evmc::VM& m_vm;
41
    State& m_state;
42
    const BlockInfo& m_block;
43
    const BlockHashes& m_block_hashes;
44
    const Transaction& m_tx;
45
    std::vector<Log> m_logs;
46
47
public:
48
    Host(evmc_revision rev, evmc::VM& vm, State& state, const BlockInfo& block,
49
        const BlockHashes& block_hashes, const Transaction& tx) noexcept
50
356k
      : m_rev{rev}, m_vm{vm}, m_state{state}, m_block{block}, m_block_hashes{block_hashes}, m_tx{tx}
51
356k
    {}
52
53
148k
    [[nodiscard]] std::vector<Log>&& take_logs() noexcept { return std::move(m_logs); }
54
55
    evmc::Result call(const evmc_message& msg) noexcept override;
56
57
private:
58
    [[nodiscard]] bool account_exists(const address& addr) const noexcept override;
59
60
    [[nodiscard]] bytes32 get_storage(
61
        const address& addr, const bytes32& key) const noexcept override;
62
63
    evmc_storage_status set_storage(
64
        const address& addr, const bytes32& key, const bytes32& value) noexcept override;
65
66
    [[nodiscard]] evmc::bytes32 get_transient_storage(
67
        const address& addr, const bytes32& key) const noexcept override;
68
69
    void set_transient_storage(
70
        const address& addr, const bytes32& key, const bytes32& value) noexcept override;
71
72
    [[nodiscard]] uint256be get_balance(const address& addr) const noexcept override;
73
74
    [[nodiscard]] size_t get_code_size(const address& addr) const noexcept override;
75
76
    [[nodiscard]] bytes32 get_code_hash(const address& addr) const noexcept override;
77
78
    size_t copy_code(const address& addr, size_t code_offset, uint8_t* buffer_data,
79
        size_t buffer_size) const noexcept override;
80
81
    bool selfdestruct(const address& addr, const address& beneficiary) noexcept override;
82
83
    evmc::Result create(const evmc_message& msg) noexcept;
84
85
    [[nodiscard]] evmc_tx_context get_tx_context() const noexcept override;
86
87
    [[nodiscard]] bytes32 get_block_hash(int64_t block_number) const noexcept override;
88
89
    void emit_log(const address& addr, const uint8_t* data, size_t data_size,
90
        const bytes32 topics[], size_t topics_count) noexcept override;
91
92
public:
93
    evmc_access_status access_account(const address& addr) noexcept override;
94
95
private:
96
    evmc_access_status access_storage(const address& addr, const bytes32& key) noexcept override;
97
98
    /// Prepares message for execution.
99
    ///
100
    /// This contains mostly checks and logic related to the sender
101
    /// which may finally be moved to EVM.
102
    /// Any state modification is not reverted.
103
    /// @return Modified message or std::nullopt in case of EVM exception.
104
    std::optional<evmc_message> prepare_message(evmc_message msg) noexcept;
105
106
    evmc::Result execute_message(const evmc_message& msg) noexcept;
107
};
108
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/precompiles.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/precompiles.cpp.html new file mode 100644 index 0000000000..e1236dea62 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/precompiles.cpp.html @@ -0,0 +1,204 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/precompiles.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "precompiles.hpp"
6
#include "../utils/stdx/utility.hpp"
7
#include "evmone_precompiles/secp256r1.hpp"
8
#include "precompiles_internal.hpp"
9
#include "precompiles_stubs.hpp"
10
#include <evmone_precompiles/blake2b.hpp>
11
#include <evmone_precompiles/bls.hpp>
12
#include <evmone_precompiles/bn254.hpp>
13
#include <evmone_precompiles/kzg.hpp>
14
#include <evmone_precompiles/modexp.hpp>
15
#include <evmone_precompiles/ripemd160.hpp>
16
#include <evmone_precompiles/secp256k1.hpp>
17
#include <evmone_precompiles/sha256.hpp>
18
#include <intx/intx.hpp>
19
#include <array>
20
#include <bit>
21
#include <cassert>
22
#include <limits>
23
#include <span>
24
25
#ifdef EVMONE_PRECOMPILES_GMP
26
#include "precompiles_gmp.hpp"
27
#endif
28
29
namespace evmone::state
30
{
31
using evmc::bytes;
32
using evmc::bytes_view;
33
using namespace evmc::literals;
34
35
namespace
36
{
37
constexpr auto GasCostMax = std::numeric_limits<int64_t>::max();
38
39
constexpr auto MODEXP_LEN_LIMIT_EIP7823 = 1024;
40
41
constexpr auto BLS12_SCALAR_SIZE = 32;
42
constexpr auto BLS12_FIELD_ELEMENT_SIZE = 64;
43
constexpr auto BLS12_G1_POINT_SIZE = 2 * BLS12_FIELD_ELEMENT_SIZE;
44
constexpr auto BLS12_G2_POINT_SIZE = 4 * BLS12_FIELD_ELEMENT_SIZE;
45
constexpr auto BLS12_G1_MUL_INPUT_SIZE = BLS12_G1_POINT_SIZE + BLS12_SCALAR_SIZE;
46
constexpr auto BLS12_G2_MUL_INPUT_SIZE = BLS12_G2_POINT_SIZE + BLS12_SCALAR_SIZE;
47
48
constexpr int64_t num_words(size_t size_in_bytes) noexcept
49
1.20M
{
50
1.20M
    return static_cast<int64_t>((size_in_bytes + 31) / 32);
51
1.20M
}
52
53
template <int BaseCost, int WordCost>
54
constexpr int64_t cost_per_input_word(size_t input_size) noexcept
55
1.20M
{
56
1.20M
    return BaseCost + WordCost * num_words(input_size);
57
1.20M
}
precompiles.cpp:long evmone::state::(anonymous namespace)::cost_per_input_word<60, 12>(unsigned long)
Line
Count
Source
55
19.8k
{
56
19.8k
    return BaseCost + WordCost * num_words(input_size);
57
19.8k
}
precompiles.cpp:long evmone::state::(anonymous namespace)::cost_per_input_word<600, 120>(unsigned long)
Line
Count
Source
55
395k
{
56
395k
    return BaseCost + WordCost * num_words(input_size);
57
395k
}
precompiles.cpp:long evmone::state::(anonymous namespace)::cost_per_input_word<15, 3>(unsigned long)
Line
Count
Source
55
792k
{
56
792k
    return BaseCost + WordCost * num_words(input_size);
57
792k
}
58
}  // namespace
59
60
PrecompileAnalysis ecrecover_analyze(bytes_view /*input*/, evmc_revision /*rev*/) noexcept
61
402k
{
62
402k
    return {3000, 32};
63
402k
}
64
65
PrecompileAnalysis sha256_analyze(bytes_view input, evmc_revision /*rev*/) noexcept
66
19.8k
{
67
19.8k
    return {cost_per_input_word<60, 12>(input.size()), 32};
68
19.8k
}
69
70
PrecompileAnalysis ripemd160_analyze(bytes_view input, evmc_revision /*rev*/) noexcept
71
395k
{
72
395k
    return {cost_per_input_word<600, 120>(input.size()), 32};
73
395k
}
74
75
PrecompileAnalysis identity_analyze(bytes_view input, evmc_revision /*rev*/) noexcept
76
792k
{
77
792k
    return {cost_per_input_word<15, 3>(input.size()), input.size()};
78
792k
}
79
80
PrecompileAnalysis ecadd_analyze(bytes_view /*input*/, evmc_revision rev) noexcept
81
2.98k
{
82
2.98k
    return {rev >= EVMC_ISTANBUL ? 
1502.97k
:
50012
, 64};
  Branch (82:13): [True: 2.97k, False: 12]
+
83
2.98k
}
84
85
PrecompileAnalysis ecmul_analyze(bytes_view /*input*/, evmc_revision rev) noexcept
86
6.49k
{
87
6.49k
    return {rev >= EVMC_ISTANBUL ? 
60006.48k
:
4000012
, 64};
  Branch (87:13): [True: 6.48k, False: 12]
+
88
6.49k
}
89
90
PrecompileAnalysis ecpairing_analyze(bytes_view input, evmc_revision rev) noexcept
91
2.14k
{
92
2.14k
    const auto base_cost = (rev >= EVMC_ISTANBUL) ? 
450002.13k
:
10000012
;
  Branch (92:28): [True: 2.13k, False: 12]
+
93
2.14k
    const auto element_cost = (rev >= EVMC_ISTANBUL) ? 
340002.13k
:
8000012
;
  Branch (93:31): [True: 2.13k, False: 12]
+
94
2.14k
    const auto num_elements = static_cast<int64_t>(input.size() / 192);
95
2.14k
    return {base_cost + num_elements * element_cost, 32};
96
2.14k
}
97
98
PrecompileAnalysis blake2bf_analyze(bytes_view input, evmc_revision) noexcept
99
2.12k
{
100
    // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage)
101
2.12k
    return {input.size() == 213 ? 
intx::be::unsafe::load<uint32_t>(input.data())1.28k
:
GasCostMax848
, 64};
  Branch (101:13): [True: 1.28k, False: 848]
+
102
2.12k
}
103
104
PrecompileAnalysis expmod_analyze(bytes_view input, evmc_revision rev) noexcept
105
4.77k
{
106
4.77k
    using namespace intx;
107
108
4.77k
    const auto calc_adjusted_exp_len = [input, rev](size_t offset, uint32_t len) noexcept {
109
4.42k
        const auto head_len = std::min(size_t{len}, size_t{32});
110
4.42k
        const auto head_explicit_bytes =
111
4.42k
            offset < input.size() ?
  Branch (111:13): [True: 3.78k, False: 640]
+
112
3.78k
                input.substr(offset, std::min(head_len, input.size() - offset)) :
113
4.42k
                
bytes_view{}640
;
114
115
4.42k
        const auto top_byte_index = head_explicit_bytes.find_first_not_of(uint8_t{0});
116
4.42k
        const auto exp_bit_width =
117
4.42k
            (top_byte_index != bytes_view::npos) ?
  Branch (117:13): [True: 2.85k, False: 1.56k]
+
118
2.85k
                8 * (head_len - top_byte_index - 1) +
119
2.85k
                    static_cast<unsigned>(std::bit_width(head_explicit_bytes[top_byte_index])) :
120
4.42k
                
01.56k
;
121
122
4.42k
        const auto tail_len = len - head_len;
123
4.42k
        const auto head_bits = std::max(exp_bit_width, size_t{1}) - 1;
124
4.42k
        const uint64_t factor = rev < EVMC_OSAKA ? 
83.85k
:
16566
;
  Branch (124:33): [True: 3.85k, False: 566]
+
125
4.42k
        return std::max(factor * uint64_t{tail_len} + uint64_t{head_bits}, uint64_t{1});
126
4.42k
    };
127
128
4.77k
    static constexpr auto calc_mult_complexity_eip7883 = [](uint32_t max_len) noexcept {
129
        // With EIP-7823 the computation never overflows.
130
566
        assert(max_len <= MODEXP_LEN_LIMIT_EIP7823);
131
566
        const auto num_words = (max_len + 7) / 8;
132
566
        const auto mult_complexity = max_len <= 32 ? 
16396
:
num_words * num_words * 2170
;
  Branch (132:38): [True: 396, False: 170]
+
133
566
        return uint64_t{mult_complexity};
134
566
    };
135
4.77k
    static constexpr auto calc_mult_complexity_eip2565 = [](uint32_t max_len) noexcept {
136
3.59k
        const auto num_words = (uint64_t{max_len} + 7) / 8;
137
3.59k
        return num_words * num_words;  // max value: 0x04000000'00000000
138
3.59k
    };
139
4.77k
    static constexpr auto calc_mult_complexity_eip198 = [](uint32_t max_len) noexcept {
140
264
        const auto max_len_squared = uint64_t{max_len} * max_len;
141
264
        if (max_len <= 64)
  Branch (141:13): [True: 184, False: 80]
+
142
184
            return max_len_squared;
143
80
        if (max_len <= 1024)
  Branch (143:13): [True: 72, False: 8]
+
144
72
            return max_len_squared / 4 + 96 * max_len - 3072;
145
        // max value: 0x100001df'dffcf220
146
8
        return max_len_squared / 16 + 480 * uint64_t{max_len} - 199680;
147
80
    };
148
149
4.77k
    struct Params
150
4.77k
    {
151
4.77k
        int64_t min_gas;
152
4.77k
        unsigned final_divisor;
153
4.77k
        uint64_t (*calc_mult_complexity)(uint32_t max_len) noexcept;
154
4.77k
    };
155
4.77k
    const auto& [min_gas, final_divisor, calc_mult_complexity] = [rev]() noexcept -> Params {
156
4.77k
        if (rev >= EVMC_OSAKA)
  Branch (156:13): [True: 650, False: 4.12k]
+
157
650
            return {500, 1, calc_mult_complexity_eip7883};
158
4.12k
        else if (rev >= EVMC_BERLIN)
  Branch (158:18): [True: 3.81k, False: 312]
+
159
3.81k
            return {200, 3, calc_mult_complexity_eip2565};
160
312
        else  // Byzantium
161
312
            return {0, 20, calc_mult_complexity_eip198};
162
4.77k
    }();
163
164
4.77k
    static constexpr size_t INPUT_HEADER_REQUIRED_SIZE = 3 * sizeof(uint256);
165
4.77k
    uint8_t input_header[INPUT_HEADER_REQUIRED_SIZE]{};
166
    // NOLINTNEXTLINE(bugprone-suspicious-stringview-data-usage)
167
4.77k
    std::copy_n(input.data(), std::min(input.size(), INPUT_HEADER_REQUIRED_SIZE), input_header);
168
169
4.77k
    const auto base_len256 = be::unsafe::load<uint256>(&input_header[0]);
170
4.77k
    const auto exp_len256 = be::unsafe::load<uint256>(&input_header[32]);
171
4.77k
    const auto mod_len256 = be::unsafe::load<uint256>(&input_header[64]);
172
173
    // Check the declared input lengths against the practical (2**32)
174
    // or specified (EIP-7823: 2**10) limits.
175
4.77k
    const auto len_limit =
176
4.77k
        rev < EVMC_OSAKA ? 
std::numeric_limits<uint32_t>::max()4.12k
:
MODEXP_LEN_LIMIT_EIP7823650
;
  Branch (176:9): [True: 4.12k, False: 650]
+
177
4.77k
    if (base_len256 > len_limit || 
mod_len256 > len_limit4.67k
)
  Branch (177:9): [True: 162, False: 4.61k]
+  Branch (177:9): [True: 104, False: 4.67k]
+  Branch (177:36): [True: 58, False: 4.61k]
+
  MC/DC Decision Region (177:9) to (177:58)
+
+  Number of Conditions: 2
+     Condition C1 --> (177:9)
+     Condition C2 --> (177:36)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
178
162
        return {GasCostMax, 0};
179
180
4.61k
    if (exp_len256 > len_limit)
  Branch (180:9): [True: 194, False: 4.42k]
+
181
194
    {
182
        // Before EIP-7823, the big exponent may be canceled with zero multiplication complexity.
183
194
        if (rev < EVMC_OSAKA && 
base_len256 == 0164
&&
mod_len256 == 052
)
  Branch (183:13): [True: 32, False: 162]
+  Branch (183:13): [True: 164, False: 30]
+  Branch (183:33): [True: 52, False: 112]
+  Branch (183:53): [True: 32, False: 20]
+
  MC/DC Decision Region (183:13) to (183:68)
+
+  Number of Conditions: 3
+     Condition C1 --> (183:13)
+     Condition C2 --> (183:33)
+     Condition C3 --> (183:53)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  F,  -  = F      }
+  3 { T,  T,  F  = F      }
+  4 { T,  T,  T  = T      }
+
+  C1-Pair: covered: (1,4)
+  C2-Pair: covered: (2,4)
+  C3-Pair: covered: (3,4)
+  MC/DC Coverage for Expression: 100.00%
+
184
32
            return {min_gas, 0};
185
162
        return {GasCostMax, 0};
186
194
    }
187
188
4.42k
    const auto base_len = static_cast<uint32_t>(base_len256);
189
4.42k
    const auto exp_len = static_cast<uint32_t>(exp_len256);
190
4.42k
    const auto mod_len = static_cast<uint32_t>(mod_len256);
191
192
4.42k
    const auto adjusted_exp_len = calc_adjusted_exp_len(sizeof(input_header) + base_len, exp_len);
193
4.42k
    const auto max_len = std::max(mod_len, base_len);
194
4.42k
    const auto gas = umul(calc_mult_complexity(max_len), adjusted_exp_len) / final_divisor;
195
4.42k
    const auto gas_clamped = std::clamp<uint128>(gas, min_gas, GasCostMax);
196
4.42k
    return {static_cast<int64_t>(gas_clamped), mod_len};
197
4.61k
}
198
199
PrecompileAnalysis point_evaluation_analyze(bytes_view, evmc_revision) noexcept
200
1.31k
{
201
1.31k
    static constexpr auto POINT_EVALUATION_PRECOMPILE_GAS = 50000;
202
1.31k
    return {POINT_EVALUATION_PRECOMPILE_GAS, 64};
203
1.31k
}
204
205
PrecompileAnalysis bls12_g1add_analyze(bytes_view, evmc_revision) noexcept
206
534
{
207
534
    static constexpr auto BLS12_G1ADD_PRECOMPILE_GAS = 375;
208
534
    return {BLS12_G1ADD_PRECOMPILE_GAS, BLS12_G1_POINT_SIZE};
209
534
}
210
211
PrecompileAnalysis bls12_g1msm_analyze(bytes_view input, evmc_revision) noexcept
212
3.42k
{
213
3.42k
    static constexpr auto G1MUL_GAS_COST = 12000;
214
3.42k
    static constexpr uint16_t DISCOUNTS[] = {1000, 949, 848, 797, 764, 750, 738, 728, 719, 712, 705,
215
3.42k
        698, 692, 687, 682, 677, 673, 669, 665, 661, 658, 654, 651, 648, 645, 642, 640, 637, 635,
216
3.42k
        632, 630, 627, 625, 623, 621, 619, 617, 615, 613, 611, 609, 608, 606, 604, 603, 601, 599,
217
3.42k
        598, 596, 595, 593, 592, 591, 589, 588, 586, 585, 584, 582, 581, 580, 579, 577, 576, 575,
218
3.42k
        574, 573, 572, 570, 569, 568, 567, 566, 565, 564, 563, 562, 561, 560, 559, 558, 557, 556,
219
3.42k
        555, 554, 553, 552, 551, 550, 549, 548, 547, 547, 546, 545, 544, 543, 542, 541, 540, 540,
220
3.42k
        539, 538, 537, 536, 536, 535, 534, 533, 532, 532, 531, 530, 529, 528, 528, 527, 526, 525,
221
3.42k
        525, 524, 523, 522, 522, 521, 520, 520, 519};
222
223
3.42k
    if (input.empty() || 
input.size() % BLS12_G1_MUL_INPUT_SIZE != 03.30k
)
  Branch (223:9): [True: 120, False: 3.30k]
+  Branch (223:26): [True: 1.19k, False: 2.11k]
+
  MC/DC Decision Region (223:9) to (223:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (223:9)
+     Condition C2 --> (223:26)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
224
1.31k
        return {GasCostMax, 0};
225
226
2.11k
    const auto k = input.size() / BLS12_G1_MUL_INPUT_SIZE;
227
2.11k
    assert(k > 0);
228
2.11k
    const auto discount = DISCOUNTS[std::min(k, std::size(DISCOUNTS)) - 1];
229
2.11k
    const auto cost = (G1MUL_GAS_COST * discount * static_cast<int64_t>(k)) / 1000;
230
2.11k
    return {cost, BLS12_G1_POINT_SIZE};
231
3.42k
}
232
233
PrecompileAnalysis bls12_g2add_analyze(bytes_view, evmc_revision) noexcept
234
558
{
235
558
    static constexpr auto BLS12_G2ADD_PRECOMPILE_GAS = 600;
236
558
    return {BLS12_G2ADD_PRECOMPILE_GAS, BLS12_G2_POINT_SIZE};
237
558
}
238
239
PrecompileAnalysis bls12_g2msm_analyze(bytes_view input, evmc_revision) noexcept
240
3.45k
{
241
3.45k
    static constexpr auto G2MUL_GAS_COST = 22500;
242
3.45k
    static constexpr uint16_t DISCOUNTS[] = {1000, 1000, 923, 884, 855, 832, 812, 796, 782, 770,
243
3.45k
        759, 749, 740, 732, 724, 717, 711, 704, 699, 693, 688, 683, 679, 674, 670, 666, 663, 659,
244
3.45k
        655, 652, 649, 646, 643, 640, 637, 634, 632, 629, 627, 624, 622, 620, 618, 615, 613, 611,
245
3.45k
        609, 607, 606, 604, 602, 600, 598, 597, 595, 593, 592, 590, 589, 587, 586, 584, 583, 582,
246
3.45k
        580, 579, 578, 576, 575, 574, 573, 571, 570, 569, 568, 567, 566, 565, 563, 562, 561, 560,
247
3.45k
        559, 558, 557, 556, 555, 554, 553, 552, 552, 551, 550, 549, 548, 547, 546, 545, 545, 544,
248
3.45k
        543, 542, 541, 541, 540, 539, 538, 537, 537, 536, 535, 535, 534, 533, 532, 532, 531, 530,
249
3.45k
        530, 529, 528, 528, 527, 526, 526, 525, 524, 524};
250
251
3.45k
    if (input.empty() || 
input.size() % BLS12_G2_MUL_INPUT_SIZE != 03.33k
)
  Branch (251:9): [True: 120, False: 3.33k]
+  Branch (251:26): [True: 1.19k, False: 2.13k]
+
  MC/DC Decision Region (251:9) to (251:69)
+
+  Number of Conditions: 2
+     Condition C1 --> (251:9)
+     Condition C2 --> (251:26)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
252
1.31k
        return {GasCostMax, 0};
253
254
2.13k
    const auto k = input.size() / BLS12_G2_MUL_INPUT_SIZE;
255
2.13k
    assert(k > 0);
256
2.13k
    const auto discount = DISCOUNTS[std::min(k, std::size(DISCOUNTS)) - 1];
257
2.13k
    const auto cost = (G2MUL_GAS_COST * discount * static_cast<int64_t>(k)) / 1000;
258
2.13k
    return {cost, BLS12_G2_POINT_SIZE};
259
3.45k
}
260
261
PrecompileAnalysis bls12_pairing_check_analyze(bytes_view input, evmc_revision) noexcept
262
846
{
263
846
    static constexpr auto PAIR_SIZE = BLS12_G1_POINT_SIZE + BLS12_G2_POINT_SIZE;
264
265
846
    if (input.empty() || 
input.size() % PAIR_SIZE != 0734
)
  Branch (265:9): [True: 112, False: 734]
+  Branch (265:26): [True: 232, False: 502]
+
  MC/DC Decision Region (265:9) to (265:55)
+
+  Number of Conditions: 2
+     Condition C1 --> (265:9)
+     Condition C2 --> (265:26)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
266
344
        return {GasCostMax, 0};
267
268
502
    const auto npairs = static_cast<int64_t>(input.size()) / PAIR_SIZE;
269
270
502
    static constexpr auto BLS12_PAIRING_CHECK_BASE_FEE_PRECOMPILE_GAS = 37700;
271
502
    static constexpr auto BLS12_PAIRING_CHECK_FEE_PRECOMPILE_GAS = 32600;
272
502
    return {BLS12_PAIRING_CHECK_BASE_FEE_PRECOMPILE_GAS +
273
502
                BLS12_PAIRING_CHECK_FEE_PRECOMPILE_GAS * npairs,
274
502
        32};
275
846
}
276
277
PrecompileAnalysis bls12_map_fp_to_g1_analyze(bytes_view, evmc_revision) noexcept
278
330
{
279
330
    static constexpr auto BLS12_MAP_FP_TO_G1_PRECOMPILE_GAS = 5500;
280
330
    return {BLS12_MAP_FP_TO_G1_PRECOMPILE_GAS, BLS12_G1_POINT_SIZE};
281
330
}
282
283
PrecompileAnalysis bls12_map_fp2_to_g2_analyze(bytes_view, evmc_revision) noexcept
284
318
{
285
318
    static constexpr auto BLS12_MAP_FP2_TO_G2_PRECOMPILE_GAS = 23800;
286
318
    return {BLS12_MAP_FP2_TO_G2_PRECOMPILE_GAS, BLS12_G2_POINT_SIZE};
287
318
}
288
289
PrecompileAnalysis p256verify_analyze(bytes_view, evmc_revision) noexcept
290
806
{
291
806
    return {6900, 32};
292
806
}
293
294
ExecutionResult ecrecover_execute(const uint8_t* input, size_t input_size, uint8_t* output,
295
    [[maybe_unused]] size_t output_size) noexcept
296
2.36k
{
297
2.36k
    assert(output_size >= 32);
298
299
2.36k
    uint8_t input_buffer[128]{};
300
2.36k
    if (input_size != 0)
  Branch (300:9): [True: 2.03k, False: 330]
+
301
2.03k
        std::memcpy(input_buffer, input, std::min(input_size, std::size(input_buffer)));
302
303
2.36k
    ethash::hash256 h{};
304
2.36k
    std::memcpy(h.bytes, input_buffer, sizeof(h));
305
306
2.36k
    const auto v = intx::be::unsafe::load<intx::uint256>(input_buffer + 32);
307
2.36k
    if (v != 27 && 
v != 281.60k
)
  Branch (307:9): [True: 1.09k, False: 1.26k]
+  Branch (307:9): [True: 1.60k, False: 754]
+  Branch (307:20): [True: 1.09k, False: 510]
+
  MC/DC Decision Region (307:9) to (307:27)
+
+  Number of Conditions: 2
+     Condition C1 --> (307:9)
+     Condition C2 --> (307:20)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
308
1.09k
        return {EVMC_SUCCESS, 0};
309
1.26k
    const bool parity = v == 28;
310
311
1.26k
    const auto r = intx::be::unsafe::load<intx::uint256>(input_buffer + 64);
312
1.26k
    const auto s = intx::be::unsafe::load<intx::uint256>(input_buffer + 96);
313
314
1.26k
    const auto res = evmmax::secp256k1::ecrecover(h, r, s, parity);
315
1.26k
    if (res)
  Branch (315:9): [True: 832, False: 432]
+
316
832
    {
317
832
        std::memset(output, 0, 12);
318
832
        std::memcpy(output + 12, res->bytes, 20);
319
832
        return {EVMC_SUCCESS, 32};
320
832
    }
321
432
    else
322
432
        return {EVMC_SUCCESS, 0};
323
1.26k
}
324
325
ExecutionResult sha256_execute(const uint8_t* input, size_t input_size, uint8_t* output,
326
    [[maybe_unused]] size_t output_size) noexcept
327
19.7k
{
328
19.7k
    assert(output_size >= 32);
329
19.7k
    crypto::sha256(reinterpret_cast<std::byte*>(output), reinterpret_cast<const std::byte*>(input),
330
19.7k
        input_size);
331
19.7k
    return {EVMC_SUCCESS, 32};
332
19.7k
}
333
334
ExecutionResult ripemd160_execute(const uint8_t* input, size_t input_size, uint8_t* output,
335
    [[maybe_unused]] size_t output_size) noexcept
336
1.16k
{
337
1.16k
    assert(output_size >= 32);
338
1.16k
    output = std::fill_n(output, 12, std::uint8_t{0});
339
1.16k
    crypto::ripemd160(reinterpret_cast<std::byte*>(output),
340
1.16k
        reinterpret_cast<const std::byte*>(input), input_size);
341
1.16k
    return {EVMC_SUCCESS, 32};
342
1.16k
}
343
344
static std::tuple<std::span<const uint8_t>, std::span<const uint8_t>, std::span<const uint8_t>>
345
expmod_parse_input(
346
    const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept
347
4.33k
{
348
4.33k
    static constexpr auto LEN_SIZE = sizeof(intx::uint256);
349
4.33k
    static constexpr auto HEADER_SIZE = 3 * LEN_SIZE;
350
4.33k
    static constexpr auto LEN32_OFF = LEN_SIZE - sizeof(uint32_t);
351
352
    // The output size equal to the modulus size.
353
4.33k
    const auto mod_len = output_size;
354
355
    // Handle short incomplete input up front. The answer is 0 of the length of the modulus.
356
4.33k
    if (input_size <= HEADER_SIZE) [[unlikely]]
  Branch (356:9): [True: 526, False: 3.80k]
+
357
526
    {
358
526
        std::fill_n(output, output_size, 0);
359
526
        return {};
360
526
    }
361
362
3.80k
    const auto base_len = intx::be::unsafe::load<uint32_t>(&input[LEN32_OFF]);
363
3.80k
    const auto exp_len = intx::be::unsafe::load<uint32_t>(&input[LEN_SIZE + LEN32_OFF]);
364
3.80k
    assert(intx::be::unsafe::load<uint32_t>(&input[2 * LEN_SIZE + LEN32_OFF]) == mod_len);
365
366
3.80k
    const size_t mod_off = base_len + exp_len;  // Cannot overflow if gas cost computed before.
367
3.80k
    const size_t payload_max_size = mod_off + mod_len;  // Input may contain extra bytes.
368
3.80k
    const std::span payload{
369
3.80k
        input + HEADER_SIZE, std::min(input_size - HEADER_SIZE, payload_max_size)};
370
3.80k
    const auto mod_explicit = payload.subspan(std::min(mod_off, payload.size()));
371
372
    // Handle the mod being zero early.
373
    // This serves two purposes:
374
    // - bigint libraries don't like such a modulus because division by 0 is not well-defined,
375
    // - having non-zero modulus guarantees that base and exp aren't out-of-bounds.
376
34.5k
    if (
std::ranges::all_of(mod_explicit, [](uint8_t b) 3.80k
{ return b == 0; })) [[unlikely]]
  Branch (376:9): [True: 554, False: 3.25k]
+
377
554
    {
378
        // The modulus is zero, so the result is zero.
379
554
        std::fill_n(output, output_size, 0);
380
554
        return {};
381
554
    }
382
383
3.25k
    const auto mod_requires_padding = mod_explicit.size() != mod_len;
384
3.25k
    if (mod_requires_padding) [[unlikely]]
  Branch (384:9): [True: 278, False: 2.97k]
+
385
278
    {
386
        // The modulus is the last argument, and some of its bytes may be missing and be implicitly
387
        // zero. In this case, copy the explicit modulus bytes to the output buffer and pad the rest
388
        // with zeroes. The output buffer is guaranteed to have exactly the modulus size.
389
278
        const auto [_, output_p] = std::ranges::copy(mod_explicit, output);
390
278
        std::fill(output_p, output + output_size, 0);
391
278
    }
392
393
3.25k
    const auto base = payload.subspan(0, base_len);
394
3.25k
    const auto exp = payload.subspan(base_len, exp_len);
395
3.25k
    const auto mod = mod_requires_padding ? 
std::span{output, mod_len}278
:
mod_explicit2.97k
;
  Branch (395:22): [True: 278, False: 2.97k]
+
396
397
3.25k
    return {base, exp, mod};
398
3.80k
}
399
400
ExecutionResult expmod_execute(
401
    const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept
402
4.33k
{
403
4.33k
    const auto [base, exp, mod] = expmod_parse_input(input, input_size, output, output_size);
404
4.33k
    if (mod.empty())
  Branch (404:9): [True: 1.08k, False: 3.25k]
+
405
1.08k
        return {EVMC_SUCCESS, output_size};
406
407
3.25k
    if (std::max(base.size(), mod.size()) <= MODEXP_LEN_LIMIT_EIP7823)
  Branch (407:9): [True: 3.25k, False: 1]
+
408
3.25k
    {
409
3.25k
        crypto::modexp(base, exp, mod, output);
410
3.25k
        return {EVMC_SUCCESS, output_size};
411
3.25k
    }
412
413
#ifdef EVMONE_PRECOMPILES_GMP
414
    expmod_gmp(base, exp, mod, output);
415
#else
416
1
    expmod_stub(base, exp, mod, output);
417
1
#endif
418
1
    return {EVMC_SUCCESS, mod.size()};
419
3.25k
}
420
421
#ifdef EVMONE_PRECOMPILES_GMP
422
ExecutionResult expmod_execute_gmp(
423
    const uint8_t* input, size_t input_size, uint8_t* output, size_t output_size) noexcept
424
{
425
    const auto [base, exp, mod] = expmod_parse_input(input, input_size, output, output_size);
426
    if (mod.empty())
427
        return {EVMC_SUCCESS, output_size};
428
429
    expmod_gmp(base, exp, mod, output);
430
    return {EVMC_SUCCESS, mod.size()};
431
}
432
#endif
433
434
ExecutionResult ecadd_execute(const uint8_t* input, size_t input_size, uint8_t* output,
435
    [[maybe_unused]] size_t output_size) noexcept
436
2.95k
{
437
2.95k
    assert(output_size >= 64);
438
439
2.95k
    uint8_t input_buffer[128]{};
440
2.95k
    if (input_size != 0)
  Branch (440:9): [True: 2.63k, False: 318]
+
441
2.63k
        std::memcpy(input_buffer, input, std::min(input_size, std::size(input_buffer)));
442
443
2.95k
    const auto input_span = std::span{input_buffer};
444
445
2.95k
    using namespace evmmax::bn254;
446
447
2.95k
    const auto p = AffinePoint::from_bytes(input_span.subspan<0, 64>());
448
2.95k
    const auto q = AffinePoint::from_bytes(input_span.subspan<64, 64>());
449
450
2.95k
    if (validate(p) && 
validate(q)2.69k
)
  Branch (450:9): [True: 2.69k, False: 260]
+  Branch (450:24): [True: 2.61k, False: 72]
+
  MC/DC Decision Region (450:9) to (450:35)
+
+  Number of Conditions: 2
+     Condition C1 --> (450:9)
+     Condition C2 --> (450:24)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
451
2.61k
    {
452
2.61k
        const auto res = evmmax::ecc::add(p, q);
453
2.61k
        const std::span<uint8_t, 64> output_span{output, 64};
454
2.61k
        res.to_bytes(output_span);
455
2.61k
        return {EVMC_SUCCESS, output_span.size()};
456
2.61k
    }
457
332
    else
458
332
        return {EVMC_PRECOMPILE_FAILURE, 0};
459
2.95k
}
460
461
ExecutionResult ecmul_execute(const uint8_t* input, size_t input_size, uint8_t* output,
462
    [[maybe_unused]] size_t output_size) noexcept
463
6.46k
{
464
6.46k
    assert(output_size >= 64);
465
466
6.46k
    uint8_t input_buffer[96]{};
467
6.46k
    if (input_size != 0)
  Branch (467:9): [True: 6.14k, False: 318]
+
468
6.14k
        std::memcpy(input_buffer, input, std::min(input_size, std::size(input_buffer)));
469
470
6.46k
    const auto input_span = std::span{input_buffer};
471
472
6.46k
    using namespace evmmax::bn254;
473
474
6.46k
    const auto p = AffinePoint::from_bytes(input_span.subspan<0, 64>());
475
6.46k
    const auto c = intx::be::unsafe::load<intx::uint256>(input_buffer + 64);
476
477
6.46k
    if (validate(p))
  Branch (477:9): [True: 4.62k, False: 1.83k]
+
478
4.62k
    {
479
4.62k
        const auto res = evmmax::bn254::mul(p, c);
480
4.62k
        const std::span<uint8_t, 64> output_span{output, 64};
481
4.62k
        res.to_bytes(output_span);
482
4.62k
        return {EVMC_SUCCESS, output_span.size()};
483
4.62k
    }
484
1.83k
    else
485
1.83k
        return {EVMC_PRECOMPILE_FAILURE, 0};
486
6.46k
}
487
488
ExecutionResult ecpairing_execute(const uint8_t* input, size_t input_size, uint8_t* output,
489
    [[maybe_unused]] size_t output_size) noexcept
490
1.76k
{
491
1.76k
    static constexpr auto OUTPUT_SIZE = 32;
492
1.76k
    static constexpr size_t PAIR_SIZE = 192;
493
1.76k
    assert(output_size >= OUTPUT_SIZE);
494
495
1.76k
    if (input_size % PAIR_SIZE != 0)
  Branch (495:9): [True: 142, False: 1.62k]
+
496
142
        return {EVMC_PRECOMPILE_FAILURE, 0};
497
498
1.62k
    std::vector<std::pair<evmmax::bn254::Point, evmmax::bn254::ExtPoint>> pairs;
499
1.62k
    pairs.reserve(input_size / PAIR_SIZE);
500
4.46k
    for (auto input_ptr = input; input_ptr != input + input_size; 
input_ptr += PAIR_SIZE2.84k
)
  Branch (500:34): [True: 2.84k, False: 1.62k]
+
501
2.84k
    {
502
2.84k
        const evmmax::bn254::Point p{
503
2.84k
            intx::be::unsafe::load<intx::uint256>(input_ptr),
504
2.84k
            intx::be::unsafe::load<intx::uint256>(input_ptr + 32),
505
2.84k
        };
506
2.84k
        const evmmax::bn254::ExtPoint q{
507
2.84k
            {intx::be::unsafe::load<intx::uint256>(input_ptr + 96),
508
2.84k
                intx::be::unsafe::load<intx::uint256>(input_ptr + 64)},
509
2.84k
            {intx::be::unsafe::load<intx::uint256>(input_ptr + 160),
510
2.84k
                intx::be::unsafe::load<intx::uint256>(input_ptr + 128)},
511
2.84k
        };
512
2.84k
        pairs.emplace_back(p, q);
513
2.84k
    }
514
515
1.62k
    const auto res = evmmax::bn254::pairing_check(pairs);
516
1.62k
    if (!res.has_value())
  Branch (516:9): [True: 798, False: 822]
+
517
798
        return {EVMC_PRECOMPILE_FAILURE, 0};
518
519
822
    std::fill_n(output, OUTPUT_SIZE, 0);
520
822
    output[OUTPUT_SIZE - 1] = *res ? 
1744
:
078
;
  Branch (520:31): [True: 744, False: 78]
+
521
822
    return {EVMC_SUCCESS, OUTPUT_SIZE};
522
1.62k
}
523
524
ExecutionResult identity_execute(const uint8_t* input, size_t input_size, uint8_t* output,
525
    [[maybe_unused]] size_t output_size) noexcept
526
4.85k
{
527
4.85k
    assert(output_size >= input_size);
528
4.85k
    std::copy_n(input, input_size, output);
529
4.85k
    return {EVMC_SUCCESS, input_size};
530
4.85k
}
531
532
ExecutionResult blake2bf_execute(const uint8_t* input, [[maybe_unused]] size_t input_size,
533
    uint8_t* output, [[maybe_unused]] size_t output_size) noexcept
534
1.16k
{
535
1.16k
    static_assert(std::endian::native == std::endian::little,
536
1.16k
        "blake2bf only works correctly on little-endian architectures");
537
1.16k
    assert(input_size >= 213);
538
1.16k
    assert(output_size >= 64);
539
540
1.16k
    const auto rounds = intx::be::unsafe::load<uint32_t>(input);
541
1.16k
    input += sizeof(rounds);
542
543
1.16k
    uint64_t h[8];
544
1.16k
    std::memcpy(h, input, sizeof(h));
545
1.16k
    input += sizeof(h);
546
547
1.16k
    uint64_t m[16];
548
1.16k
    std::memcpy(m, input, sizeof(m));
549
1.16k
    input += sizeof(m);
550
551
1.16k
    uint64_t t[2];
552
1.16k
    std::memcpy(t, input, sizeof(t));
553
1.16k
    input += sizeof(t);
554
555
1.16k
    const auto f = *input;
556
1.16k
    if (f != 0 && 
f != 1896
) [[unlikely]]
  Branch (556:9): [True: 896, False: 272]
+  Branch (556:19): [True: 144, False: 752]
+
  MC/DC Decision Region (556:9) to (556:25)
+
+  Number of Conditions: 2
+     Condition C1 --> (556:9)
+     Condition C2 --> (556:19)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
557
144
        return {EVMC_PRECOMPILE_FAILURE, 0};
558
559
1.02k
    crypto::blake2b_compress(rounds, h, m, t, f != 0);
560
1.02k
    std::memcpy(output, h, sizeof(h));
561
1.02k
    return {EVMC_SUCCESS, sizeof(h)};
562
1.16k
}
563
564
ExecutionResult point_evaluation_execute(const uint8_t* input, size_t input_size, uint8_t* output,
565
    [[maybe_unused]] size_t output_size) noexcept
566
1.22k
{
567
1.22k
    assert(output_size >= 64);
568
1.22k
    if (input_size != 192)
  Branch (568:9): [True: 314, False: 906]
+
569
314
        return {EVMC_PRECOMPILE_FAILURE, 0};
570
571
906
    const auto r = crypto::kzg_verify_proof(reinterpret_cast<const std::byte*>(&input[0]),
572
906
        reinterpret_cast<const std::byte*>(&input[32]),
573
906
        reinterpret_cast<const std::byte*>(&input[64]),
574
906
        reinterpret_cast<const std::byte*>(&input[96]),
575
906
        reinterpret_cast<const std::byte*>(&input[96 + 48]));
576
577
906
    if (!r)
  Branch (577:9): [True: 486, False: 420]
+
578
486
        return {EVMC_PRECOMPILE_FAILURE, 0};
579
580
    // Return FIELD_ELEMENTS_PER_BLOB and BLS_MODULUS as padded 32 byte big endian values
581
    // as required by the EIP-4844.
582
420
    intx::be::unsafe::store(output, crypto::FIELD_ELEMENTS_PER_BLOB);
583
420
    intx::be::unsafe::store(output + 32, crypto::BLS_MODULUS);
584
420
    return {EVMC_SUCCESS, 64};
585
906
}
586
587
ExecutionResult bls12_g1add_execute(const uint8_t* input, size_t input_size, uint8_t* output,
588
    [[maybe_unused]] size_t output_size) noexcept
589
522
{
590
522
    if (input_size != 2 * BLS12_G1_POINT_SIZE)
  Branch (590:9): [True: 196, False: 326]
+
591
196
        return {EVMC_PRECOMPILE_FAILURE, 0};
592
593
522
    assert(output_size == BLS12_G1_POINT_SIZE);
594
595
326
    if (!crypto::bls::g1_add(output, &output[64], input, &input[64], &input[128], &input[192]))
  Branch (595:9): [True: 144, False: 182]
+
596
144
        return {EVMC_PRECOMPILE_FAILURE, 0};
597
598
182
    return {EVMC_SUCCESS, BLS12_G1_POINT_SIZE};
599
326
}
600
601
ExecutionResult bls12_g1msm_execute(const uint8_t* input, size_t input_size, uint8_t* output,
602
    [[maybe_unused]] size_t output_size) noexcept
603
1.58k
{
604
    // Checked in `_analyze` function which must be called before.
605
1.58k
    assert(input_size % BLS12_G1_MUL_INPUT_SIZE == 0);
606
1.58k
    assert(output_size == BLS12_G1_POINT_SIZE);
607
608
1.58k
    if (input_size == BLS12_G1_MUL_INPUT_SIZE)
  Branch (608:9): [True: 364, False: 1.22k]
+
609
364
    {
610
        // Optimize single multiplication case.
611
364
        if (!crypto::bls::g1_mul(output, &output[64], input, &input[64], &input[128]))
  Branch (611:13): [True: 172, False: 192]
+
612
172
            return {EVMC_PRECOMPILE_FAILURE, 0};
613
364
    }
614
1.22k
    else
615
1.22k
    {
616
1.22k
        if (!crypto::bls::g1_msm(output, &output[64], input, input_size))
  Branch (616:13): [True: 48, False: 1.17k]
+
617
48
            return {EVMC_PRECOMPILE_FAILURE, 0};
618
1.22k
    }
619
620
1.36k
    return {EVMC_SUCCESS, BLS12_G1_POINT_SIZE};
621
1.58k
}
622
623
ExecutionResult bls12_g2add_execute(const uint8_t* input, size_t input_size, uint8_t* output,
624
    [[maybe_unused]] size_t output_size) noexcept
625
546
{
626
546
    if (input_size != 2 * BLS12_G2_POINT_SIZE)
  Branch (626:9): [True: 196, False: 350]
+
627
196
        return {EVMC_PRECOMPILE_FAILURE, 0};
628
629
546
    assert(output_size == BLS12_G2_POINT_SIZE);
630
631
350
    if (!crypto::bls::g2_add(output, &output[128], input, &input[128], &input[256], &input[384]))
  Branch (631:9): [True: 176, False: 174]
+
632
176
        return {EVMC_PRECOMPILE_FAILURE, 0};
633
634
174
    return {EVMC_SUCCESS, BLS12_G2_POINT_SIZE};
635
350
}
636
637
ExecutionResult bls12_g2msm_execute(const uint8_t* input, size_t input_size, uint8_t* output,
638
    [[maybe_unused]] size_t output_size) noexcept
639
1.61k
{
640
    // Checked in `_analyze` function which must be called before.
641
1.61k
    assert(input_size % BLS12_G2_MUL_INPUT_SIZE == 0);
642
1.61k
    assert(output_size == BLS12_G2_POINT_SIZE);
643
644
1.61k
    if (input_size == BLS12_G2_MUL_INPUT_SIZE)
  Branch (644:9): [True: 376, False: 1.23k]
+
645
376
    {
646
        // Optimize single multiplication case.
647
376
        if (!crypto::bls::g2_mul(output, &output[128], input, &input[128], &input[256]))
  Branch (647:13): [True: 184, False: 192]
+
648
184
            return {EVMC_PRECOMPILE_FAILURE, 0};
649
376
    }
650
1.23k
    else
651
1.23k
    {
652
1.23k
        if (!crypto::bls::g2_msm(output, &output[128], input, input_size))
  Branch (652:13): [True: 56, False: 1.17k]
+
653
56
            return {EVMC_PRECOMPILE_FAILURE, 0};
654
1.23k
    }
655
656
1.37k
    return {EVMC_SUCCESS, BLS12_G2_POINT_SIZE};
657
1.61k
}
658
659
ExecutionResult bls12_pairing_check_execute(const uint8_t* input, size_t input_size,
660
    uint8_t* output, [[maybe_unused]] size_t output_size) noexcept
661
414
{
662
    // Checked in `_analyze` function which must be called before.
663
414
    assert(input_size % (BLS12_G1_POINT_SIZE + BLS12_G2_POINT_SIZE) == 0);
664
414
    assert(output_size == 32);
665
666
414
    if (!crypto::bls::pairing_check(output, input, input_size))
  Branch (666:9): [True: 204, False: 210]
+
667
204
        return {EVMC_PRECOMPILE_FAILURE, 0};
668
669
210
    return {EVMC_SUCCESS, 32};
670
414
}
671
672
ExecutionResult bls12_map_fp_to_g1_execute(const uint8_t* input, size_t input_size, uint8_t* output,
673
    [[maybe_unused]] size_t output_size) noexcept
674
318
{
675
318
    if (input_size != BLS12_FIELD_ELEMENT_SIZE)
  Branch (675:9): [True: 200, False: 118]
+
676
200
        return {EVMC_PRECOMPILE_FAILURE, 0};
677
678
318
    assert(output_size == BLS12_G1_POINT_SIZE);
679
680
118
    if (!crypto::bls::map_fp_to_g1(output, &output[64], input))
  Branch (680:9): [True: 36, False: 82]
+
681
36
        return {EVMC_PRECOMPILE_FAILURE, 0};
682
683
82
    return {EVMC_SUCCESS, BLS12_G1_POINT_SIZE};
684
118
}
685
686
ExecutionResult bls12_map_fp2_to_g2_execute(const uint8_t* input, size_t input_size,
687
    uint8_t* output, [[maybe_unused]] size_t output_size) noexcept
688
306
{
689
306
    if (input_size != 2 * BLS12_FIELD_ELEMENT_SIZE)
  Branch (689:9): [True: 200, False: 106]
+
690
200
        return {EVMC_PRECOMPILE_FAILURE, 0};
691
692
306
    assert(output_size == BLS12_G2_POINT_SIZE);
693
694
106
    if (!crypto::bls::map_fp2_to_g2(output, &output[128], input))
  Branch (694:9): [True: 56, False: 50]
+
695
56
        return {EVMC_PRECOMPILE_FAILURE, 0};
696
697
50
    return {EVMC_SUCCESS, BLS12_G2_POINT_SIZE};
698
106
}
699
700
ExecutionResult p256verify_execute(const uint8_t* input, size_t input_size, uint8_t* output,
701
    [[maybe_unused]] size_t output_size) noexcept
702
796
{
703
796
    assert(output_size >= 32);
704
705
796
    if (input_size != 160)
  Branch (705:9): [True: 14, False: 782]
+
706
14
        return {EVMC_SUCCESS, 0};
707
708
782
    ethash::hash256 h{};
709
782
    std::copy_n(input, sizeof(h), h.bytes);
710
782
    const auto r = intx::be::unsafe::load<intx::uint256>(input + 32);
711
782
    const auto s = intx::be::unsafe::load<intx::uint256>(input + 64);
712
782
    const auto qx = intx::be::unsafe::load<intx::uint256>(input + 96);
713
782
    const auto qy = intx::be::unsafe::load<intx::uint256>(input + 128);
714
715
782
    if (!evmmax::secp256r1::verify(h, r, s, qx, qy))
  Branch (715:9): [True: 304, False: 478]
+
716
304
        return {EVMC_SUCCESS, 0};  // In case of invalid signature, return empty output.
717
718
    // Return 1_u256.
719
478
    std::fill_n(output, 31, 0);
720
478
    output[31] = 1;
721
478
    return {EVMC_SUCCESS, 32};
722
782
}
723
724
namespace
725
{
726
using PrecompileLookupIndex = uint16_t;
727
728
struct PrecompileTraits
729
{
730
    PrecompileLookupIndex address = 0;
731
    evmc_revision since = EVMC_FRONTIER;
732
    decltype(identity_analyze)* analyze = nullptr;
733
    decltype(identity_execute)* execute = nullptr;
734
};
735
736
inline constexpr std::array<PrecompileTraits, 18> traits{{
737
    {0x0001, EVMC_FRONTIER, ecrecover_analyze, ecrecover_execute},
738
    {0x0002, EVMC_FRONTIER, sha256_analyze, sha256_execute},
739
    {0x0003, EVMC_FRONTIER, ripemd160_analyze, ripemd160_execute},
740
    {0x0004, EVMC_FRONTIER, identity_analyze, identity_execute},
741
    {0x0005, EVMC_BYZANTIUM, expmod_analyze, expmod_execute},
742
    {0x0006, EVMC_BYZANTIUM, ecadd_analyze, ecadd_execute},
743
    {0x0007, EVMC_BYZANTIUM, ecmul_analyze, ecmul_execute},
744
    {0x0008, EVMC_BYZANTIUM, ecpairing_analyze, ecpairing_execute},
745
    {0x0009, EVMC_ISTANBUL, blake2bf_analyze, blake2bf_execute},
746
    {0x000a, EVMC_CANCUN, point_evaluation_analyze, point_evaluation_execute},
747
    {0x000b, EVMC_PRAGUE, bls12_g1add_analyze, bls12_g1add_execute},
748
    {0x000c, EVMC_PRAGUE, bls12_g1msm_analyze, bls12_g1msm_execute},
749
    {0x000d, EVMC_PRAGUE, bls12_g2add_analyze, bls12_g2add_execute},
750
    {0x000e, EVMC_PRAGUE, bls12_g2msm_analyze, bls12_g2msm_execute},
751
    {0x000f, EVMC_PRAGUE, bls12_pairing_check_analyze, bls12_pairing_check_execute},
752
    {0x0010, EVMC_PRAGUE, bls12_map_fp_to_g1_analyze, bls12_map_fp_to_g1_execute},
753
    {0x0011, EVMC_PRAGUE, bls12_map_fp2_to_g2_analyze, bls12_map_fp2_to_g2_execute},
754
    {0x0100, EVMC_OSAKA, p256verify_analyze, p256verify_execute},
755
}};
756
757
constexpr auto LOOKUP_TABLE_SIZE = [] {
758
    PrecompileLookupIndex max_idx = 0;
759
    for (const auto& trait : traits)
760
        max_idx = std::max(max_idx, trait.address);
761
    return max_idx + 1;
762
}();
763
764
PrecompileLookupIndex to_lookup_index(const evmc::address& addr) noexcept
765
5.51M
{
766
5.51M
    static constexpr auto ADDRESS_SIZE = sizeof(addr.bytes);
767
5.51M
    return static_cast<PrecompileLookupIndex>(
768
5.51M
        (addr.bytes[ADDRESS_SIZE - 2] << 8) | addr.bytes[ADDRESS_SIZE - 1]);
769
5.51M
}
770
}  // namespace
771
772
bool is_precompile(evmc_revision rev, const evmc::address& addr) noexcept
773
7.21M
{
774
7.21M
    static constexpr auto AVAILABILITY_LOOKUP_TABLE = [] {
775
7.21M
        using Entry = std::underlying_type_t<evmc_revision>;
776
7.21M
        std::array<Entry, LOOKUP_TABLE_SIZE> table{};
777
7.21M
        std::ranges::fill(table, std::numeric_limits<Entry>::max());
778
7.21M
        for (const auto& trait : traits)
779
7.21M
            table[trait.address] = stdx::to_underlying(trait.since);
780
7.21M
        return table;
781
7.21M
    }();
782
783
7.21M
    if (addr >= evmc::address{AVAILABILITY_LOOKUP_TABLE.size()})
  Branch (783:9): [True: 3.34M, False: 3.87M]
+
784
3.34M
        return false;
785
3.87M
    return AVAILABILITY_LOOKUP_TABLE[to_lookup_index(addr)] <= stdx::to_underlying(rev);
786
7.21M
}
787
788
evmc::Result call_precompile(evmc_revision rev, const evmc_message& msg) noexcept
789
1.64M
{
790
1.64M
    static constexpr auto EXECUTION_LOOKUP_TABLE = [] {
791
1.64M
        struct Entry
792
1.64M
        {
793
1.64M
            decltype(PrecompileTraits::analyze) analyze = nullptr;
794
1.64M
            decltype(PrecompileTraits::execute) execute = nullptr;
795
1.64M
        };
796
1.64M
        std::array<Entry, LOOKUP_TABLE_SIZE> table{};
797
1.64M
        for (const auto& trait : traits)
798
1.64M
            table[trait.address] = {trait.analyze, trait.execute};
799
1.64M
        return table;
800
1.64M
    }();
801
802
1.64M
    assert(msg.gas >= 0);
803
804
1.64M
    const auto [analyze, execute] = EXECUTION_LOOKUP_TABLE[to_lookup_index(msg.code_address)];
805
806
1.64M
    const bytes_view input{msg.input_data, msg.input_size};
807
1.64M
    const auto [gas_cost, max_output_size] = analyze(input, rev);
808
1.64M
    const auto gas_left = msg.gas - gas_cost;
809
1.64M
    if (gas_left < 0)
  Branch (809:9): [True: 1.58M, False: 52.1k]
+
810
1.58M
        return evmc::Result{EVMC_OUT_OF_GAS};
811
812
    // Allocate buffer for the precompile's output and pass its ownership to evmc::Result.
813
    // TODO: This can be done more elegantly by providing constructor evmc::Result(std::unique_ptr).
814
52.1k
    const auto output_data = new (std::nothrow) uint8_t[max_output_size];
815
52.1k
    const auto [status_code, output_size] =
816
52.1k
        execute(msg.input_data, msg.input_size, output_data, max_output_size);
817
52.1k
    const evmc_result result{status_code, status_code == EVMC_SUCCESS ? 
gas_left46.2k
:
05.92k
, 0,
  Branch (817:43): [True: 46.2k, False: 5.92k]
+
818
52.1k
        output_data, output_size,
819
52.1k
        [](const evmc_result* res) noexcept { delete[] res->output_data; }};
820
52.1k
    return evmc::Result{result};
821
1.64M
}
822
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/precompiles_stubs.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/precompiles_stubs.cpp.html new file mode 100644 index 0000000000..0b378fb05a --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/precompiles_stubs.cpp.html @@ -0,0 +1,37 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/precompiles_stubs.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "precompiles_stubs.hpp"
6
#include <evmc/evmc.hpp>
7
#include <algorithm>
8
#include <cassert>
9
#include <iostream>
10
11
namespace evmone::state
12
{
13
using evmc::bytes;
14
using evmc::bytes_view;
15
16
namespace
17
{
18
/// Returns the expmod result for the known inputs or empty bytes if not found.
19
///
20
/// Missing inputs collected with:
21
/// bin/evmone-statetest test_dirs >/dev/null 2> >(sort | uniq | tee stub.txt)
22
///
23
/// Results computed with:
24
/// ```python
25
/// def e(s):
26
///     b, x, m = s.split(",")
27
///     b = int(b, 16) if b != "0x" else 0
28
///     x = int(x, 16) if x != "0x" else 0
29
///     m = int(m, 16) if m != "0x" else 0
30
///     r = 0
31
///     if m != 0:
32
///         r = pow(b, x, m)
33
///     print(f'{{"{s}","{r:02x}"}},')
34
/// ```
35
bytes expmod_lookup_result(bytes_view base, bytes_view exp, bytes_view mod)
36
0
{
37
0
    static const std::unordered_map<std::string_view, std::string_view> stubs{
38
        // clang-format off
39
0
        {"0xc5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf,0x010001,0xe30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad","5a0eb2bdf0ac1cae8e586689fa16cd4b07dfdedaec8a110ea1fdb059dd5253231b6132987598dfc6e11f86780428982d50cf68f67ae452622c3b336b537ef3298ca645e8f89ee39a26758206a5a3f6409afc709582f95274b57b71fae5c6b74619ae6f089a5393c5b79235d9caf699d23d88fb873f78379690ad8405e34c19f5257d596580c7a6a7206a3712825afe630c76b31cdb4a23e7f0632e10f14f4e282c81a66451a26f8df2a352b5b9f607a7198449d1b926e27036810368e691a74b91c61afa73d9d3b99453e7c8b50fd4f09c039a2f2feb5c419206694c31b92df1d9586140cb3417b38d0c503c7b508cc2ed12e813a1c795e9829eb39ee78eeaf360a169b491a1d4e419574e712402de9d48d54c1ae5e03739b7156615e8267e1fb0a897f067afd11fb33f6e24182d7aaaaa18fe5bc1982f20d6b871e5a398f0f6f718181d31ec225cfa9a0a70124ed9a70031bdf0c1c7829f708b6e17d50419ef361cf77d99c85f44607186c8d683106b8bd38a49b5d0fb503b397a83388c5678dcfcc737499d84512690701ed621a6f0172aecf037184ddf0f2453e4053024018e5ab2e30d6d5363b56e8b41509317c99042f517247474ab3abc848e00a07f69c254f46f2a05cf6ed84e5cc906a518fdcfdf2c61ce731f24c5264f1a25fc04934dc28aec112134dd523f70115074ca34e3807aa4cb925147f3a0ce152d323bd8c675ace446d0fd1ae30c4b57f0eb2c23884bc18f0964c0114796c5b6d080c3d89175665fbf63a6381a6a9da39ad070b645c8bb1779506da14439a9f5b5d481954764ea114fac688930bc68534d403cff4210673b6a6ff7ae416b7cd41404c3d3f282fcd193b86d0f54d0006c2a503b40d5c3930da980565b8f9630e9493a79d1c03e74e5f93ac8e4dc1a901ec5e3b3e57049124c7b72ea345aa359e782285d9e6a5c144a378111dd02c40855ff9c2be9b48425cb0b2fd62dc8678fd151121cf26a65e917d65d8e0dacfae108eb5508b601fb8ffa370be1f9a8b749a2d12eeab81f41079de87e2d777994fa4d28188c579ad327f9957fb7bdecec5c680844dd43cb57cf87aeb763c003e65011f73f8c63442df39a92b946a6bd968a1c1e4d5fa7d88476a68bd8e20e5b70a99259c7d3f85fb1b65cd2e93972e6264e74ebf289b8b6979b9b68a85cd5b360c1987f87235c3c845d62489e33acf85d53fa3561fe3a3aee18924588d9c6eba4edb7a4d106b31173e42929f6f0c48c80ce6a72d54eca7c0fe870068b7a7c89c63cdda593f5b32d3cb4ea8a32c39f00ab449155757172d66763ed9527019d6de6c9f2416aa6203f4d11c9ebee1e1d3845099e55504446448027212616167eb36035726daa7698b075286f5379cd3e93cb3e0cf4f9cb8d017facbb5550ed32d5ec5400ae57e47e2bf78d1eaeff9480cc765ceff39db500"},
40
0
        {"0xc5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf,0x02,0xe30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad","d61fe4e3f32ac260915b5b03b78a86d11bfc41d973fce5b0cc59035cf8289a8a2e3878ea15fa46565b0d806e2f85b53873ea20ed653869b688adf83f3ef444535bf91598ff7e80f334fb782539b92f39f55310cc4b35349ab7b278346eda9bc37c0d8acd3557fae38197f412f8d9e57ce6a76b7205c23564cab06e5615be7c6f05c3d05ec690cba91da5e89d55b152ff8dd2157dc5458190025cf94b1ad98f7cbe64e9482faba95e6b33844afc640892872b44a9932096508f4a782a4805323808f23e54b6ff9b841dbfa87db3505ae4f687972c18ea0f0d0af89d36c1c2a5b14560c153c3fee406f5cf15cfd1c0bb45d767426d465f2f14c158495069d0c5955a00150707862ecaae30624ebacdd8ac33e4e6aab3ff90b6ba445a84689386b9e945d01823a65874444316e83767290fcff630d2477f49d5d8ffdd200e08ee1274270f86ed14c687895f6caf5ce528bd970c20d2408a9ba66216324c6a011ac4999098362dbd98a038129a2d40c8da6ab88318aa3046cb660327cc44236d9e5d2163bd0959062195c51ed93d0088b6f92051fc99050ece2538749165976233697ab4b610385366e5ce0b02ad6b61c168ecfbedcdf74278a38de340fd7a5fead8e588e294795f9b011e2e60377a89e25c90e145397cdeabc60fd32444a6b7642a611a83c464d8b8976666351b4865c37b02e6dc21dbcdf5f930341707b618cc0f03c3122646b3385c9df9f2ec730eec9d49e7dfc9153b6e6289da8c4f0ebea9ccc1b751948e3bb7171c9e4d57423b0eeeb79095c030cb52677b3f7e0b45c30f645391f3f9c957afa549c4e0b2465b03c67993cd200b1af01035962edbc4c9e89b31c82ac121987d6529dafdeef67a132dc04b6dc68e77f22862040b75e2ceb9ff16da0fca534e6db7bd12fa7b7f51b6c08c1e23dfcdb7acbd2da0b51c87ffbced065a612e9b1c8bba9b7e2d8d7a2f04fcc4aaf355b60d764879a76b5e16762d5f2f55d585d0c8e82df6940960cddfb72c91dfa71f6b4e1c6ca25dfc39a878e998a663c04fe29d5e83b9586d047b4d7ff70a9f0d44f127e7d741685ca75f11629128d916a0ffef4be586a30c4b70389cc746e84ebf177c01ee8a4511cfbb9d1ecf7f7b33c7dd8177896e10bbc82f838dcd6db7ac67de62bf46b6a640fb580c5d1d2708f3862e3d2b645d0d18e49ef088053e3a220adc0e033c2afcfe61c90e32151152eb3caaf746c5e377d541cafc6cbb0cc0fa48b5caf1728f2e1957f5addfc234f1a9d89e40d49356c9172d0561a695fce6dab1d412321bbf407f63766ffd7b6b3d79bcfa07991c5a9709849c1008689e3b47c50d613980bec239fb64185249d055b30375ccb4354d71fe4d05648fbf6c80634dfc3575f2f24abb714c1e4c95e8896763bf4316e954c7ad19e5780ab7a040ca6fb9271f90a8b22ae738daf6cb"},
41
0
        {"0xc5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf,0x03,0xe30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad","5f9c70ec884926a89461056ad20ac4c30155e817f807e4d3f5bb743d789c83386762435c3627773fa77da5144451f2a8aad8adba88e0b669f5377c5e9bad70e45c86fe952b613f015a9953b8a5de5eaee4566acf98d41e327d93a35bd5cef4607d025e58951167957df4ff9b1627649d3943805472e5e293d3efb687cfd1e503faafeb2840a3e3b3f85d016051a58e1c9498aab72e63b748d834b31eb05d85dcde65e27834e266b85c75cc4ec0135135e0601cb93eeeb6e0010c8ceb65c4c319623c5e573a2c8c9fbbf7df68a930beb412d3f4dfd146175484f45d7afaa0d2e60684af9b34730f7c8438465ad3e1d0c3237336722f2aa51095bd5759f4b8ab4dda111b684aa3dac62a761722e7ae43495b7709933512c81c4e3c9133a51f7ce9f2b51fcec064f65779666960b4e45df3900f54311f5613e8012dd1b8efd359eda31a778264c72aa8bb419d862734d769076bce2810011989a45374e5c5d8729fec21427f0bf397eacbb4220f603cf463a4b0c94efd858ffd9768cd60d6ce68d755e0fbad007ce5c2223d70c7018345a102e4ab3c60a13a9e7794303156d4c2063e919f2153c13961fb324c80b240742f47773a7a8e25b3e3fb19b00ce839346c6eb3c732fbc6b888df0b1fe0a3d07b053a2e9402c267b2d62f794d8a2840526e3ade15ce2264496ccd7519571dfde47f7a4bb16292241c20b2be59f3f8fb4f6383f232d838c5a22d8c95b6834d9d2ca493f5a505ebe8899503b0e8f9b19e6e2dd81c1628b80016d02097e0134de51054c4e7674824d4d758760fc52377d2cad145e259aa2ffaf54139e1a66b1e0c1c191e32ac59474c6b526f5b3ba07d3e5ec286eddf531fcd5292869be58c9f22ef91026159f7cf9d05ef66b4299f4da48cc1635bf2243051d342d378a22c83390553e873713c0454ce5f3234397111ac3fe3207b86f0ed9fc025c81903e1748103692074f83824fda6341be4f95ff00b0a9a208c267e12fa01825054cc0513629bf3dbb56dc5b90d4316f87654a8be18227978ea0a8a522760cad620d0d14fd38920fb7321314062914275a5f99f677145a6979b156bd82ecd36f23f8e1273cc2759ecc0b2c69d94dad5211d1bed939dd87ed9e07b91d49713a6e16ade0a98aea789f04994e318e4ff2c8a188cd8d43aeb52c6daa3bc29b4af50ea82a247c5cd67b573b34cbadcc0a376d3bbd530d50367b42705d870f2e27a8197ef46070528bfe408360faa2ebb8bf76e9f388572842bcb119f4d84ee34ae31f5cc594f23705a49197b181fb78ed1ec99499c690f843a4d0cf2e226d118e9372271054fbabdcc5c92ae9fefaef0589cd0e722eaf30c1703ec4289c7fd81beaa8a455ccee5298e31e2080c10c366a6fcf56f7d13582ad0bcad037c612b710fc595b70fbefaaca23623b60c6c39b11beb8e5843b6b3dac60f"},
42
        // clang-format on
43
0
    };
44
45
    /// Combine the arguments into a key. It can be copy-pasted to python's pow().
46
0
    const auto key = "0x" + evmc::hex({base.data(), base.size()}) +  //
47
0
                     ",0x" + evmc::hex({exp.data(), exp.size()}) +   //
48
0
                     ",0x" + evmc::hex({mod.data(), mod.size()});    //
49
50
0
    const auto it = stubs.find(key);
51
0
    if (it == stubs.end())
  Branch (51:9): [True: 0, False: 0]
+
52
0
    {
53
0
        std::cerr << "expmod: no result for " << key << "\n";
54
0
        return {};
55
0
    }
56
0
    return evmc::from_hex(it->second).value();
57
0
}
58
}  // namespace
59
60
61
void expmod_stub(std::span<const uint8_t> in_base, std::span<const uint8_t> in_exp,
62
    std::span<const uint8_t> in_mod, uint8_t* output) noexcept
63
1
{
64
1
    bytes_view base{in_base.data(), in_base.size()};
65
1
    bytes_view exp{in_exp.data(), in_exp.size()};
66
1
    bytes_view mod{in_mod.data(), in_mod.size()};
67
68
    // Keep the output size before the mod normalization.
69
1
    const auto output_size = mod.size();
70
71
    // Normalize arguments by removing leading zeros.
72
1
    base = base.substr(std::min(base.find_first_not_of(uint8_t{0}), base.size()));
73
1
    exp = exp.substr(std::min(exp.find_first_not_of(uint8_t{0}), exp.size()));
74
1
    mod = mod.substr(std::min(mod.find_first_not_of(uint8_t{0}), mod.size()));
75
1
    assert(!mod.empty());  // mod must not be 0.
76
77
    // Figure out the result by handling trivial cases
78
    // or finally looking it up in the predefined set of results.
79
1
    const auto result = [&]() -> bytes {
80
        // For mod == 1 the result is 0.
81
1
        if (mod.size() == 1 && mod[0] == 1)
  Branch (81:13): [True: 1, False: 0]
+  Branch (81:32): [True: 0, False: 1]
+
  MC/DC Decision Region (81:13) to (81:43)
+
+  Number of Conditions: 2
+     Condition C1 --> (81:13)
+     Condition C2 --> (81:32)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { T,  F  = F      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
82
0
            return bytes{};
83
84
        // For exp == 0 and mod > 1 the result is 1.
85
1
        if (exp.empty())
  Branch (85:13): [True: 1, False: 0]
+
86
1
            return bytes{1};
87
88
        // For base <= 1, exp != 0, mod > 1 the result is base.
89
0
        if (base.empty() || (base.size() == 1 && base[0] == 1))
  Branch (89:13): [True: 0, False: 0]
+  Branch (89:30): [True: 0, False: 0]
+  Branch (89:50): [True: 0, False: 0]
+
  MC/DC Decision Region (89:13) to (89:63)
+
+  Number of Conditions: 3
+     Condition C1 --> (89:13)
+     Condition C2 --> (89:30)
+     Condition C3 --> (89:50)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  C3-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
90
0
            return bytes{base};
91
92
0
        return expmod_lookup_result(base, exp, mod);
93
0
    }();
94
95
    // Set the result in the output buffer.
96
1
    const auto output_p = std::fill_n(output, output_size - result.size(), 0);
97
1
    std::ranges::copy(result, output_p);
98
1
}
99
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/requests.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/requests.cpp.html new file mode 100644 index 0000000000..851224acaa --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/requests.cpp.html @@ -0,0 +1,77 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/requests.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "requests.hpp"
6
#include <evmone_precompiles/sha256.hpp>
7
8
namespace evmone::state
9
{
10
namespace
11
{
12
consteval uint32_t pad_to_words(uint32_t size) noexcept
13
{
14
    return ((size + 31) / 32) * 32;
15
}
16
}  // namespace
17
18
hash256 calculate_requests_hash(std::span<const Requests> block_requests_list)
19
44.9k
{
20
44.9k
    bytes requests_hash_list;
21
44.9k
    requests_hash_list.reserve(sizeof(hash256) * block_requests_list.size());
22
23
44.9k
    for (const auto& requests : block_requests_list)
  Branch (23:31): [True: 134k, False: 44.9k]
+
24
134k
    {
25
134k
        if (requests.data().empty())
  Branch (25:13): [True: 134k, False: 749]
+
26
134k
            continue;  // Skip empty requests.
27
28
749
        hash256 requests_hash;
29
749
        crypto::sha256(reinterpret_cast<std::byte*>(requests_hash.bytes),
30
749
            reinterpret_cast<const std::byte*>(requests.raw_data.data()), requests.raw_data.size());
31
749
        requests_hash_list += requests_hash;
32
749
    }
33
34
44.9k
    hash256 block_requests_hash;
35
44.9k
    crypto::sha256(reinterpret_cast<std::byte*>(block_requests_hash.bytes),
36
44.9k
        reinterpret_cast<const std::byte*>(requests_hash_list.data()), requests_hash_list.size());
37
44.9k
    return block_requests_hash;
38
44.9k
}
39
40
std::optional<Requests> collect_deposit_requests(std::span<const TransactionReceipt> receipts)
41
47.0k
{
42
    // Browse all logs from all transactions.
43
47.0k
    Requests requests(Requests::Type::deposit);
44
47.0k
    for (const auto& receipt : receipts)
  Branch (44:30): [True: 49.1k, False: 47.0k]
+
45
49.1k
    {
46
49.1k
        for (const auto& log : receipt.logs)
  Branch (46:30): [True: 9.21k, False: 49.0k]
+
47
9.21k
        {
48
            // Follow the EIP-6110 pseudocode for block validity.
49
            // https://eips.ethereum.org/EIPS/eip-6110#block-validity
50
51
            // Filter out logs by the contact address and the log first topic.
52
9.21k
            if (log.addr != DEPOSIT_CONTRACT_ADDRESS)
  Branch (52:17): [True: 7.65k, False: 1.56k]
+
53
7.65k
                continue;
54
1.56k
            if (log.topics.empty() || 
log.topics[0] != DEPOSIT_EVENT_SIGNATURE_HASH1.56k
)
  Branch (54:17): [True: 4, False: 1.56k]
+  Branch (54:39): [True: 4, False: 1.55k]
+
  MC/DC Decision Region (54:17) to (54:84)
+
+  Number of Conditions: 2
+     Condition C1 --> (54:17)
+     Condition C2 --> (54:39)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+  2 { F,  T  = T      }
+  3 { T,  -  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
55
8
                continue;
56
57
            // Validate the layout of the log. If it doesn't match the EIP spec,
58
            // the requests' collection is failed.
59
1.55k
            if (log.data.size() != 576)
  Branch (59:17): [True: 4, False: 1.55k]
+
60
4
                return std::nullopt;
61
62
            // Deposit log definition
63
            // https://github.com/ethereum/consensus-specs/blob/dev/solidity_deposit_contract/deposit_contract.sol
64
            // event DepositEvent(
65
            //     bytes pubkey,
66
            //     bytes withdrawal_credentials,
67
            //     bytes amount,
68
            //     bytes signature,
69
            //     bytes index
70
            // );
71
            //
72
            // In ABI a word with its size prepends every bytes array.
73
            // Skip over the first 5 words (offsets of the values) and the pubkey size.
74
            // Read and validate the ABI offsets and lengths for the dynamic fields
75
            // according to EIP-6110. If any check fails, collection is considered failed.
76
77
15.3k
            
const auto read_word_as_size = [&](size_t pos) -> std::optional<uint32_t> 1.55k
{
78
15.3k
                assert(log.data.size() >= pos + 32);
79
15.3k
                const auto v = intx::be::unsafe::load<uint256>(&log.data[pos]);
80
                // Ensure the encoded bytes fit into uint32_t.
81
15.3k
                if (v > std::numeric_limits<uint32_t>::max())
  Branch (81:21): [True: 20, False: 15.3k]
+
82
20
                    return std::nullopt;
83
15.3k
                return static_cast<uint32_t>(v);
84
15.3k
            };
85
86
1.55k
            static constexpr uint32_t WORD = 32;
87
1.55k
            assert(log.data.size() >= WORD * 5);
88
89
            // Read the 5 offsets from the head (first 5 words).
90
1.55k
            std::array<uint32_t, 5> offsets = {};
91
9.30k
            for (size_t i = 0; i < offsets.size(); 
++i7.74k
)
  Branch (91:32): [True: 7.75k, False: 1.54k]
+
92
7.75k
            {
93
7.75k
                const auto w = read_word_as_size(i * WORD);
94
7.75k
                if (!w)
  Branch (94:21): [True: 10, False: 7.74k]
+
95
10
                    return std::nullopt;
96
7.74k
                offsets[i] = *w;
97
7.74k
            }
98
99
            // Compute expected offsets and lengths (hard-coded from the deposit ABI layout).
100
1.54k
            static constexpr uint32_t DATA_SECTION =
101
1.54k
                WORD * 5;  // where the dynamic data area starts
102
1.54k
            static constexpr uint32_t PUBKEY_OFFSET = DATA_SECTION;
103
1.54k
            static constexpr uint32_t PUBKEY_SIZE = 48;
104
1.54k
            static constexpr uint32_t WITHDRAWAL_OFFSET =
105
1.54k
                PUBKEY_OFFSET + WORD + pad_to_words(PUBKEY_SIZE);
106
1.54k
            static constexpr uint32_t WITHDRAWAL_SIZE = 32;
107
1.54k
            static constexpr uint32_t AMOUNT_OFFSET =
108
1.54k
                WITHDRAWAL_OFFSET + WORD + pad_to_words(WITHDRAWAL_SIZE);
109
1.54k
            static constexpr uint32_t AMOUNT_SIZE = 8;
110
1.54k
            static constexpr uint32_t SIGNATURE_OFFSET =
111
1.54k
                AMOUNT_OFFSET + WORD + pad_to_words(AMOUNT_SIZE);
112
1.54k
            static constexpr uint32_t SIGNATURE_SIZE = 96;
113
1.54k
            static constexpr uint32_t INDEX_OFFSET =
114
1.54k
                SIGNATURE_OFFSET + WORD + pad_to_words(SIGNATURE_SIZE);
115
1.54k
            static constexpr uint32_t INDEX_SIZE = 8;
116
117
            // Offsets in the head point to the length-word of each dynamic field.
118
1.54k
            static constexpr std::array EXPECTED_OFFSETS{
119
1.54k
                PUBKEY_OFFSET, WITHDRAWAL_OFFSET, AMOUNT_OFFSET, SIGNATURE_OFFSET, INDEX_OFFSET};
120
121
1.54k
            if (offsets != EXPECTED_OFFSETS)
  Branch (121:17): [True: 10, False: 1.53k]
+
122
10
                return std::nullopt;  // layout does not match expected EIP-6110 deposit layout
123
124
            // Validate sizes of each field encoded in the log.
125
7.63k
            
const auto validate_size_at = [&](uint32_t offset, uint32_t expected_size) -> bool 1.53k
{
126
7.63k
                const auto size = read_word_as_size(offset);
127
7.63k
                return size.has_value() && 
(*size == expected_size)7.62k
;
  Branch (127:24): [True: 7.62k, False: 10]
+  Branch (127:44): [True: 7.61k, False: 10]
+
  MC/DC Decision Region (127:24) to (127:68)
+
+  Number of Conditions: 2
+     Condition C1 --> (127:24)
+     Condition C2 --> (127:44)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
128
7.63k
            };
129
1.53k
            if (!validate_size_at(PUBKEY_OFFSET, PUBKEY_SIZE) ||
  Branch (129:17): [True: 4, False: 1.53k]
+
130
1.53k
                
!validate_size_at(WITHDRAWAL_OFFSET, WITHDRAWAL_SIZE)1.53k
||
  Branch (130:17): [True: 4, False: 1.52k]
+
131
1.53k
                
!validate_size_at(AMOUNT_OFFSET, AMOUNT_SIZE)1.52k
||
  Branch (131:17): [True: 4, False: 1.52k]
+
132
1.53k
                
!validate_size_at(SIGNATURE_OFFSET, SIGNATURE_SIZE)1.52k
||
  Branch (132:17): [True: 4, False: 1.51k]
+
133
1.53k
                
!validate_size_at(INDEX_OFFSET, INDEX_SIZE)1.51k
)
  Branch (133:17): [True: 4, False: 1.51k]
+
  MC/DC Decision Region (129:17) to (133:60)
+
+  Number of Conditions: 5
+     Condition C1 --> (129:17)
+     Condition C2 --> (130:17)
+     Condition C3 --> (131:17)
+     Condition C4 --> (132:17)
+     Condition C5 --> (133:17)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3, C4, C5    Result
+  1 { F,  F,  F,  F,  F  = F      }
+  2 { F,  F,  F,  F,  T  = T      }
+  3 { F,  F,  F,  T,  -  = T      }
+  4 { F,  F,  T,  -,  -  = T      }
+  5 { F,  T,  -,  -,  -  = T      }
+  6 { T,  -,  -,  -,  -  = T      }
+
+  C1-Pair: covered: (1,6)
+  C2-Pair: covered: (1,5)
+  C3-Pair: covered: (1,4)
+  C4-Pair: covered: (1,3)
+  C5-Pair: covered: (1,2)
+  MC/DC Coverage for Expression: 100.00%
+
134
20
            {
135
                // field size does not match expected EIP-6110 deposit layout
136
20
                return std::nullopt;
137
20
            }
138
139
            // Index is padded to the word boundary, so takes 32 bytes.
140
1.53k
            assert(log.data.size() == INDEX_OFFSET + WORD + pad_to_words(INDEX_SIZE));
141
142
1.51k
            requests.append({&log.data[PUBKEY_OFFSET + WORD], PUBKEY_SIZE});
143
1.51k
            requests.append({&log.data[WITHDRAWAL_OFFSET + WORD], WITHDRAWAL_SIZE});
144
1.51k
            requests.append({&log.data[AMOUNT_OFFSET + WORD], AMOUNT_SIZE});
145
1.51k
            requests.append({&log.data[SIGNATURE_OFFSET + WORD], SIGNATURE_SIZE});
146
1.51k
            requests.append({&log.data[INDEX_OFFSET + WORD], INDEX_SIZE});
147
1.51k
        }
148
49.1k
    }
149
47.0k
    return requests;
150
47.0k
}
151
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/requests.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/requests.hpp.html new file mode 100644 index 0000000000..2536d41c87 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/requests.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/requests.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include "hash_utils.hpp"
8
#include "transaction.hpp"
9
#include <evmc/evmc.hpp>
10
#include <span>
11
12
namespace evmone::state
13
{
14
/// The address of the deposit contract.
15
///
16
/// TODO: This address differs in different chains, so it should be configurable.
17
constexpr auto DEPOSIT_CONTRACT_ADDRESS = 0x00000000219ab540356cBB839Cbe05303d7705Fa_address;
18
19
/// The topic of deposit log of the deposit contract.
20
constexpr auto DEPOSIT_EVENT_SIGNATURE_HASH =
21
    0x649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c5_bytes32;
22
23
/// `requests` object.
24
///
25
/// Defined by EIP-7685: General purpose execution layer requests.
26
/// https://eips.ethereum.org/EIPS/eip-7685.
27
struct Requests
28
{
29
    /// The type of the requests.
30
    enum class Type : uint8_t
31
    {
32
        /// Deposit requests.
33
        /// Introduced by EIP-6110 https://eips.ethereum.org/EIPS/eip-6110.
34
        deposit = 0,
35
36
        /// Withdrawal requests.
37
        /// Introduced by EIP-7002 https://eips.ethereum.org/EIPS/eip-7002.
38
        withdrawal = 1,
39
40
        /// Consolidation requests.
41
        /// Introduced by EIP-7251 https://eips.ethereum.org/EIPS/eip-7251.
42
        consolidation = 2,
43
    };
44
45
    /// Raw encoded data of requests object: first byte is type, the rest is request objects.
46
    bytes raw_data;
47
48
    explicit Requests(Type _type, bytes_view data = {})
49
141k
    {
50
141k
        raw_data.reserve(1 + data.size());
51
141k
        raw_data += static_cast<uint8_t>(_type);
52
141k
        raw_data += data;
53
141k
    }
54
55
    /// Requests type.
56
0
    Type type() const noexcept { return static_cast<Type>(raw_data[0]); }
57
58
    /// Requests data - an opaque byte array, contains zero or more encoded request objects.
59
134k
    bytes_view data() const noexcept { return {raw_data.data() + 1, raw_data.size() - 1}; }
60
61
    /// Append data to requests object byte array.
62
7.57k
    void append(bytes_view data) { raw_data.append(data); }
63
};
64
65
/// Calculate commitment value of block requests list
66
hash256 calculate_requests_hash(std::span<const Requests> requests_list);
67
68
/// Construct a requests object from logs of the deposit contract.
69
///
70
/// @return The collected deposit requests or std::nullopt if the collection has failed.
71
std::optional<Requests> collect_deposit_requests(std::span<const TransactionReceipt> receipts);
72
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/state.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/state.cpp.html new file mode 100644 index 0000000000..e310c1ac20 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/state.cpp.html @@ -0,0 +1,262 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/state.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "state.hpp"
6
#include "../utils/stdx/utility.hpp"
7
#include "host.hpp"
8
#include "state_view.hpp"
9
#include <evmone/constants.hpp>
10
#include <evmone/delegation.hpp>
11
#include <evmone_precompiles/secp256k1.hpp>
12
#include <algorithm>
13
14
using namespace intx;
15
16
namespace evmone::state
17
{
18
namespace
19
{
20
/// Secp256k1's N/2 is the upper bound of the signature's s value.
21
constexpr auto SECP256K1N_OVER_2 = evmmax::secp256k1::Curve::ORDER / 2;
22
/// EIP-7702: The cost of authorization that sets delegation to an account that didn't exist before.
23
constexpr auto AUTHORIZATION_EMPTY_ACCOUNT_COST = 25000;
24
/// EIP-7702: The cost of authorization that sets delegation to an account that already exists.
25
constexpr auto AUTHORIZATION_BASE_COST = 12500;
26
27
constexpr int64_t num_words(size_t size_in_bytes) noexcept
28
38.9k
{
29
38.9k
    return static_cast<int64_t>((size_in_bytes + 31) / 32);
30
38.9k
}
31
32
size_t compute_tx_data_tokens(evmc_revision rev, bytes_view data) noexcept
33
153k
{
34
153k
    const auto num_zero_bytes = static_cast<size_t>(std::ranges::count(data, 0));
35
153k
    const auto num_nonzero_bytes = data.size() - num_zero_bytes;
36
37
153k
    const size_t nonzero_byte_multiplier = rev >= EVMC_ISTANBUL ? 
4144k
:
179.06k
;
  Branch (37:44): [True: 144k, False: 9.06k]
+
38
153k
    return (nonzero_byte_multiplier * num_nonzero_bytes) + num_zero_bytes;
39
153k
}
40
41
int64_t compute_access_list_cost(const AccessList& access_list) noexcept
42
153k
{
43
153k
    static constexpr auto ADDRESS_COST = 2400;
44
153k
    static constexpr auto STORAGE_KEY_COST = 1900;
45
46
153k
    int64_t cost = 0;
47
153k
    for (const auto& [_, keys] : access_list)
  Branch (47:32): [True: 164k, False: 153k]
+
48
164k
        cost += ADDRESS_COST + static_cast<int64_t>(keys.size()) * STORAGE_KEY_COST;
49
153k
    return cost;
50
153k
}
51
52
struct TransactionCost
53
{
54
    int64_t intrinsic = 0;
55
    int64_t min = 0;
56
};
57
58
/// Compute the transaction intrinsic gas 𝑔₀ (Yellow Paper, 6.2) and minimal gas (EIP-7623).
59
TransactionCost compute_tx_intrinsic_cost(evmc_revision rev, const Transaction& tx) noexcept
60
153k
{
61
153k
    static constexpr auto TX_BASE_COST = 21000;
62
153k
    static constexpr auto TX_CREATE_COST = 32000;
63
153k
    static constexpr auto DATA_TOKEN_COST = 4;
64
153k
    static constexpr auto INITCODE_WORD_COST = 2;
65
153k
    static constexpr auto TOTAL_COST_FLOOR_PER_TOKEN = 10;
66
67
153k
    const auto is_create = !tx.to.has_value();
68
69
153k
    const auto create_cost = (is_create && 
rev >= EVMC_HOMESTEAD39.0k
) ?
TX_CREATE_COST39.0k
:
0113k
;
  Branch (69:31): [True: 39.0k, False: 113k]
+  Branch (69:44): [True: 39.0k, False: 7]
+
  MC/DC Decision Region (69:31) to (69:65)
+
+  Number of Conditions: 2
+     Condition C1 --> (69:31)
+     Condition C2 --> (69:44)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
70
71
153k
    const auto num_tokens = static_cast<int64_t>(compute_tx_data_tokens(rev, tx.data));
72
153k
    const auto data_cost = num_tokens * DATA_TOKEN_COST;
73
74
153k
    const auto access_list_cost = compute_access_list_cost(tx.access_list);
75
76
153k
    const auto auth_list_cost =
77
153k
        static_cast<int64_t>(tx.authorization_list.size()) * AUTHORIZATION_EMPTY_ACCOUNT_COST;
78
79
153k
    const auto initcode_cost =
80
153k
        (is_create && 
rev >= EVMC_SHANGHAI39.0k
) ?
INITCODE_WORD_COST * num_words(tx.data.size())38.9k
:
0114k
;
  Branch (80:10): [True: 39.0k, False: 113k]
+  Branch (80:23): [True: 38.9k, False: 102]
+
  MC/DC Decision Region (80:10) to (80:43)
+
+  Number of Conditions: 2
+     Condition C1 --> (80:10)
+     Condition C2 --> (80:23)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
81
82
153k
    const auto intrinsic_cost =
83
153k
        TX_BASE_COST + create_cost + data_cost + access_list_cost + auth_list_cost + initcode_cost;
84
85
    // EIP-7623: Compute the minimum cost for the transaction by. If disabled, just use 0.
86
153k
    const auto min_cost =
87
153k
        rev >= EVMC_PRAGUE ? 
TX_BASE_COST + num_tokens * TOTAL_COST_FLOOR_PER_TOKEN87.7k
:
065.3k
;
  Branch (87:9): [True: 87.7k, False: 65.3k]
+
88
89
153k
    return {intrinsic_cost, min_cost};
90
153k
}
91
92
int64_t process_authorization_list(
93
    State& state, uint64_t chain_id, const AuthorizationList& authorization_list)
94
148k
{
95
148k
    int64_t delegation_refund = 0;
96
148k
    for (const auto& auth : authorization_list)
  Branch (96:27): [True: 37.7k, False: 148k]
+
97
37.7k
    {
98
        // 1. Verify the chain id is either 0 or the chain’s current ID.
99
37.7k
        if (auth.chain_id != 0 && 
auth.chain_id != chain_id198
)
  Branch (99:13): [True: 56, False: 37.6k]
+  Branch (99:13): [True: 198, False: 37.5k]
+  Branch (99:35): [True: 56, False: 142]
+
  MC/DC Decision Region (99:13) to (99:60)
+
+  Number of Conditions: 2
+     Condition C1 --> (99:13)
+     Condition C2 --> (99:35)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
100
56
            continue;
101
102
        // 2. Verify the nonce is less than 2**64 - 1.
103
37.6k
        if (auth.nonce == Account::NonceMax)
  Branch (103:13): [True: 8, False: 37.6k]
+
104
8
            continue;
105
106
        // 3. Verify if the signer has been successfully recovered from the signature.
107
        //    authority = ecrecover(...)
108
37.6k
        if (!auth.signer.has_value())
  Branch (108:13): [True: 68, False: 37.6k]
+
109
68
            continue;
110
111
        // s value must be less than or equal to secp256k1n/2, as specified in EIP-2.
112
37.6k
        if (auth.s > SECP256K1N_OVER_2)
  Branch (112:13): [True: 12, False: 37.5k]
+
113
12
            continue;
114
115
        // Get or create the authority account.
116
        // It is still empty at this point until nonce bump following successful authorization.
117
37.5k
        auto& authority = state.get_or_insert(*auth.signer, {.erase_if_empty = true});
118
119
        // 4. Add authority to accessed_addresses (as defined in EIP-2929.)
120
37.5k
        authority.access_status = EVMC_ACCESS_WARM;
121
122
        // 5. Verify the code of authority is either empty or already delegated.
123
37.5k
        if (authority.code_hash != Account::EMPTY_CODE_HASH &&
  Branch (123:13): [True: 10.8k, False: 26.7k]
+
124
37.5k
            
!is_code_delegated(state.get_code(*auth.signer))10.8k
)
  Branch (124:13): [True: 64, False: 10.7k]
+
  MC/DC Decision Region (123:13) to (124:61)
+
+  Number of Conditions: 2
+     Condition C1 --> (123:13)
+     Condition C2 --> (124:13)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
125
64
            continue;
126
127
        // 6. Verify the nonce of authority is equal to nonce.
128
        // In case authority does not exist in the trie, verify that nonce is equal to 0.
129
37.5k
        if (auth.nonce != authority.nonce)
  Branch (129:13): [True: 5.52k, False: 32.0k]
+
130
5.52k
            continue;
131
132
        // 7. Add PER_EMPTY_ACCOUNT_COST - PER_AUTH_BASE_COST gas to the global refund counter
133
        // if authority exists in the trie.
134
        // Successful authorisation validation makes an account non-empty.
135
        // We apply the refund only if the account has existed before.
136
        // We detect "exists in the trie" by inspecting _empty_ property (EIP-161) because _empty_
137
        // implies an account doesn't exist in the state (EIP-7523).
138
32.0k
        if (!authority.is_empty())
  Branch (138:13): [True: 16.0k, False: 15.9k]
+
139
16.0k
        {
140
16.0k
            static constexpr auto EXISTING_AUTHORITY_REFUND =
141
16.0k
                AUTHORIZATION_EMPTY_ACCOUNT_COST - AUTHORIZATION_BASE_COST;
142
16.0k
            delegation_refund += EXISTING_AUTHORITY_REFUND;
143
16.0k
        }
144
145
        // As a special case, if address is 0 do not write the designation.
146
        // Clear the account’s code and reset the account’s code hash to the empty hash.
147
32.0k
        if (is_zero(auth.addr))
  Branch (147:13): [True: 128, False: 31.8k]
+
148
128
        {
149
128
            if (authority.code_hash != Account::EMPTY_CODE_HASH)
  Branch (149:17): [True: 44, False: 84]
+
150
44
            {
151
44
                authority.code_changed = true;
152
44
                authority.code.clear();
153
44
                authority.code_hash = Account::EMPTY_CODE_HASH;
154
44
            }
155
128
        }
156
        // 8. Set the code of authority to be 0xef0100 || address. This is a delegation designation.
157
31.8k
        else
158
31.8k
        {
159
31.8k
            auto new_code = bytes(DELEGATION_MAGIC) + bytes(auth.addr);
160
31.8k
            if (authority.code != new_code)
  Branch (160:17): [True: 26.5k, False: 5.29k]
+
161
26.5k
            {
162
                // We are doing this only if the code is different to make the state diff precise.
163
26.5k
                authority.code_changed = true;
164
26.5k
                authority.code = std::move(new_code);
165
26.5k
                authority.code_hash = keccak256(authority.code);
166
26.5k
            }
167
31.8k
        }
168
169
        // 9. Increase the nonce of authority by one.
170
32.0k
        ++authority.nonce;
171
32.0k
    }
172
148k
    return delegation_refund;
173
148k
}
174
175
evmc_message build_message(const Transaction& tx, int64_t execution_gas_limit) noexcept
176
148k
{
177
148k
    const auto recipient = tx.to.has_value() ? 
*tx.to109k
:
evmc::address{}38.8k
;
  Branch (177:28): [True: 109k, False: 38.8k]
+
178
179
148k
    return {
180
148k
        .kind = tx.to.has_value() ? 
EVMC_CALL109k
:
EVMC_CREATE38.8k
,
  Branch (180:17): [True: 109k, False: 38.8k]
+
181
148k
        .flags = 0,
182
148k
        .depth = 0,
183
148k
        .gas = execution_gas_limit,
184
148k
        .recipient = recipient,
185
148k
        .sender = tx.sender,
186
148k
        .input_data = tx.data.data(),
187
148k
        .input_size = tx.data.size(),
188
148k
        .value = intx::be::store<evmc::uint256be>(tx.value),
189
148k
        .create2_salt = {},
190
148k
        .code_address = recipient,
191
148k
        .code = nullptr,
192
148k
        .code_size = 0,
193
148k
    };
194
148k
}
195
}  // namespace
196
197
StateDiff State::build_diff(evmc_revision rev) const
198
481k
{
199
481k
    StateDiff diff;
200
481k
    for (const auto& [addr, m] : m_modified)
  Branch (200:32): [True: 1.17M, False: 481k]
+
201
1.17M
    {
202
1.17M
        if (m.destructed)
  Branch (202:13): [True: 4.26k, False: 1.17M]
+
203
4.26k
        {
204
            // TODO: This must be done even for just_created
205
            //   because destructed may pre-date just_created. Add test to evmone (EEST has it).
206
4.26k
            diff.deleted_accounts.emplace_back(addr);
207
4.26k
            continue;
208
4.26k
        }
209
1.17M
        if (m.erase_if_empty && 
rev >= EVMC_SPURIOUS_DRAGON402k
&&
m.is_empty()400k
)
  Branch (209:13): [True: 402k, False: 772k]
+  Branch (209:33): [True: 400k, False: 1.71k]
+  Branch (209:64): [True: 288k, False: 112k]
+
  MC/DC Decision Region (209:13) to (209:76)
+
+  Number of Conditions: 3
+     Condition C1 --> (209:13)
+     Condition C2 --> (209:33)
+     Condition C3 --> (209:64)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  F,  -  = F      }
+  3 { T,  T,  F  = F      }
+  4 { T,  T,  T  = T      }
+
+  C1-Pair: covered: (1,4)
+  C2-Pair: covered: (2,4)
+  C3-Pair: covered: (3,4)
+  MC/DC Coverage for Expression: 100.00%
+
210
288k
        {
211
288k
            if (!m.just_created)  // Don't report just created accounts
  Branch (211:17): [True: 281k, False: 7.03k]
+
212
281k
                diff.deleted_accounts.emplace_back(addr);
213
288k
            continue;
214
288k
        }
215
216
        // Unconditionally report nonce and balance as modified.
217
        // TODO: We don't have information if the balance/nonce has actually changed.
218
        //   One option is to just keep the original values. This may be handy for RPC.
219
        // TODO(clang): In AppleClang 15 emplace_back without StateDiff::Entry doesn't compile.
220
        //   NOLINTNEXTLINE(modernize-use-emplace)
221
886k
        auto& a = diff.modified_accounts.emplace_back(StateDiff::Entry{addr, m.nonce, m.balance});
222
223
        // Output only the new code.
224
        // TODO: Output also the code hash. It will be needed for DB update and MPT hash.
225
886k
        if (m.code_changed)
  Branch (225:13): [True: 49.1k, False: 836k]
+
226
49.1k
            a.code = m.code;
227
228
886k
        for (const auto& [k, v] : m.storage)
  Branch (228:33): [True: 1.83M, False: 886k]
+
229
1.83M
        {
230
1.83M
            if (v.current != v.original)
  Branch (230:17): [True: 519k, False: 1.31M]
+
231
519k
                a.modified_storage.emplace_back(k, v.current);
232
1.83M
        }
233
886k
    }
234
481k
    return diff;
235
481k
}
236
237
Account& State::insert(const address& addr, Account account)
238
1.17M
{
239
1.17M
    const auto r = m_modified.insert({addr, std::move(account)});
240
1.17M
    assert(r.second);
241
1.17M
    return r.first->second;
242
1.17M
}
243
244
Account* State::find(const address& addr) noexcept
245
53.6M
{
246
    // TODO: Avoid double lookup (find+insert) and not cached initial state lookup for non-existent
247
    //   accounts. If we want to cache non-existent account we need a proper flag for it.
248
53.6M
    if (const auto it = m_modified.find(addr); it != m_modified.end())
  Branch (248:48): [True: 50.4M, False: 3.20M]
+
249
50.4M
        return &it->second;
250
3.20M
    if (const auto cacc = m_initial.get_account(addr); cacc)
  Branch (250:56): [True: 766k, False: 2.43M]
+
251
766k
        return &insert(addr, {.nonce = cacc->nonce,
252
766k
                                 .balance = cacc->balance,
253
766k
                                 .code_hash = cacc->code_hash,
254
766k
                                 .has_initial_storage = cacc->has_storage});
255
2.43M
    return nullptr;
256
3.20M
}
257
258
Account& State::get(const address& addr) noexcept
259
32.2M
{
260
32.2M
    auto acc = find(addr);
261
32.2M
    assert(acc != nullptr);
262
32.2M
    return *acc;
263
32.2M
}
264
265
Account& State::get_or_insert(const address& addr, Account account)
266
9.55M
{
267
9.55M
    if (const auto acc = find(addr); acc != nullptr)
  Branch (267:38): [True: 9.14M, False: 406k]
+
268
9.14M
        return *acc;
269
406k
    return insert(addr, std::move(account));
270
9.55M
}
271
272
bytes_view State::get_code(const address& addr)
273
5.27M
{
274
5.27M
    auto* a = find(addr);
275
5.27M
    if (a == nullptr)
  Branch (275:9): [True: 117, False: 5.27M]
+
276
117
        return {};
277
5.27M
    if (a->code_hash == Account::EMPTY_CODE_HASH)
  Branch (277:9): [True: 1.38M, False: 3.89M]
+
278
1.38M
        return {};
279
3.89M
    if (a->code.empty())
  Branch (279:9): [True: 283k, False: 3.60M]
+
280
283k
        a->code = m_initial.get_account_code(addr);
281
3.89M
    return a->code;
282
5.27M
}
283
284
Account& State::touch(const address& addr)
285
4.47M
{
286
4.47M
    auto& acc = get_or_insert(addr, {.erase_if_empty = true});
287
4.47M
    if (!acc.erase_if_empty && 
acc.is_empty()1.84M
)
  Branch (287:9): [True: 1.84M, False: 2.63M]
+  Branch (287:32): [True: 4, False: 1.84M]
+
  MC/DC Decision Region (287:9) to (287:46)
+
+  Number of Conditions: 2
+     Condition C1 --> (287:9)
+     Condition C2 --> (287:32)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
288
4
    {
289
4
        acc.erase_if_empty = true;
290
4
        m_journal.emplace_back(JournalTouched{addr});
291
4
    }
292
4.47M
    return acc;
293
4.47M
}
294
295
StorageValue& State::get_storage(const address& addr, const bytes32& key)
296
10.5M
{
297
    // TODO: Avoid account lookup by giving the reference to the account's storage to Host.
298
10.5M
    auto& acc = get(addr);
299
10.5M
    const auto [it, missing] = acc.storage.try_emplace(key);
300
10.5M
    if (missing)
  Branch (300:9): [True: 1.90M, False: 8.65M]
+
301
1.90M
    {
302
1.90M
        const auto initial_value = m_initial.get_storage(addr, key);
303
1.90M
        it->second = {initial_value, initial_value};
304
1.90M
    }
305
10.5M
    return it->second;
306
10.5M
}
307
308
void State::journal_balance_change(const address& addr, const intx::uint256& prev_balance)
309
328k
{
310
328k
    m_journal.emplace_back(JournalBalanceChange{{addr}, prev_balance});
311
328k
}
312
313
void State::journal_storage_change(
314
    const address& addr, const bytes32& key, const StorageValue& value)
315
5.27M
{
316
5.27M
    m_journal.emplace_back(JournalStorageChange{{addr}, key, value.current, value.access_status});
317
5.27M
}
318
319
void State::journal_transient_storage_change(
320
    const address& addr, const bytes32& key, const bytes32& value)
321
9.07M
{
322
9.07M
    m_journal.emplace_back(JournalTransientStorageChange{{addr}, key, value});
323
9.07M
}
324
325
void State::journal_bump_nonce(const address& addr)
326
36.1k
{
327
36.1k
    m_journal.emplace_back(JournalNonceBump{addr});
328
36.1k
}
329
330
void State::journal_create(const address& addr, bool existed)
331
81.8k
{
332
81.8k
    m_journal.emplace_back(JournalCreate{{addr}, existed});
333
81.8k
}
334
335
void State::journal_destruct(const address& addr)
336
4.34k
{
337
4.34k
    m_journal.emplace_back(JournalDestruct{addr});
338
4.34k
}
339
340
void State::journal_access_account(const address& addr)
341
588k
{
342
588k
    m_journal.emplace_back(JournalAccessAccount{addr});
343
588k
}
344
345
void State::rollback(size_t checkpoint)
346
2.41M
{
347
12.7M
    while (m_journal.size() != checkpoint)
  Branch (347:12): [True: 10.3M, False: 2.41M]
+
348
10.3M
    {
349
10.3M
        std::visit(
350
10.3M
            [this](const auto& e) {
351
10.3M
                using T = std::decay_t<decltype(e)>;
352
                if constexpr (std::is_same_v<T, JournalNonceBump>)
353
6.07k
                {
354
6.07k
                    get(e.addr).nonce -= 1;
355
                }
356
                else if constexpr (std::is_same_v<T, JournalTouched>)
357
0
                {
358
0
                    get(e.addr).erase_if_empty = false;
359
                }
360
                else if constexpr (std::is_same_v<T, JournalDestruct>)
361
74
                {
362
74
                    get(e.addr).destructed = false;
363
                }
364
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
365
14.2k
                {
366
14.2k
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
367
                }
368
                else if constexpr (std::is_same_v<T, JournalCreate>)
369
10.4k
                {
370
10.4k
                    if (e.existed)
  Branch (370:25): [True: 9.76k, False: 667]
+
371
9.76k
                    {
372
                        // This account is not always "touched". TODO: Why?
373
9.76k
                        auto& a = get(e.addr);
374
9.76k
                        a.nonce = 0;
375
9.76k
                        a.code_hash = Account::EMPTY_CODE_HASH;
376
9.76k
                        a.code.clear();
377
9.76k
                    }
378
667
                    else
379
667
                    {
380
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
381
                        //       so we need to delete them here explicitly.
382
                        //       This should be changed by tuning "erasable" flag
383
                        //       and clear in all revisions.
384
667
                        m_modified.erase(e.addr);
385
667
                    }
386
                }
387
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
388
1.18M
                {
389
1.18M
                    auto& s = get(e.addr).storage.find(e.key)->second;
390
1.18M
                    s.current = e.prev_value;
391
1.18M
                    s.access_status = e.prev_access_status;
392
                }
393
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
394
9.06M
                {
395
9.06M
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
396
9.06M
                    s = e.prev_value;
397
                }
398
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
399
31.8k
                {
400
31.8k
                    get(e.addr).balance = e.prev_balance;
401
                }
402
                else
403
                {
404
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
405
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
406
                }
407
10.3M
            },
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalBalanceChangeEEEDaRKT_
Line
Count
Source
350
31.8k
            [this](const auto& e) {
351
31.8k
                using T = std::decay_t<decltype(e)>;
352
                if constexpr (std::is_same_v<T, JournalNonceBump>)
353
                {
354
                    get(e.addr).nonce -= 1;
355
                }
356
                else if constexpr (std::is_same_v<T, JournalTouched>)
357
                {
358
                    get(e.addr).erase_if_empty = false;
359
                }
360
                else if constexpr (std::is_same_v<T, JournalDestruct>)
361
                {
362
                    get(e.addr).destructed = false;
363
                }
364
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
365
                {
366
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
367
                }
368
                else if constexpr (std::is_same_v<T, JournalCreate>)
369
                {
370
                    if (e.existed)
371
                    {
372
                        // This account is not always "touched". TODO: Why?
373
                        auto& a = get(e.addr);
374
                        a.nonce = 0;
375
                        a.code_hash = Account::EMPTY_CODE_HASH;
376
                        a.code.clear();
377
                    }
378
                    else
379
                    {
380
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
381
                        //       so we need to delete them here explicitly.
382
                        //       This should be changed by tuning "erasable" flag
383
                        //       and clear in all revisions.
384
                        m_modified.erase(e.addr);
385
                    }
386
                }
387
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
388
                {
389
                    auto& s = get(e.addr).storage.find(e.key)->second;
390
                    s.current = e.prev_value;
391
                    s.access_status = e.prev_access_status;
392
                }
393
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
394
                {
395
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
396
                    s = e.prev_value;
397
                }
398
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
399
31.8k
                {
400
31.8k
                    get(e.addr).balance = e.prev_balance;
401
                }
402
                else
403
                {
404
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
405
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
406
                }
407
31.8k
            },
Unexecuted instantiation: state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_14JournalTouchedEEEDaRKT_
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalStorageChangeEEEDaRKT_
Line
Count
Source
350
1.18M
            [this](const auto& e) {
351
1.18M
                using T = std::decay_t<decltype(e)>;
352
                if constexpr (std::is_same_v<T, JournalNonceBump>)
353
                {
354
                    get(e.addr).nonce -= 1;
355
                }
356
                else if constexpr (std::is_same_v<T, JournalTouched>)
357
                {
358
                    get(e.addr).erase_if_empty = false;
359
                }
360
                else if constexpr (std::is_same_v<T, JournalDestruct>)
361
                {
362
                    get(e.addr).destructed = false;
363
                }
364
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
365
                {
366
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
367
                }
368
                else if constexpr (std::is_same_v<T, JournalCreate>)
369
                {
370
                    if (e.existed)
371
                    {
372
                        // This account is not always "touched". TODO: Why?
373
                        auto& a = get(e.addr);
374
                        a.nonce = 0;
375
                        a.code_hash = Account::EMPTY_CODE_HASH;
376
                        a.code.clear();
377
                    }
378
                    else
379
                    {
380
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
381
                        //       so we need to delete them here explicitly.
382
                        //       This should be changed by tuning "erasable" flag
383
                        //       and clear in all revisions.
384
                        m_modified.erase(e.addr);
385
                    }
386
                }
387
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
388
1.18M
                {
389
1.18M
                    auto& s = get(e.addr).storage.find(e.key)->second;
390
1.18M
                    s.current = e.prev_value;
391
1.18M
                    s.access_status = e.prev_access_status;
392
                }
393
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
394
                {
395
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
396
                    s = e.prev_value;
397
                }
398
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
399
                {
400
                    get(e.addr).balance = e.prev_balance;
401
                }
402
                else
403
                {
404
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
405
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
406
                }
407
1.18M
            },
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_16JournalNonceBumpEEEDaRKT_
Line
Count
Source
350
6.07k
            [this](const auto& e) {
351
6.07k
                using T = std::decay_t<decltype(e)>;
352
                if constexpr (std::is_same_v<T, JournalNonceBump>)
353
6.07k
                {
354
6.07k
                    get(e.addr).nonce -= 1;
355
                }
356
                else if constexpr (std::is_same_v<T, JournalTouched>)
357
                {
358
                    get(e.addr).erase_if_empty = false;
359
                }
360
                else if constexpr (std::is_same_v<T, JournalDestruct>)
361
                {
362
                    get(e.addr).destructed = false;
363
                }
364
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
365
                {
366
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
367
                }
368
                else if constexpr (std::is_same_v<T, JournalCreate>)
369
                {
370
                    if (e.existed)
371
                    {
372
                        // This account is not always "touched". TODO: Why?
373
                        auto& a = get(e.addr);
374
                        a.nonce = 0;
375
                        a.code_hash = Account::EMPTY_CODE_HASH;
376
                        a.code.clear();
377
                    }
378
                    else
379
                    {
380
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
381
                        //       so we need to delete them here explicitly.
382
                        //       This should be changed by tuning "erasable" flag
383
                        //       and clear in all revisions.
384
                        m_modified.erase(e.addr);
385
                    }
386
                }
387
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
388
                {
389
                    auto& s = get(e.addr).storage.find(e.key)->second;
390
                    s.current = e.prev_value;
391
                    s.access_status = e.prev_access_status;
392
                }
393
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
394
                {
395
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
396
                    s = e.prev_value;
397
                }
398
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
399
                {
400
                    get(e.addr).balance = e.prev_balance;
401
                }
402
                else
403
                {
404
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
405
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
406
                }
407
6.07k
            },
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_13JournalCreateEEEDaRKT_
Line
Count
Source
350
10.4k
            [this](const auto& e) {
351
10.4k
                using T = std::decay_t<decltype(e)>;
352
                if constexpr (std::is_same_v<T, JournalNonceBump>)
353
                {
354
                    get(e.addr).nonce -= 1;
355
                }
356
                else if constexpr (std::is_same_v<T, JournalTouched>)
357
                {
358
                    get(e.addr).erase_if_empty = false;
359
                }
360
                else if constexpr (std::is_same_v<T, JournalDestruct>)
361
                {
362
                    get(e.addr).destructed = false;
363
                }
364
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
365
                {
366
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
367
                }
368
                else if constexpr (std::is_same_v<T, JournalCreate>)
369
10.4k
                {
370
10.4k
                    if (e.existed)
  Branch (370:25): [True: 9.76k, False: 667]
+
371
9.76k
                    {
372
                        // This account is not always "touched". TODO: Why?
373
9.76k
                        auto& a = get(e.addr);
374
9.76k
                        a.nonce = 0;
375
9.76k
                        a.code_hash = Account::EMPTY_CODE_HASH;
376
9.76k
                        a.code.clear();
377
9.76k
                    }
378
667
                    else
379
667
                    {
380
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
381
                        //       so we need to delete them here explicitly.
382
                        //       This should be changed by tuning "erasable" flag
383
                        //       and clear in all revisions.
384
667
                        m_modified.erase(e.addr);
385
667
                    }
386
                }
387
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
388
                {
389
                    auto& s = get(e.addr).storage.find(e.key)->second;
390
                    s.current = e.prev_value;
391
                    s.access_status = e.prev_access_status;
392
                }
393
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
394
                {
395
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
396
                    s = e.prev_value;
397
                }
398
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
399
                {
400
                    get(e.addr).balance = e.prev_balance;
401
                }
402
                else
403
                {
404
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
405
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
406
                }
407
10.4k
            },
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_29JournalTransientStorageChangeEEEDaRKT_
Line
Count
Source
350
9.06M
            [this](const auto& e) {
351
9.06M
                using T = std::decay_t<decltype(e)>;
352
                if constexpr (std::is_same_v<T, JournalNonceBump>)
353
                {
354
                    get(e.addr).nonce -= 1;
355
                }
356
                else if constexpr (std::is_same_v<T, JournalTouched>)
357
                {
358
                    get(e.addr).erase_if_empty = false;
359
                }
360
                else if constexpr (std::is_same_v<T, JournalDestruct>)
361
                {
362
                    get(e.addr).destructed = false;
363
                }
364
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
365
                {
366
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
367
                }
368
                else if constexpr (std::is_same_v<T, JournalCreate>)
369
                {
370
                    if (e.existed)
371
                    {
372
                        // This account is not always "touched". TODO: Why?
373
                        auto& a = get(e.addr);
374
                        a.nonce = 0;
375
                        a.code_hash = Account::EMPTY_CODE_HASH;
376
                        a.code.clear();
377
                    }
378
                    else
379
                    {
380
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
381
                        //       so we need to delete them here explicitly.
382
                        //       This should be changed by tuning "erasable" flag
383
                        //       and clear in all revisions.
384
                        m_modified.erase(e.addr);
385
                    }
386
                }
387
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
388
                {
389
                    auto& s = get(e.addr).storage.find(e.key)->second;
390
                    s.current = e.prev_value;
391
                    s.access_status = e.prev_access_status;
392
                }
393
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
394
9.06M
                {
395
9.06M
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
396
9.06M
                    s = e.prev_value;
397
                }
398
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
399
                {
400
                    get(e.addr).balance = e.prev_balance;
401
                }
402
                else
403
                {
404
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
405
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
406
                }
407
9.06M
            },
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_15JournalDestructEEEDaRKT_
Line
Count
Source
350
74
            [this](const auto& e) {
351
74
                using T = std::decay_t<decltype(e)>;
352
                if constexpr (std::is_same_v<T, JournalNonceBump>)
353
                {
354
                    get(e.addr).nonce -= 1;
355
                }
356
                else if constexpr (std::is_same_v<T, JournalTouched>)
357
                {
358
                    get(e.addr).erase_if_empty = false;
359
                }
360
                else if constexpr (std::is_same_v<T, JournalDestruct>)
361
74
                {
362
74
                    get(e.addr).destructed = false;
363
                }
364
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
365
                {
366
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
367
                }
368
                else if constexpr (std::is_same_v<T, JournalCreate>)
369
                {
370
                    if (e.existed)
371
                    {
372
                        // This account is not always "touched". TODO: Why?
373
                        auto& a = get(e.addr);
374
                        a.nonce = 0;
375
                        a.code_hash = Account::EMPTY_CODE_HASH;
376
                        a.code.clear();
377
                    }
378
                    else
379
                    {
380
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
381
                        //       so we need to delete them here explicitly.
382
                        //       This should be changed by tuning "erasable" flag
383
                        //       and clear in all revisions.
384
                        m_modified.erase(e.addr);
385
                    }
386
                }
387
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
388
                {
389
                    auto& s = get(e.addr).storage.find(e.key)->second;
390
                    s.current = e.prev_value;
391
                    s.access_status = e.prev_access_status;
392
                }
393
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
394
                {
395
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
396
                    s = e.prev_value;
397
                }
398
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
399
                {
400
                    get(e.addr).balance = e.prev_balance;
401
                }
402
                else
403
                {
404
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
405
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
406
                }
407
74
            },
state.cpp:_ZZN6evmone5state5State8rollbackEmENK3$_0clINS1_20JournalAccessAccountEEEDaRKT_
Line
Count
Source
350
14.2k
            [this](const auto& e) {
351
14.2k
                using T = std::decay_t<decltype(e)>;
352
                if constexpr (std::is_same_v<T, JournalNonceBump>)
353
                {
354
                    get(e.addr).nonce -= 1;
355
                }
356
                else if constexpr (std::is_same_v<T, JournalTouched>)
357
                {
358
                    get(e.addr).erase_if_empty = false;
359
                }
360
                else if constexpr (std::is_same_v<T, JournalDestruct>)
361
                {
362
                    get(e.addr).destructed = false;
363
                }
364
                else if constexpr (std::is_same_v<T, JournalAccessAccount>)
365
14.2k
                {
366
14.2k
                    get(e.addr).access_status = EVMC_ACCESS_COLD;
367
                }
368
                else if constexpr (std::is_same_v<T, JournalCreate>)
369
                {
370
                    if (e.existed)
371
                    {
372
                        // This account is not always "touched". TODO: Why?
373
                        auto& a = get(e.addr);
374
                        a.nonce = 0;
375
                        a.code_hash = Account::EMPTY_CODE_HASH;
376
                        a.code.clear();
377
                    }
378
                    else
379
                    {
380
                        // TODO: Before Spurious Dragon we don't clear empty accounts ("erasable")
381
                        //       so we need to delete them here explicitly.
382
                        //       This should be changed by tuning "erasable" flag
383
                        //       and clear in all revisions.
384
                        m_modified.erase(e.addr);
385
                    }
386
                }
387
                else if constexpr (std::is_same_v<T, JournalStorageChange>)
388
                {
389
                    auto& s = get(e.addr).storage.find(e.key)->second;
390
                    s.current = e.prev_value;
391
                    s.access_status = e.prev_access_status;
392
                }
393
                else if constexpr (std::is_same_v<T, JournalTransientStorageChange>)
394
                {
395
                    auto& s = get(e.addr).transient_storage.find(e.key)->second;
396
                    s = e.prev_value;
397
                }
398
                else if constexpr (std::is_same_v<T, JournalBalanceChange>)
399
                {
400
                    get(e.addr).balance = e.prev_balance;
401
                }
402
                else
403
                {
404
                    // TODO(C++23): Change condition to `false` once CWG2518 is in.
405
                    static_assert(std::is_void_v<T>, "unhandled journal entry type");
406
                }
407
14.2k
            },
408
10.3M
            m_journal.back());
409
10.3M
        m_journal.pop_back();
410
10.3M
    }
411
2.41M
}
412
413
/// Validates transaction and computes its execution gas limit (the amount of gas provided to EVM).
414
/// @return  Execution gas limit or transaction validation error.
415
std::variant<TransactionProperties, std::error_code> validate_transaction(
416
    const StateView& state_view, const BlockInfo& block, const Transaction& tx, evmc_revision rev,
417
    int64_t block_gas_left, int64_t blob_gas_left) noexcept
418
155k
{
419
155k
    switch (tx.type)  // Validate "special" transaction types.
420
155k
    {
421
13.3k
    case Transaction::Type::blob:
  Branch (421:5): [True: 13.3k, False: 141k]
+
422
13.3k
        if (rev < EVMC_CANCUN)
  Branch (422:13): [True: 4, False: 13.3k]
+
423
4
            return make_error_code(TX_TYPE_NOT_SUPPORTED);
424
13.3k
        if (!tx.to.has_value())
  Branch (424:13): [True: 6, False: 13.3k]
+
425
6
            return make_error_code(CREATE_BLOB_TX);
426
13.3k
        if (tx.blob_hashes.empty())
  Branch (426:13): [True: 12, False: 13.3k]
+
427
12
            return make_error_code(EMPTY_BLOB_HASHES_LIST);
428
13.3k
        if (rev >= EVMC_OSAKA && 
tx.blob_hashes.size() > MAX_TX_BLOB_COUNT5.28k
)
  Branch (428:13): [True: 5.28k, False: 8.08k]
+  Branch (428:34): [True: 11, False: 5.27k]
+
  MC/DC Decision Region (428:13) to (428:75)
+
+  Number of Conditions: 2
+     Condition C1 --> (428:13)
+     Condition C2 --> (428:34)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
429
11
            return make_error_code(BLOB_GAS_LIMIT_EXCEEDED);
430
431
13.3k
        assert(block.blob_base_fee.has_value());
432
13.3k
        if (tx.max_blob_gas_price < *block.blob_base_fee)
  Branch (432:13): [True: 12, False: 13.3k]
+
433
12
            return make_error_code(BLOB_FEE_CAP_LESS_THAN_BLOCKS);
434
435
42.3k
        
if (13.3k
std::ranges::any_of(tx.blob_hashes, [](const auto& h) 13.3k
{ return h.bytes[0] != 0x01; }))
  Branch (435:13): [True: 42, False: 13.3k]
+
436
42
            return make_error_code(INVALID_BLOB_HASH_VERSION);
437
13.3k
        if (std::cmp_greater(tx.blob_gas_used(), blob_gas_left))
  Branch (437:13): [True: 119, False: 13.1k]
+
438
119
            return make_error_code(BLOB_GAS_LIMIT_EXCEEDED);
439
13.1k
        break;
440
441
13.1k
    case Transaction::Type::set_code:
  Branch (441:5): [True: 2.60k, False: 152k]
+
442
2.60k
        if (rev < EVMC_PRAGUE)
  Branch (442:13): [True: 4, False: 2.60k]
+
443
4
            return make_error_code(TX_TYPE_NOT_SUPPORTED);
444
2.60k
        if (!tx.to.has_value())
  Branch (444:13): [True: 4, False: 2.60k]
+
445
4
            return make_error_code(CREATE_SET_CODE_TX);
446
2.60k
        if (tx.authorization_list.empty())
  Branch (446:13): [True: 4, False: 2.59k]
+
447
4
            return make_error_code(EMPTY_AUTHORIZATION_LIST);
448
2.59k
        break;
449
450
139k
    default:;
  Branch (450:5): [True: 139k, False: 16.0k]
+
451
155k
    }
452
453
155k
    switch (tx.type)  // Validate the "regular" transaction type hierarchy.
  Branch (453:13): [True: 155k, False: 0]
+
454
155k
    {
455
2.59k
    case Transaction::Type::set_code:
  Branch (455:5): [True: 2.59k, False: 152k]
+
456
15.7k
    case Transaction::Type::blob:
  Branch (456:5): [True: 13.1k, False: 141k]
+
457
21.0k
    case Transaction::Type::eip1559:
  Branch (457:5): [True: 5.24k, False: 149k]
+
458
21.0k
        if (rev < EVMC_LONDON)
  Branch (458:13): [True: 14, False: 21.0k]
+
459
14
            return make_error_code(TX_TYPE_NOT_SUPPORTED);
460
461
21.0k
        if (tx.max_priority_gas_price > tx.max_gas_price)
  Branch (461:13): [True: 10, False: 21.0k]
+
462
10
            return make_error_code(TIP_GT_FEE_CAP);  // Priority gas price is too high.
463
21.0k
        [[fallthrough]];
464
465
27.3k
    case Transaction::Type::access_list:
  Branch (465:5): [True: 6.36k, False: 148k]
+
466
27.3k
        if (rev < EVMC_BERLIN)
  Branch (466:13): [True: 12, False: 27.3k]
+
467
12
            return make_error_code(TX_TYPE_NOT_SUPPORTED);
468
27.3k
        [[fallthrough]];
469
470
155k
    case Transaction::Type::legacy:;
  Branch (470:5): [True: 127k, False: 27.3k]
+
471
155k
    }
472
473
155k
    assert(tx.max_priority_gas_price <= tx.max_gas_price);
474
475
155k
    if (rev >= EVMC_OSAKA && 
tx.gas_limit > MAX_TX_GAS_LIMIT45.0k
)
  Branch (475:9): [True: 45.0k, False: 109k]
+  Branch (475:30): [True: 21, False: 45.0k]
+
  MC/DC Decision Region (475:9) to (475:61)
+
+  Number of Conditions: 2
+     Condition C1 --> (475:9)
+     Condition C2 --> (475:30)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
476
21
        return make_error_code(MAX_GAS_LIMIT_EXCEEDED);
477
478
155k
    if (tx.gas_limit > block_gas_left)
  Branch (478:9): [True: 7, False: 155k]
+
479
7
        return make_error_code(GAS_LIMIT_REACHED);
480
481
155k
    if (tx.max_gas_price < block.base_fee)
  Branch (481:9): [True: 28, False: 155k]
+
482
28
        return make_error_code(FEE_CAP_LESS_THAN_BLOCKS);
483
484
    // We need some information about the sender so lookup the account in the state.
485
    // TODO: During transaction execution this account will be also needed, so we may pass it along.
486
155k
    const auto sender_acc = state_view.get_account(tx.sender).value_or(
487
155k
        StateView::Account{.code_hash = Account::EMPTY_CODE_HASH});
488
489
155k
    if (sender_acc.code_hash != Account::EMPTY_CODE_HASH &&
  Branch (489:9): [True: 74, False: 154k]
+  Branch (489:9): [True: 120, False: 154k]
+
490
155k
        
!is_code_delegated(state_view.get_account_code(tx.sender))120
)
  Branch (490:9): [True: 74, False: 46]
+
  MC/DC Decision Region (489:9) to (490:67)
+
+  Number of Conditions: 2
+     Condition C1 --> (489:9)
+     Condition C2 --> (490:9)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+  2 { T,  F  = F      }
+  3 { T,  T  = T      }
+
+  C1-Pair: covered: (1,3)
+  C2-Pair: covered: (2,3)
+  MC/DC Coverage for Expression: 100.00%
+
491
74
        return make_error_code(SENDER_NOT_EOA);  // Origin must not be a contract (EIP-3607).
492
493
154k
    if (sender_acc.nonce == Account::NonceMax)  // Nonce value limit (EIP-2681).
  Branch (493:9): [True: 12, False: 154k]
+
494
12
        return make_error_code(NONCE_HAS_MAX_VALUE);
495
496
154k
    if (sender_acc.nonce < tx.nonce)
  Branch (496:9): [True: 12, False: 154k]
+
497
12
        return make_error_code(NONCE_TOO_HIGH);
498
499
154k
    if (sender_acc.nonce > tx.nonce)
  Branch (499:9): [True: 2, False: 154k]
+
500
2
        return make_error_code(NONCE_TOO_LOW);
501
502
    // initcode size is limited by EIP-3860.
503
154k
    if (rev >= EVMC_SHANGHAI && 
!tx.to.has_value()130k
&&
tx.data.size() > MAX_INITCODE_SIZE39.2k
)
  Branch (503:9): [True: 130k, False: 24.0k]
+  Branch (503:33): [True: 39.2k, False: 91.6k]
+  Branch (503:55): [True: 22, False: 39.2k]
+
  MC/DC Decision Region (503:9) to (503:89)
+
+  Number of Conditions: 3
+     Condition C1 --> (503:9)
+     Condition C2 --> (503:33)
+     Condition C3 --> (503:55)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  F,  -  = F      }
+  3 { T,  T,  F  = F      }
+  4 { T,  T,  T  = T      }
+
+  C1-Pair: covered: (1,4)
+  C2-Pair: covered: (2,4)
+  C3-Pair: covered: (3,4)
+  MC/DC Coverage for Expression: 100.00%
+
504
22
        return make_error_code(INIT_CODE_SIZE_LIMIT_EXCEEDED);
505
506
    // Compute and check if sender has enough balance for the theoretical maximum transaction cost.
507
    // Note this is different from tx_max_cost computed with effective gas price later.
508
    // The computation cannot overflow if done with 512-bit precision.
509
154k
    auto max_total_fee = umul(uint256{tx.gas_limit}, tx.max_gas_price);
510
154k
    max_total_fee += tx.value;
511
512
154k
    if (tx.type == Transaction::Type::blob)
  Branch (512:9): [True: 13.1k, False: 141k]
+
513
13.1k
    {
514
13.1k
        const auto total_blob_gas = tx.blob_gas_used();
515
        // FIXME: Can overflow uint256.
516
13.1k
        max_total_fee += total_blob_gas * tx.max_blob_gas_price;
517
13.1k
    }
518
154k
    if (sender_acc.balance < max_total_fee)
  Branch (518:9): [True: 1.83k, False: 153k]
+
519
1.83k
        return make_error_code(INSUFFICIENT_FUNDS);
520
521
153k
    const auto [intrinsic_cost, min_cost] = compute_tx_intrinsic_cost(rev, tx);
522
153k
    if (tx.gas_limit < std::max(intrinsic_cost, min_cost))
  Branch (522:9): [True: 4.36k, False: 148k]
+
523
4.36k
        return make_error_code(INTRINSIC_GAS_TOO_LOW);
524
525
148k
    const auto execution_gas_limit = tx.gas_limit - intrinsic_cost;
526
148k
    return TransactionProperties{execution_gas_limit, min_cost};
527
153k
}
528
529
StateDiff finalize(const StateView& state_view, evmc_revision rev, const address& coinbase,
530
    std::optional<uint64_t> block_reward, std::span<const Ommer> ommers,
531
    std::span<const Withdrawal> withdrawals)
532
153k
{
533
153k
    State state{state_view};
534
    // TODO: The block reward can be represented as a withdrawal.
535
153k
    if (block_reward.has_value())
  Branch (535:9): [True: 79.9k, False: 73.6k]
+
536
79.9k
    {
537
79.9k
        const auto reward = *block_reward;
538
79.9k
        assert(reward % 32 == 0);  // Assume block reward is divisible by 32.
539
79.9k
        const auto reward_by_32 = reward / 32;
540
79.9k
        const auto reward_by_8 = reward / 8;
541
542
79.9k
        state.touch(coinbase).balance += reward + reward_by_32 * ommers.size();
543
79.9k
        for (const auto& ommer : ommers)
  Branch (543:32): [True: 0, False: 79.9k]
+
544
0
        {
545
0
            assert(ommer.delta > 0 && ommer.delta < 8);
546
0
            state.touch(ommer.beneficiary).balance += reward_by_8 * (8 - ommer.delta);
547
0
        }
548
79.9k
    }
549
550
153k
    for (const auto& withdrawal : withdrawals)
  Branch (550:33): [True: 4.16k, False: 153k]
+
551
4.16k
        state.touch(withdrawal.recipient).balance += withdrawal.get_amount();
552
553
153k
    return state.build_diff(rev);
554
153k
}
555
556
TransactionReceipt transition(const StateView& state_view, const BlockInfo& block,
557
    const BlockHashes& block_hashes, const Transaction& tx, evmc_revision rev, evmc::VM& vm,
558
    const TransactionProperties& tx_props)
559
148k
{
560
148k
    State state{state_view};
561
562
148k
    auto& sender_acc = state.get_or_insert(tx.sender);
563
148k
    assert(sender_acc.nonce < Account::NonceMax);  // Required for valid tx.
564
148k
    ++sender_acc.nonce;                            // Bump sender nonce.
565
566
148k
    const auto delegation_refund =
567
148k
        process_authorization_list(state, tx.chain_id, tx.authorization_list);
568
569
148k
    const auto base_fee = (rev >= EVMC_LONDON) ? 
block.base_fee133k
:
015.0k
;
  Branch (569:27): [True: 133k, False: 15.0k]
+
570
148k
    assert(tx.max_gas_price >= base_fee);                   // Required for valid tx.
571
148k
    assert(tx.max_gas_price >= tx.max_priority_gas_price);  // Required for valid tx.
572
148k
    const auto priority_gas_price =
573
148k
        std::min(tx.max_priority_gas_price, tx.max_gas_price - base_fee);
574
148k
    const auto effective_gas_price = base_fee + priority_gas_price;
575
576
148k
    assert(effective_gas_price <= tx.max_gas_price);  // Required for valid tx.
577
148k
    const auto tx_max_cost = tx.gas_limit * effective_gas_price;
578
579
148k
    sender_acc.balance -= tx_max_cost;  // Modify sender balance after all checks.
580
581
148k
    if (tx.type == Transaction::Type::blob)
  Branch (581:9): [True: 11.8k, False: 136k]
+
582
11.8k
    {
583
        // This uint64 * uint256 cannot overflow, because tx.blob_gas_used has limits enforced
584
        // before this stage.
585
11.8k
        assert(block.blob_base_fee.has_value());
586
11.8k
        const auto blob_fee = intx::umul(intx::uint256(tx.blob_gas_used()), *block.blob_base_fee);
587
11.8k
        assert(blob_fee <= std::numeric_limits<intx::uint256>::max());
588
11.8k
        assert(sender_acc.balance >= blob_fee);  // Required for valid tx.
589
11.8k
        sender_acc.balance -= intx::uint256(blob_fee);
590
11.8k
    }
591
592
148k
    Host host{rev, vm, state, block, block_hashes, tx};
593
594
148k
    sender_acc.access_status = EVMC_ACCESS_WARM;  // Tx sender is always warm.
595
148k
    if (tx.to.has_value())
  Branch (595:9): [True: 109k, False: 38.8k]
+
596
109k
        host.access_account(*tx.to);
597
148k
    for (const auto& [a, storage_keys] : tx.access_list)
  Branch (597:40): [True: 114k, False: 148k]
+
598
114k
    {
599
114k
        host.access_account(a);
600
114k
        for (const auto& key : storage_keys)
  Branch (600:30): [True: 70.3k, False: 114k]
+
601
70.3k
            state.get_storage(a, key).access_status = EVMC_ACCESS_WARM;
602
114k
    }
603
    // EIP-3651: Warm COINBASE.
604
    // This may create an empty coinbase account. The account cannot be created unconditionally
605
    // because this breaks old revisions.
606
148k
    if (rev >= EVMC_SHANGHAI)
  Branch (606:9): [True: 125k, False: 22.7k]
+
607
125k
        host.access_account(block.coinbase);
608
609
148k
    auto message = build_message(tx, tx_props.execution_gas_limit);
610
148k
    if (tx.to.has_value())
  Branch (610:9): [True: 109k, False: 38.8k]
+
611
109k
    {
612
109k
        if (const auto delegate = get_delegate_address(host, *tx.to))
  Branch (612:24): [True: 540, False: 109k]
+
613
540
        {
614
540
            message.code_address = *delegate;
615
540
            message.flags |= EVMC_DELEGATED;
616
540
            host.access_account(message.code_address);
617
540
        }
618
109k
    }
619
620
148k
    const auto result = host.call(message);
621
622
148k
    auto gas_used = tx.gas_limit - result.gas_left;
623
624
148k
    const auto max_refund_quotient = rev >= EVMC_LONDON ? 
5133k
:
215.0k
;
  Branch (624:38): [True: 133k, False: 15.0k]
+
625
148k
    const auto refund_limit = gas_used / max_refund_quotient;
626
148k
    const auto refund = std::min(delegation_refund + result.gas_refund, refund_limit);
627
148k
    gas_used -= refund;
628
148k
    assert(gas_used > 0);
629
630
    // EIP-7623: The gas used by the transaction must be at least the min_gas_cost.
631
148k
    gas_used = std::max(gas_used, tx_props.min_gas_cost);
632
633
148k
    sender_acc.balance += tx_max_cost - gas_used * effective_gas_price;
634
148k
    state.touch(block.coinbase).balance += gas_used * priority_gas_price;
635
636
    // Cumulative gas used is unknown in this scope.
637
148k
    TransactionReceipt receipt{
638
148k
        tx.type, result.status_code, gas_used, {}, host.take_logs(), {}, state.build_diff(rev)};
639
640
    // Cannot put it into constructor call because logs are std::moved from host instance.
641
148k
    receipt.logs_bloom_filter = compute_bloom_filter(receipt.logs);
642
643
148k
    return receipt;
644
148k
}
645
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/state.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/state.hpp.html new file mode 100644 index 0000000000..a852c352da --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/state.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/state.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include "account.hpp"
8
#include "block.hpp"
9
#include "bloom_filter.hpp"
10
#include "errors.hpp"
11
#include "hash_utils.hpp"
12
#include "state_diff.hpp"
13
#include "state_view.hpp"
14
#include "transaction.hpp"
15
#include <variant>
16
17
namespace evmone::state
18
{
19
/// The Ethereum State: the collection of accounts mapped by their addresses.
20
class State
21
{
22
    struct JournalBase
23
    {
24
        address addr;
25
    };
26
27
    struct JournalBalanceChange : JournalBase
28
    {
29
        intx::uint256 prev_balance;
30
    };
31
32
    struct JournalTouched : JournalBase
33
    {};
34
35
    struct JournalStorageChange : JournalBase
36
    {
37
        bytes32 key;
38
        bytes32 prev_value;
39
        evmc_access_status prev_access_status;
40
    };
41
42
    struct JournalTransientStorageChange : JournalBase
43
    {
44
        bytes32 key;
45
        bytes32 prev_value;
46
    };
47
48
    struct JournalNonceBump : JournalBase
49
    {};
50
51
    struct JournalCreate : JournalBase
52
    {
53
        bool existed;
54
    };
55
56
    struct JournalDestruct : JournalBase
57
    {};
58
59
    struct JournalAccessAccount : JournalBase
60
    {};
61
62
    using JournalEntry =
63
        std::variant<JournalBalanceChange, JournalTouched, JournalStorageChange, JournalNonceBump,
64
            JournalCreate, JournalTransientStorageChange, JournalDestruct, JournalAccessAccount>;
65
66
    /// The read-only view of the initial (cold) state.
67
    const StateView& m_initial;
68
69
    /// The accounts loaded from the initial state and potentially modified.
70
    std::unordered_map<address, Account> m_modified;
71
72
    /// The state journal: the list of changes made to the state
73
    /// with information how to revert them.
74
    std::vector<JournalEntry> m_journal;
75
76
public:
77
481k
    explicit State(const StateView& state_view) noexcept : m_initial{state_view} {}
78
    State(const State&) = delete;
79
    State(State&&) = delete;
80
    State& operator=(State&&) = delete;
81
82
    /// Inserts the new account at the address.
83
    /// There must not exist any account under this address before.
84
    Account& insert(const address& addr, Account account = {});
85
86
    /// Returns the pointer to the account at the address if the account exists. Null otherwise.
87
    Account* find(const address& addr) noexcept;
88
89
    /// Gets the account at the address (the account must exist).
90
    Account& get(const address& addr) noexcept;
91
92
    /// Gets an existing account or inserts new account.
93
    Account& get_or_insert(const address& addr, Account account = {});
94
95
    bytes_view get_code(const address& addr);
96
97
    StorageValue& get_storage(const address& addr, const bytes32& key);
98
99
    StateDiff build_diff(evmc_revision rev) const;
100
101
    /// Returns the state journal checkpoint. It can be later used to in rollback()
102
    /// to revert changes newer than the checkpoint.
103
4.14M
    [[nodiscard]] size_t checkpoint() const noexcept { return m_journal.size(); }
104
105
    /// Reverts state changes made after the checkpoint.
106
    void rollback(size_t checkpoint);
107
108
    /// Methods performing changes to the state which can be reverted by rollback().
109
    /// @{
110
111
    /// Touches (as in EIP-161) an existing account or inserts new erasable account.
112
    Account& touch(const address& addr);
113
114
    void journal_balance_change(const address& addr, const intx::uint256& prev_balance);
115
116
    void journal_storage_change(const address& addr, const bytes32& key, const StorageValue& value);
117
118
    void journal_transient_storage_change(
119
        const address& addr, const bytes32& key, const bytes32& value);
120
121
    void journal_bump_nonce(const address& addr);
122
123
    void journal_create(const address& addr, bool existed);
124
125
    void journal_destruct(const address& addr);
126
127
    void journal_access_account(const address& addr);
128
129
    /// @}
130
};
131
132
/// Finalize state after applying a "block" of transactions.
133
///
134
/// Applies block reward to coinbase, withdrawals (post Shanghai) and deletes empty touched accounts
135
/// (post Spurious Dragon).
136
[[nodiscard]] StateDiff finalize(const StateView& state_view, evmc_revision rev,
137
    const address& coinbase, std::optional<uint64_t> block_reward, std::span<const Ommer> ommers,
138
    std::span<const Withdrawal> withdrawals);
139
140
/// Executes a valid transaction.
141
///
142
/// @return Transaction receipt with state diff.
143
TransactionReceipt transition(const StateView& state, const BlockInfo& block,
144
    const BlockHashes& block_hashes, const Transaction& tx, evmc_revision rev, evmc::VM& vm,
145
    const TransactionProperties& tx_props);
146
147
/// Validate a transaction.
148
///
149
/// @return Computed execution gas limit or validation error.
150
[[nodiscard]] std::variant<TransactionProperties, std::error_code> validate_transaction(
151
    const StateView& state_view, const BlockInfo& block, const Transaction& tx, evmc_revision rev,
152
    int64_t block_gas_left, int64_t blob_gas_left) noexcept;
153
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/state_view.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/state_view.hpp.html new file mode 100644 index 0000000000..f50572b8f2 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/state_view.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/state_view.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2024 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
#pragma once
5
6
#include <evmc/evmc.hpp>
7
#include <intx/intx.hpp>
8
#include <optional>
9
10
namespace evmone::state
11
{
12
using evmc::address;
13
using evmc::bytes;
14
using evmc::bytes32;
15
using intx::uint256;
16
17
class StateView
18
{
19
public:
20
    struct Account
21
    {
22
        uint64_t nonce = 0;
23
        uint256 balance;
24
        bytes32 code_hash;
25
        bool has_storage = false;
26
    };
27
28
1.59M
    virtual ~StateView() = default;
29
    virtual std::optional<Account> get_account(const address& addr) const noexcept = 0;
30
    virtual bytes get_account_code(const address& addr) const noexcept = 0;
31
    virtual bytes32 get_storage(const address& addr, const bytes32& key) const noexcept = 0;
32
};
33
34
35
/// Interface to access hashes of known block headers.
36
class BlockHashes
37
{
38
public:
39
349k
    virtual ~BlockHashes() = default;
40
41
    /// Returns the hash of the block header of the given block number.
42
    virtual bytes32 get_block_hash(int64_t block_number) const noexcept = 0;
43
};
44
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/system_contracts.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/system_contracts.cpp.html new file mode 100644 index 0000000000..fd913f7479 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/system_contracts.cpp.html @@ -0,0 +1,8 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/system_contracts.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2023 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include "system_contracts.hpp"
6
#include "host.hpp"
7
#include "state_view.hpp"
8
9
namespace evmone::state
10
{
11
namespace
12
{
13
/// Information about a registered "storage" system contract. They are executed at the block start
14
/// to store additional information in the State.
15
struct StorageSystemContract
16
{
17
    using GetInputFn = bytes32(const BlockInfo&, const BlockHashes&) noexcept;
18
19
    evmc_revision since = EVMC_MAX_REVISION;  ///< EVM revision in which added.
20
    address addr;                             ///< Address of the system contract.
21
    GetInputFn* get_input = nullptr;          ///< How to get the input for the system call.
22
};
23
24
/// Information about a registered "requests" system contract. They are executed at the block end
25
/// and produce requests: typed sequence of bytes.
26
struct RequestsSystemContract
27
{
28
    evmc_revision since = EVMC_MAX_REVISION;                ///< EVM revision in which added.
29
    address addr;                                           ///< Address of the system contract.
30
    Requests::Type request_type = Requests::Type::deposit;  ///< Type of requests produced.
31
};
32
33
/// Registered "storage" system contracts.
34
constexpr std::array STORAGE_SYSTEM_CONTRACTS{
35
    StorageSystemContract{EVMC_CANCUN, BEACON_ROOTS_ADDRESS,
36
66.8k
        [](const BlockInfo& block, const BlockHashes&) noexcept {
37
66.8k
            return block.parent_beacon_block_root;
38
66.8k
        }},
39
    StorageSystemContract{EVMC_PRAGUE, HISTORY_STORAGE_ADDRESS,
40
47.0k
        [](const BlockInfo& block, const BlockHashes& block_hashes) noexcept {
41
47.0k
            return block_hashes.get_block_hash(block.number - 1);
42
47.0k
        }},
43
};
44
45
/// Registered "requests" system contracts.
46
constexpr std::array REQUESTS_SYSTEM_CONTRACTS{
47
    RequestsSystemContract{
48
        EVMC_PRAGUE,
49
        WITHDRAWAL_REQUEST_ADDRESS,
50
        Requests::Type::withdrawal,
51
    },
52
    RequestsSystemContract{
53
        EVMC_PRAGUE,
54
        CONSOLIDATION_REQUEST_ADDRESS,
55
        Requests::Type::consolidation,
56
    },
57
};
58
59
0
constexpr auto by_rev = [](const auto& a, const auto& b) noexcept { return a.since < b.since; };
Unexecuted instantiation: system_contracts.cpp:auto evmone::state::(anonymous namespace)::$_0::operator()<evmone::state::(anonymous namespace)::StorageSystemContract, evmone::state::(anonymous namespace)::StorageSystemContract>(evmone::state::(anonymous namespace)::StorageSystemContract const&, evmone::state::(anonymous namespace)::StorageSystemContract const&) const
Unexecuted instantiation: system_contracts.cpp:auto evmone::state::(anonymous namespace)::$_0::operator()<evmone::state::(anonymous namespace)::RequestsSystemContract, evmone::state::(anonymous namespace)::RequestsSystemContract>(evmone::state::(anonymous namespace)::RequestsSystemContract const&, evmone::state::(anonymous namespace)::RequestsSystemContract const&) const
60
static_assert(std::ranges::is_sorted(STORAGE_SYSTEM_CONTRACTS, by_rev),
61
    "system contract entries must be ordered by revision");
62
static_assert(std::ranges::is_sorted(REQUESTS_SYSTEM_CONTRACTS, by_rev),
63
    "system contract entries must be ordered by revision");
64
65
66
evmc::Result execute_system_call(State& state, const BlockInfo& block,
67
    const BlockHashes& block_hashes, evmc_revision rev, evmc::VM& vm, const address& addr,
68
    bytes_view code, bytes_view input)
69
207k
{
70
207k
    const evmc_message msg{
71
207k
        .kind = EVMC_CALL,
72
207k
        .gas = 30'000'000,
73
207k
        .recipient = addr,
74
207k
        .sender = SYSTEM_ADDRESS,
75
207k
        .input_data = input.data(),
76
207k
        .input_size = input.size(),
77
207k
    };
78
79
207k
    const Transaction empty_tx{};
80
207k
    Host host{rev, vm, state, block, block_hashes, empty_tx};
81
207k
    return vm.execute(host, rev, msg, code.data(), code.size());
82
207k
}
83
}  // namespace
84
85
StateDiff system_call_block_start(const StateView& state_view, const BlockInfo& block,
86
    const BlockHashes& block_hashes, evmc_revision rev, evmc::VM& vm)
87
89.8k
{
88
89.8k
    State state{state_view};
89
89.8k
    for (const auto& [since, addr, get_input] : STORAGE_SYSTEM_CONTRACTS)
  Branch (89:47): [True: 156k, False: 47.0k]
+
90
156k
    {
91
156k
        if (rev < since)
  Branch (91:13): [True: 42.7k, False: 113k]
+
92
42.7k
            break;  // Because entries are ordered, there are no other contracts for this revision.
93
94
        // Skip the call if the target account doesn't exist. This is by EIP-4788 spec.
95
        // > if no code exists at [address], the call must fail silently.
96
113k
        const auto code = state_view.get_account_code(addr);
97
113k
        if (code.empty())
  Branch (97:13): [True: 8, False: 113k]
+
98
8
            continue;
99
100
113k
        const auto input32 = get_input(block, block_hashes);
101
113k
        const auto res =
102
113k
            execute_system_call(state, block, block_hashes, rev, vm, addr, code, input32);
103
113k
        assert(res.status_code == EVMC_SUCCESS);
104
113k
    }
105
    // TODO: Should we return empty diff if no system contracts?
106
89.8k
    return state.build_diff(rev);
107
89.8k
}
108
109
std::optional<RequestsResult> system_call_block_end(const StateView& state_view,
110
    const BlockInfo& block, const BlockHashes& block_hashes, evmc_revision rev, evmc::VM& vm)
111
89.7k
{
112
89.7k
    State state{state_view};
113
89.7k
    std::vector<Requests> requests;
114
89.7k
    for (const auto& [since, addr, request_type] : REQUESTS_SYSTEM_CONTRACTS)
  Branch (114:50): [True: 136k, False: 47.0k]
+
115
136k
    {
116
136k
        if (rev < since)
  Branch (116:13): [True: 42.7k, False: 94.0k]
+
117
42.7k
            break;  // Because entries are ordered, there are no other contracts for this revision.
118
119
        // Fail if the target account doesn't exist. This is by EIP-7002 and EIP-7251 spec.
120
94.0k
        const auto code = state_view.get_account_code(addr);
121
94.0k
        if (code.empty())
  Branch (121:13): [True: 4, False: 94.0k]
+
122
4
            return std::nullopt;
123
124
94.0k
        const auto res = execute_system_call(state, block, block_hashes, rev, vm, addr, code, {});
125
94.0k
        if (res.status_code != EVMC_SUCCESS)
  Branch (125:13): [True: 12, False: 94.0k]
+
126
12
            return std::nullopt;
127
94.0k
        requests.emplace_back(request_type, bytes_view{res.output_data, res.output_size});
128
94.0k
    }
129
89.7k
    return RequestsResult{state.build_diff(rev), requests};
130
89.7k
}
131
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/transaction.hpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/transaction.hpp.html new file mode 100644 index 0000000000..fe5a9a3b9d --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/state/transaction.hpp.html @@ -0,0 +1 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/state/transaction.hpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#pragma once
6
7
#include "blob_params.hpp"
8
#include "bloom_filter.hpp"
9
#include "state_diff.hpp"
10
#include <intx/intx.hpp>
11
#include <optional>
12
#include <vector>
13
14
namespace evmone::state
15
{
16
/// The maximum allowed gas limit for a transaction (EIP-7825).
17
constexpr auto MAX_TX_GAS_LIMIT = 0x1000000;  // 2**24
18
19
using AccessList = std::vector<std::pair<address, std::vector<bytes32>>>;
20
21
struct Authorization
22
{
23
    intx::uint256 chain_id;
24
    address addr;
25
    uint64_t nonce = 0;
26
    /// Signer is empty if it cannot be ecrecovered from r, s, v.
27
    std::optional<address> signer;
28
    intx::uint256 r;
29
    intx::uint256 s;
30
    intx::uint256 v;
31
};
32
33
using AuthorizationList = std::vector<Authorization>;
34
35
struct Transaction
36
{
37
    /// The type of the transaction.
38
    ///
39
    /// The format is defined by EIP-2718: Typed Transaction Envelope.
40
    /// https://eips.ethereum.org/EIPS/eip-2718.
41
    enum class Type : uint8_t
42
    {
43
        /// The legacy RLP-encoded transaction without leading "type" byte.
44
        legacy = 0,
45
46
        /// The typed transaction with optional account/storage access list.
47
        /// Introduced by EIP-2930 https://eips.ethereum.org/EIPS/eip-2930.
48
        access_list = 1,
49
50
        /// The typed transaction with priority gas price.
51
        /// Introduced by EIP-1559 https://eips.ethereum.org/EIPS/eip-1559.
52
        eip1559 = 2,
53
54
        /// The typed blob transaction (with array of blob hashes).
55
        /// Introduced by EIP-4844 https://eips.ethereum.org/EIPS/eip-4844.
56
        blob = 3,
57
58
        /// The typed set code transaction (with authorization list).
59
        /// Introduced by EIP-7702 https://eips.ethereum.org/EIPS/eip-7702.
60
        set_code = 4,
61
    };
62
63
    /// Returns amount of blob gas used by this transaction
64
126k
    [[nodiscard]] uint64_t blob_gas_used() const { return GAS_PER_BLOB * blob_hashes.size(); }
65
66
    Type type = Type::legacy;
67
    bytes data;
68
    int64_t gas_limit = 0;
69
    intx::uint256 max_gas_price;
70
    intx::uint256 max_priority_gas_price;
71
    intx::uint256 max_blob_gas_price;
72
    address sender;
73
    std::optional<address> to;
74
    intx::uint256 value;
75
    AccessList access_list;
76
    std::vector<bytes32> blob_hashes;
77
    uint64_t chain_id = 0;
78
    uint64_t nonce = 0;
79
    intx::uint256 r;
80
    intx::uint256 s;
81
    uint8_t v = 0;
82
    AuthorizationList authorization_list;
83
};
84
85
/// Transaction properties computed during the validation needed for the execution.
86
struct TransactionProperties
87
{
88
    /// The amount of gas provided to the EVM for the transaction execution.
89
    int64_t execution_gas_limit = 0;
90
91
    /// The minimal amount of gas the transaction must use.
92
    int64_t min_gas_cost = 0;
93
};
94
95
struct Log
96
{
97
    address addr;
98
    bytes data;
99
    std::vector<bytes32> topics;
100
};
101
102
/// Transaction Receipt
103
///
104
/// This struct is used in two contexts:
105
/// 1. As the formally specified, RLP-encode transaction receipt included in the Ethereum blocks.
106
/// 2. As the internal representation of the transaction execution result.
107
/// These both roles share most, but not all the information. There are some fields that cannot be
108
/// assigned in the single transaction execution context. There are also fields that are not a part
109
/// of the RLP-encoded transaction receipts.
110
/// TODO: Consider splitting the struct into two based on the duality explained above.
111
struct TransactionReceipt
112
{
113
    Transaction::Type type = Transaction::Type::legacy;
114
    evmc_status_code status = EVMC_INTERNAL_ERROR;
115
116
    /// Amount of gas used by this transaction.
117
    int64_t gas_used = 0;
118
119
    /// Amount of gas used by this and previous transactions in the block.
120
    int64_t cumulative_gas_used = 0;
121
    std::vector<Log> logs;
122
    BloomFilter logs_bloom_filter;
123
    StateDiff state_diff;
124
125
    /// Root hash of the state after this transaction. Used only in old pre-Byzantium transactions.
126
    std::optional<bytes32> post_state;
127
};
128
129
}  // namespace evmone::state
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/statetest/statetest.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/statetest/statetest.cpp.html new file mode 100644 index 0000000000..657ac12b53 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/statetest/statetest.cpp.html @@ -0,0 +1,74 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/statetest/statetest.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include <CLI/CLI.hpp>
6
#include <evmone/evmone.h>
7
#include <evmone/version.h>
8
#include <gtest/gtest.h>
9
#include <test/utils/statetest.hpp>
10
#include <iostream>
11
12
namespace fs = std::filesystem;
13
14
namespace
15
{
16
/// Implementation of a gtest Test which runs all state tests from a given file.
17
class StateTestFile : public testing::Test
18
{
19
    fs::path m_json_test_file;
20
    std::optional<std::string> m_filter;
21
    evmc::VM& m_vm;
22
    bool m_trace = false;
23
24
public:
25
    explicit StateTestFile(fs::path json_test_file, const std::optional<std::string>& filter,
26
        evmc::VM& vm, bool trace) noexcept
27
2.69k
      : m_json_test_file{std::move(json_test_file)}, m_filter{filter}, m_vm{vm}, m_trace{trace}
28
2.69k
    {}
29
30
    void TestBody() final
31
2.69k
    {
32
2.69k
        std::ifstream f{m_json_test_file};
33
2.69k
        const auto tests = evmone::test::load_state_tests(f);
34
2.69k
        for (const auto& test : tests)
  Branch (34:31): [True: 63.8k, False: 2.69k]
+
35
63.8k
        {
36
63.8k
            if (m_filter.has_value() && 
test.name.find(*m_filter) == std::string::npos0
)
  Branch (36:17): [True: 0, False: 63.8k]
+  Branch (36:41): [True: 0, False: 0]
+
  MC/DC Decision Region (36:17) to (36:87)
+
+  Number of Conditions: 2
+     Condition C1 --> (36:17)
+     Condition C2 --> (36:41)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  -  = F      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
37
0
                continue;
38
63.8k
            evmone::test::run_state_test(test, m_vm, m_trace);
39
63.8k
        }
40
2.69k
    }
41
42
    static void register_one(const std::string& suite_name, const fs::path& file,
43
        const std::optional<std::string>& filter, evmc::VM& vm, bool trace)
44
2.69k
    {
45
2.69k
        testing::RegisterTest(suite_name.c_str(), file.stem().string().c_str(), nullptr, nullptr,
46
2.69k
            file.string().c_str(), 0, [file, filter, &vm, trace]() -> testing::Test* {
47
2.69k
                return new StateTestFile(file, filter, vm, trace);
48
2.69k
            });
49
2.69k
    }
50
};
51
52
/// Implementation of a gtest Test which runs a single state test.
53
class StateTest : public testing::Test
54
{
55
    evmone::test::StateTransitionTest m_state_transition_test;
56
    evmc::VM& m_vm;
57
    bool m_trace = false;
58
59
public:
60
    explicit StateTest(
61
        evmone::test::StateTransitionTest state_transition_test, evmc::VM& vm, bool trace) noexcept
62
0
      : m_state_transition_test{std::move(state_transition_test)}, m_vm{vm}, m_trace{trace}
63
0
    {}
64
65
0
    void TestBody() final { evmone::test::run_state_test(m_state_transition_test, m_vm, m_trace); }
66
67
    static void register_one(const evmone::test::StateTransitionTest& test,
68
        const std::string& suite_name, const std::string& test_name, const fs::path& file,
69
        evmc::VM& vm, bool trace)
70
0
    {
71
0
        testing::RegisterTest(suite_name.c_str(), test_name.c_str(), nullptr, nullptr,
72
0
            file.string().c_str(), 0,
73
0
            [test, &vm, trace]() -> testing::Test* { return new StateTest(test, vm, trace); });
74
0
    }
75
};
76
77
void register_test_files(
78
    const fs::path& root, const std::optional<std::string>& filter, evmc::VM& vm, bool trace)
79
1
{
80
1
    if (is_directory(root))
  Branch (80:9): [True: 1, False: 0]
+
81
1
    {
82
1
        std::vector<fs::path> test_files;
83
1
        std::copy_if(fs::recursive_directory_iterator{root}, fs::recursive_directory_iterator{},
84
2.81k
            std::back_inserter(test_files), [](const fs::directory_entry& entry) {
85
                // "index.json" files are just lists of tests generated by other tools.
86
2.81k
                return entry.is_regular_file() && 
entry.path().extension() == ".json"2.69k
&&
  Branch (86:24): [True: 2.69k, False: 118]
+  Branch (86:51): [True: 2.69k, False: 0]
+
87
2.81k
                       
entry.path().filename() != "index.json"2.69k
;
  Branch (87:24): [True: 2.69k, False: 0]
+
  MC/DC Decision Region (86:24) to (87:63)
+
+  Number of Conditions: 3
+     Condition C1 --> (86:24)
+     Condition C2 --> (86:51)
+     Condition C3 --> (87:24)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2, C3    Result
+  1 { F,  -,  -  = F      }
+  2 { T,  T,  T  = T      }
+
+  C1-Pair: covered: (1,2)
+  C2-Pair: not covered
+  C3-Pair: not covered
+  MC/DC Coverage for Expression: 33.33%
+
88
2.81k
            });
89
1
        std::ranges::sort(test_files);
90
91
1
        for (const auto& p : test_files)
  Branch (91:28): [True: 2.69k, False: 1]
+
92
2.69k
            StateTestFile::register_one(
93
2.69k
                fs::relative(p, root).parent_path().string(), p, filter, vm, trace);
94
1
    }
95
0
    else  // Treat as a file.
96
0
    {
97
0
        std::ifstream f{root};
98
0
        const auto tests = evmone::test::load_state_tests(f);
99
0
        for (const auto& test : tests)
  Branch (99:31): [True: 0, False: 0]
+
100
0
        {
101
0
            if (filter.has_value() && test.name.find(*filter) == std::string::npos)
  Branch (101:17): [True: 0, False: 0]
+  Branch (101:39): [True: 0, False: 0]
+
  MC/DC Decision Region (101:17) to (101:83)
+
+  Number of Conditions: 2
+     Condition C1 --> (101:17)
+     Condition C2 --> (101:39)
+
+  Executed MC/DC Test Vectors:
+
+     None.
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
102
0
                continue;
103
0
            StateTest::register_one(test, root.string(), test.name, root, vm, trace);
104
0
        }
105
0
    }
106
1
}
107
}  // namespace
108
109
110
int main(int argc, char* argv[])
111
1
{
112
    // The default test filter. To enable all tests use `--gtest_filter=*`.
113
1
    testing::FLAGS_gtest_filter =
114
1
        "-"
115
        // Slow tests:
116
1
        "stCreateTest.CreateOOGafterMaxCodesize:"      // pass
117
1
        "stQuadraticComplexityTest.Call50000_sha256:"  // pass
118
1
        "stTimeConsuming.static_Call50000_sha256:"     // pass
119
1
        "stTimeConsuming.CALLBlake2f_MaxRounds:"       // pass
120
1
        "VMTests/vmPerformance.*:"                     // pass
121
1
        ;
122
123
1
    try
124
1
    {
125
1
        testing::InitGoogleTest(&argc, argv);  // Process GoogleTest flags.
126
127
1
        CLI::App app{"evmone state test runner"};
128
129
1
        app.set_version_flag("--version", "evmone-statetest " EVMONE_VERSION);
130
131
1
        std::vector<std::string> paths;
132
1
        app.add_option("path", paths,
133
1
               "Path to test file or directory. For a directory, all .json "
134
1
               "files (except index.json) are considered test files, and each file is treated as a "
135
1
               "separate test. For a file, all tests in the file are treated as separate tests.")
136
1
            ->required()
137
1
            ->check(CLI::ExistingPath);
138
139
1
        std::optional<std::string> filter;
140
1
        app.add_option("-k", filter,
141
1
            "Test name filter. Run only tests with names containing the specified string.");
142
143
1
        bool trace = false;
144
1
        bool trace_summary = false;
145
1
        const auto trace_opt = app.add_flag("--trace", trace, "Enable EVM tracing");
146
1
        app.add_flag("--trace-summary", trace_summary, "Output trace summary only")
147
1
            ->excludes(trace_opt);
148
149
1
        CLI11_PARSE(app, argc, argv);
150
151
1
        evmc::VM vm{evmc_create_evmone(), {{"O", "0"}}};
152
153
1
        if (trace)
  Branch (153:13): [True: 0, False: 1]
+
154
0
        {
155
0
            std::ios::sync_with_stdio(false);
156
0
            vm.set_option("trace", "1");
157
0
        }
158
159
1
        for (const auto& p : paths)
  Branch (159:28): [True: 1, False: 1]
+
160
1
            register_test_files(p, filter, vm, trace || trace_summary);
  Branch (160:48): [True: 0, False: 1]
+  Branch (160:57): [True: 0, False: 1]
+
  MC/DC Decision Region (160:48) to (160:70)
+
+  Number of Conditions: 2
+     Condition C1 --> (160:48)
+     Condition C2 --> (160:57)
+
+  Executed MC/DC Test Vectors:
+
+     C1, C2    Result
+  1 { F,  F  = F      }
+
+  C1-Pair: not covered
+  C2-Pair: not covered
+  MC/DC Coverage for Expression: 0.00%
+
161
162
1
        return RUN_ALL_TESTS();
163
1
    }
164
1
    catch (const std::exception& ex)
165
1
    {
166
0
        std::cerr << ex.what() << "\n";
167
0
        return -1;
168
0
    }
169
1
}
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/statetest/statetest_runner.cpp.html b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/statetest/statetest_runner.cpp.html new file mode 100644 index 0000000000..1ef53059a2 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/coverage/home/user/sources/ethereum/evmone/test/statetest/statetest_runner.cpp.html @@ -0,0 +1,22 @@ +

Coverage Report

Created: 2025-11-29 10:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/user/sources/ethereum/evmone/test/statetest/statetest_runner.cpp
Line
Count
Source
1
// evmone: Fast Ethereum Virtual Machine implementation
2
// Copyright 2022 The evmone Authors.
3
// SPDX-License-Identifier: Apache-2.0
4
5
#include <gtest/gtest.h>
6
#include <test/utils/mpt_hash.hpp>
7
#include <test/utils/rlp.hpp>
8
#include <test/utils/statetest.hpp>
9
10
namespace evmone::test
11
{
12
void run_state_test(const StateTransitionTest& test, evmc::VM& vm, bool trace_summary)
13
63.8k
{
14
63.8k
    SCOPED_TRACE(test.name);
15
63.8k
    for (const auto& [rev, cases, block] : test.cases)
  Branch (15:42): [True: 63.8k, False: 63.8k]
+
16
63.8k
    {
17
63.8k
        validate_state(test.pre_state, rev);
18
127k
        for (size_t case_index = 0; case_index != cases.size(); 
++case_index63.8k
)
  Branch (18:37): [True: 63.8k, False: 63.8k]
+
19
63.8k
        {
20
63.8k
            SCOPED_TRACE(std::string{evmc::to_string(rev)} + '/' + std::to_string(case_index));
21
            // if (rev != EVMC_FRONTIER)
22
            //     continue;
23
            // if (case_index != 3)
24
            //     continue;
25
26
63.8k
            const auto& expected = cases[case_index];
27
63.8k
            const auto tx = test.multi_tx.get(expected.indexes);
28
63.8k
            auto state = test.pre_state;
29
63.8k
            const auto blob_params = get_blob_params(rev, test.blob_schedule);
30
31
63.8k
            const auto res = test::transition(state, block, test.block_hashes, tx, rev, vm,
32
63.8k
                block.gas_limit, static_cast<int64_t>(state::max_blob_gas_per_block(blob_params)));
33
34
            // Finalize block with reward 0.
35
63.8k
            test::finalize(state, rev, block.coinbase, 0, {}, {});
36
37
63.8k
            const auto state_root = state::mpt_hash(state);
38
39
63.8k
            if (trace_summary)
  Branch (39:17): [True: 0, False: 63.8k]
+
40
0
            {
41
0
                std::clog << '{';
42
0
                if (holds_alternative<state::TransactionReceipt>(res))  // if tx valid
  Branch (42:21): [True: 0, False: 0]
+
43
0
                {
44
0
                    const auto& r = get<state::TransactionReceipt>(res);
45
0
                    if (r.status == EVMC_SUCCESS)
  Branch (45:25): [True: 0, False: 0]
+
46
0
                        std::clog << R"("pass":true)";
47
0
                    else
48
0
                        std::clog << R"("pass":false,"error":")" << r.status << '"';
49
0
                    std::clog << R"(,"gasUsed":"0x)" << std::hex << r.gas_used << R"(",)";
50
0
                }
51
0
                std::clog << R"("stateRoot":"0x)" << hex(state_root) << "\"}\n";
52
0
            }
53
54
63.8k
            if (expected.exception)
  Branch (54:17): [True: 3.05k, False: 60.7k]
+
55
3.05k
            {
56
6.11k
                
ASSERT_FALSE3.05k
(holds_alternative<state::TransactionReceipt>(res))
  Branch (56:17): [True: 3.05k, False: 0]
+  Branch (56:17): [True: 0, False: 3.05k]
+  Branch (56:17): [True: 3.05k, False: 0]
+
57
6.11k
                    << "unexpected valid transaction";
58
3.05k
                EXPECT_EQ(logs_hash(std::vector<state::Log>()), expected.logs_hash);
  Branch (58:17): [True: 3.05k, False: 0]
+  Branch (58:17): [True: 0, False: 3.05k]
+  Branch (58:17): [True: 3.05k, False: 0]
+
59
3.05k
            }
60
60.7k
            else
61
60.7k
            {
62
121k
                
ASSERT_TRUE60.7k
(holds_alternative<state::TransactionReceipt>(res))
  Branch (62:17): [True: 60.7k, False: 0]
+  Branch (62:17): [True: 0, False: 60.7k]
+  Branch (62:17): [True: 60.7k, False: 0]
+
63
121k
                    << "unexpected invalid transaction: " << get<std::error_code>(res).message();
64
60.7k
                EXPECT_EQ(logs_hash(get<state::TransactionReceipt>(res).logs), expected.logs_hash);
  Branch (64:17): [True: 60.7k, False: 0]
+  Branch (64:17): [True: 0, False: 60.7k]
+  Branch (64:17): [True: 60.7k, False: 0]
+
65
60.7k
            }
66
67
63.8k
            EXPECT_EQ(state_root, expected.state_hash);
  Branch (67:13): [True: 63.8k, False: 0]
+  Branch (67:13): [True: 0, False: 63.8k]
+  Branch (67:13): [True: 63.8k, False: 0]
+
68
63.8k
        }
69
63.8k
    }
70
63.8k
}
71
}  // namespace evmone::test
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/index.html b/reports/coverage_eest_wip_annotated/html/index.html new file mode 100644 index 0000000000..a51c30c5fd --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/index.html @@ -0,0 +1,5 @@ + +

Coverage Report

Created: 2025-11-29 10:00

Click here for information about interpreting this report.

FilenameFunction CoverageLine CoverageRegion CoverageBranch CoverageMC/DCAnnotation
include/evmmax/evmmax.hpp
 100.00% (10/10)
 100.00% (94/94)
 100.00% (50/50)
 100.00% (26/26)
   0.00% (0/2)
  • line 122 MC/DC - definitely both conditions in the decision are covered - verified manually.
lib/evmone/baseline.hpp
 100.00% (8/8)
 100.00% (27/27)
 100.00% (16/16)
 100.00% (2/2)
- (0/0)
lib/evmone/baseline_analysis.cpp
 100.00% (3/3)
 100.00% (31/31)
 100.00% (11/11)
 100.00% (6/6)
- (0/0)
lib/evmone/baseline_execution.cpp
  90.91% (10/11)
  72.67% (125/172)
  56.36% (2375/4214)
  34.02% (316/929)
 100.00% (2/2)
  • line 86 handles out-of-gas for REVERT, but REVERT has 0 constant gas cost and has been defined in Byzantium, we cannot avoid generating this code statically.
  • line 155 handles non-success from `check_requirements` - for STOP and INVALID not possible - no stack, no constant gas, opcodes always defined.
  • lines 168 and below: either tracing or due to way evmone is built (cgoto support).
lib/evmone/baseline_instruction_table.cpp
 100.00% (1/1)
 100.00% (3/3)
 100.00% (1/1)
- (0/0)
- (0/0)
lib/evmone/delegation.cpp
 100.00% (1/1)
 100.00% (10/10)
 100.00% (6/6)
 100.00% (2/2)
- (0/0)
lib/evmone/delegation.hpp
 100.00% (1/1)
 100.00% (3/3)
 100.00% (1/1)
- (0/0)
- (0/0)
lib/evmone/execution_state.hpp
  85.71% (12/14)
  91.84% (45/49)
  73.53% (25/34)
  75.00% (9/12)
- (0/0)
  • lines 77 and below: out_of_memory and impossible memory operations - untestable
  • line 176: constructor - internal workings of evmone.
lib/evmone/instructions.hpp
  98.90% (90/91)
  99.83% (588/589)
  99.70% (330/331)
  99.45% (181/182)
  85.00% (17/20)
  • line 28: internals of evmone
  • line 632: blockhash MC/DC - Verified manually, both conditions in the decision are covered with added test
lib/evmone/instructions_calls.cpp
 100.00% (3/3)
  98.66% (147/149)
  91.80% (112/122)
  95.29% (81/85)
 100.00% (11/11)
  • line 70: most definitely covered - verified manually. Other occurrences are due to wrong interpretation of template instances and constexprs by llvm-cov.
lib/evmone/instructions_storage.cpp
 100.00% (2/2)
 100.00% (34/34)
 100.00% (25/25)
 100.00% (20/20)
 100.00% (6/6)
lib/evmone_precompiles/blake2b.cpp
 100.00% (3/3)
 100.00% (48/48)
 100.00% (9/9)
 100.00% (4/4)
- (0/0)
lib/evmone_precompiles/bls.cpp
 100.00% (15/15)
 100.00% (265/265)
 100.00% (132/132)
 100.00% (74/74)
 100.00% (6/6)
lib/evmone_precompiles/bn254.cpp
 100.00% (2/2)
 100.00% (10/10)
 100.00% (4/4)
 100.00% (4/4)
 100.00% (2/2)
lib/evmone_precompiles/ecc.hpp
 100.00% (33/33)
  99.52% (208/209)
  98.90% (90/91)
  94.29% (33/35)
  75.00% (3/4)
  • line 196, MC/DC in `operator==` in `struct JacPoint`. Likely not possible to get a True False combination in the condition here.
  • other occurrences commented in code
lib/evmone_precompiles/keccak.c
  87.50% (7/8)
  98.81% (249/252)
  96.67% (29/30)
  87.50% (14/16)
   0.00% (0/2)
  • `keccakf1600_generic` and part of `select_keccakf1600_implementation` both related to build architecture, not coverage by tests
lib/evmone_precompiles/keccak.hpp
 100.00% (1/1)
 100.00% (3/3)
 100.00% (1/1)
- (0/0)
- (0/0)
lib/evmone_precompiles/kzg.cpp
 100.00% (8/8)
 100.00% (68/68)
 100.00% (32/32)
 100.00% (16/16)
- (0/0)
lib/evmone_precompiles/modexp.cpp
 100.00% (11/11)
 100.00% (105/105)
 100.00% (58/58)
 100.00% (26/26)
- (0/0)
lib/evmone_precompiles/pairing/bn254/fields.hpp
 100.00% (7/7)
 100.00% (78/78)
 100.00% (7/7)
- (0/0)
- (0/0)
lib/evmone_precompiles/pairing/bn254/pairing.cpp
 100.00% (4/4)
 100.00% (106/106)
 100.00% (46/46)
 100.00% (36/36)
 100.00% (13/13)
lib/evmone_precompiles/pairing/bn254/utils.hpp
 100.00% (24/24)
 100.00% (312/312)
 100.00% (34/34)
 100.00% (12/12)
 100.00% (4/4)
lib/evmone_precompiles/pairing/field_template.hpp
 100.00% (24/24)
 100.00% (65/65)
 100.00% (39/39)
 100.00% (10/10)
- (0/0)
lib/evmone_precompiles/ripemd160.cpp
 100.00% (12/12)
 100.00% (71/71)
 100.00% (24/24)
 100.00% (10/10)
- (0/0)
lib/evmone_precompiles/secp256k1.cpp
 100.00% (5/5)
 100.00% (112/112)
 100.00% (74/74)
 100.00% (48/48)
 100.00% (4/4)
lib/evmone_precompiles/secp256r1.cpp
 100.00% (2/2)
 100.00% (31/31)
 100.00% (26/26)
 100.00% (20/20)
 100.00% (6/6)
lib/evmone_precompiles/sha256.cpp
  70.00% (7/10)
  78.18% (240/307)
  76.85% (83/108)
  50.00% (20/40)
   0.00% (0/4)
  • reported gaps due to build architecture for which evmone code compiles, not test coverage
test/blockchaintest/blockchaintest.cpp
  63.64% (7/11)
  67.78% (61/90)
  72.92% (35/48)
  62.50% (10/16)
  33.33% (1/3)
  • reported gaps due to the way evmone-blockchaintest is invoked
test/blockchaintest/blockchaintest_runner.cpp
  83.33% (5/6)
  86.56% (264/305)
  76.53% (499/652)
  60.66% (148/244)
  43.75% (7/16)
  • line 124 parent header missing - covered in a skipped test in header validation test
  • line 155 difficulty check fails - covered in a skipped test in header validation test
  • line 158 ommers non empty - we don't need to cover ommer stuff
  • line 165 ommers - we don't need to cover ommer stuff
  • line 170 extra_data check fails - covered in a skipped test in header validation test
  • line 211 - not possible to fill tests having misformatted withdrawals - either EEST fails on some stage of validation (withdrawals_root mismatch) or evmone/geth fail to fill it (e.g. >uint64 or a 19 byte address)
test/state/account.hpp
 100.00% (1/1)
 100.00% (3/3)
 100.00% (5/5)
 100.00% (6/6)
 100.00% (3/3)
test/state/block.cpp
 100.00% (5/5)
 100.00% (76/76)
 100.00% (26/26)
 100.00% (16/16)
 100.00% (2/2)
test/state/block.hpp
 100.00% (1/1)
 100.00% (3/3)
 100.00% (1/1)
- (0/0)
- (0/0)
test/state/bloom_filter.cpp
 100.00% (4/4)
 100.00% (33/33)
 100.00% (10/10)
 100.00% (8/8)
- (0/0)
test/state/bloom_filter.hpp
 100.00% (1/1)
 100.00% (1/1)
 100.00% (1/1)
- (0/0)
- (0/0)
test/state/errors.hpp
  75.00% (3/4)
  93.75% (105/112)
  78.57% (22/28)
  93.18% (41/44)
- (0/0)
  • gaps due to console output utilities
test/state/ethash_difficulty.cpp
 100.00% (4/4)
  92.73% (51/55)
  86.84% (33/38)
  83.33% (25/30)
- (0/0)
  • line 17 `get_bomb_delay` is never called for forks other than listed
  • line 47 covering this would require a blockchain test of >100k blocks, not worth it
test/state/hash_utils.hpp
 100.00% (1/1)
 100.00% (3/3)
 100.00% (1/1)
- (0/0)
- (0/0)
test/state/host.cpp
 100.00% (22/22)
 100.00% (329/329)
 100.00% (217/217)
 100.00% (136/136)
 100.00% (34/34)
test/state/host.hpp
 100.00% (2/2)
 100.00% (3/3)
 100.00% (8/8)
- (0/0)
- (0/0)
test/state/precompiles.cpp
 100.00% (49/49)
 100.00% (542/542)
 100.00% (293/293)
 100.00% (144/144)
 100.00% (17/17)
test/state/precompiles_stubs.cpp
  66.67% (2/3)
  53.19% (25/47)
  43.48% (10/23)
  21.43% (3/14)
   0.00% (0/5)
  • stubs of precompiles, not relevant to coverage
test/state/requests.cpp
 100.00% (4/4)
 100.00% (99/99)
 100.00% (54/54)
 100.00% (38/38)
 100.00% (9/9)
test/state/requests.hpp
  75.00% (3/4)
  87.50% (7/8)
  75.00% (3/4)
- (0/0)
- (0/0)
  • line 56 readability utility for `evmone` internal testing, not relevant to coverage
test/state/state.cpp
 100.00% (27/27)
  99.09% (436/440)
  98.91% (271/274)
  98.94% (186/188)
 100.00% (22/22)
  • line 357 tested in https://github.com/ethereum/legacytests/blob/master/src/LegacyTests/Constantinople/GeneralStateTestsFiller/stRevertTest/RevertPrecompiledTouchFiller.json, but that is unportable, because EEST doesn't support empty accounts in prestate.
  • line 544 ommers - we don't need to cover ommer stuff
test/state/state.hpp
 100.00% (2/2)
 100.00% (2/2)
 100.00% (3/3)
- (0/0)
- (0/0)
test/state/state_view.hpp
 100.00% (2/2)
 100.00% (2/2)
 100.00% (2/2)
- (0/0)
- (0/0)
test/state/system_contracts.cpp
  83.33% (5/6)
  98.11% (52/53)
  96.15% (25/26)
 100.00% (14/14)
- (0/0)
  • by_rev is only called in compile time
test/state/transaction.hpp
 100.00% (1/1)
 100.00% (1/1)
 100.00% (1/1)
- (0/0)
- (0/0)
test/statetest/statetest.cpp
  63.64% (7/11)
  73.58% (78/106)
  62.00% (31/50)
  50.00% (15/30)
  11.11% (1/9)
  • reported gaps are due to the way evmone-statetest is invoked
test/statetest/statetest_runner.cpp
 100.00% (1/1)
  71.74% (33/46)
  73.08% (114/156)
  52.38% (22/42)
- (0/0)
  • reported gaps related to tracing
Totals
  95.68% (465/486)
  95.06% (5287/5562)
  71.24% (5305/7447)
  68.94% (1782/2585)
  82.52% (170/206)

Files which contain no functions. (These files contain code pulled into other files by the preprocessor.) +

+ +
build/cov/test/evmone/version.h
lib/evmone/instructions_xmacro.hpp
Generated by llvm-cov -- llvm version 20.1.8
\ No newline at end of file diff --git a/reports/coverage_eest_wip_annotated/html/style.css b/reports/coverage_eest_wip_annotated/html/style.css new file mode 100644 index 0000000000..ae4f09f692 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/html/style.css @@ -0,0 +1,194 @@ +.red { + background-color: #f004; +} +.cyan { + background-color: cyan; +} +html { + scroll-behavior: smooth; +} +body { + font-family: -apple-system, sans-serif; +} +pre { + margin-top: 0px !important; + margin-bottom: 0px !important; +} +.source-name-title { + padding: 5px 10px; + border-bottom: 1px solid #8888; + background-color: #0002; + line-height: 35px; +} +.centered { + display: table; + margin-left: left; + margin-right: auto; + border: 1px solid #8888; + border-radius: 3px; +} +.expansion-view { + margin-left: 0px; + margin-top: 5px; + margin-right: 5px; + margin-bottom: 5px; + border: 1px solid #8888; + border-radius: 3px; +} +table { + border-collapse: collapse; +} +.light-row { + border: 1px solid #8888; + border-left: none; + border-right: none; +} +.light-row-bold { + border: 1px solid #8888; + border-left: none; + border-right: none; + font-weight: bold; +} +.column-entry { + text-align: left; +} +.column-entry-bold { + font-weight: bold; + text-align: left; +} +.column-entry-yellow { + text-align: left; + background-color: #ff06; +} +.column-entry-red { + text-align: left; + background-color: #f004; +} +.column-entry-gray { + text-align: left; + background-color: #fff4; +} +.column-entry-green { + text-align: left; + background-color: #0f04; +} +.line-number { + text-align: right; +} +.covered-line { + text-align: right; + color: #06d; +} +.uncovered-line { + text-align: right; + color: #d00; +} +.uncovered-line.selected { + color: #f00; + font-weight: bold; +} +.region.red.selected { + background-color: #f008; + font-weight: bold; +} +.branch.red.selected { + background-color: #f008; + font-weight: bold; +} +.tooltip { + position: relative; + display: inline; + background-color: #bef; + text-decoration: none; +} +.tooltip span.tooltip-content { + position: absolute; + width: 100px; + margin-left: -50px; + color: #FFFFFF; + background: #000000; + height: 30px; + line-height: 30px; + text-align: center; + visibility: hidden; + border-radius: 6px; +} +.tooltip span.tooltip-content:after { + content: ''; + position: absolute; + top: 100%; + left: 50%; + margin-left: -8px; + width: 0; height: 0; + border-top: 8px solid #000000; + border-right: 8px solid transparent; + border-left: 8px solid transparent; +} +:hover.tooltip span.tooltip-content { + visibility: visible; + opacity: 0.8; + bottom: 30px; + left: 50%; + z-index: 999; +} +th, td { + vertical-align: top; + padding: 2px 8px; + border-collapse: collapse; + border-right: 1px solid #8888; + border-left: 1px solid #8888; + text-align: left; +} +td pre { + display: inline-block; + text-decoration: inherit; +} +td:first-child { + border-left: none; +} +td:last-child { + border-right: none; +} +tr:hover { + background-color: #eee; +} +tr:last-child { + border-bottom: none; +} +tr:has(> td >a:target), tr:has(> td.uncovered-line.selected) { + background-color: #8884; +} +a { + color: inherit; +} +.control { + position: fixed; + top: 0em; + right: 0em; + padding: 1em; + background: #FFF8; +} +@media (prefers-color-scheme: dark) { + body { + background-color: #222; + color: whitesmoke; + } + tr:hover { + background-color: #111; + } + .covered-line { + color: #39f; + } + .uncovered-line { + color: #f55; + } + .tooltip { + background-color: #068; + } + .control { + background: #2228; + } + tr:has(> td >a:target), tr:has(> td.uncovered-line.selected) { + background-color: #8884; + } +} diff --git a/reports/coverage_eest_wip_annotated/report.txt b/reports/coverage_eest_wip_annotated/report.txt new file mode 100644 index 0000000000..0d66e94623 --- /dev/null +++ b/reports/coverage_eest_wip_annotated/report.txt @@ -0,0 +1,58 @@ +Filename Regions Missed Regions Cover Functions Missed Functions Executed Lines Missed Lines Cover Branches Missed Branches Cover MC/DC Conditions Missed Conditions Cover +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +include/evmmax/evmmax.hpp 50 0 100.00% 10 0 100.00% 94 0 100.00% 26 0 100.00% 2 2 0.00% +lib/evmone/baseline.hpp 16 0 100.00% 8 0 100.00% 27 0 100.00% 2 0 100.00% 0 0 - +lib/evmone/baseline_analysis.cpp 11 0 100.00% 3 0 100.00% 31 0 100.00% 6 0 100.00% 0 0 - +lib/evmone/baseline_execution.cpp 4214 1839 56.36% 11 1 90.91% 172 47 72.67% 929 613 34.02% 2 0 100.00% +lib/evmone/baseline_instruction_table.cpp 1 0 100.00% 1 0 100.00% 3 0 100.00% 0 0 - 0 0 - +lib/evmone/delegation.cpp 6 0 100.00% 1 0 100.00% 10 0 100.00% 2 0 100.00% 0 0 - +lib/evmone/delegation.hpp 1 0 100.00% 1 0 100.00% 3 0 100.00% 0 0 - 0 0 - +lib/evmone/execution_state.hpp 34 9 73.53% 14 2 85.71% 49 4 91.84% 12 3 75.00% 0 0 - +lib/evmone/instructions.hpp 331 1 99.70% 91 1 98.90% 589 1 99.83% 182 1 99.45% 20 3 85.00% +lib/evmone/instructions_calls.cpp 122 10 91.80% 3 0 100.00% 149 2 98.66% 85 4 95.29% 11 0 100.00% +lib/evmone/instructions_storage.cpp 25 0 100.00% 2 0 100.00% 34 0 100.00% 20 0 100.00% 6 0 100.00% +lib/evmone_precompiles/blake2b.cpp 9 0 100.00% 3 0 100.00% 48 0 100.00% 4 0 100.00% 0 0 - +lib/evmone_precompiles/bls.cpp 132 0 100.00% 15 0 100.00% 265 0 100.00% 74 0 100.00% 6 0 100.00% +lib/evmone_precompiles/bn254.cpp 4 0 100.00% 2 0 100.00% 10 0 100.00% 4 0 100.00% 2 0 100.00% +lib/evmone_precompiles/ecc.hpp 91 1 98.90% 33 0 100.00% 209 1 99.52% 35 2 94.29% 4 1 75.00% +lib/evmone_precompiles/keccak.c 30 1 96.67% 8 1 87.50% 252 3 98.81% 16 2 87.50% 2 2 0.00% +lib/evmone_precompiles/keccak.hpp 1 0 100.00% 1 0 100.00% 3 0 100.00% 0 0 - 0 0 - +lib/evmone_precompiles/kzg.cpp 32 0 100.00% 8 0 100.00% 68 0 100.00% 16 0 100.00% 0 0 - +lib/evmone_precompiles/modexp.cpp 58 0 100.00% 11 0 100.00% 105 0 100.00% 26 0 100.00% 0 0 - +lib/evmone_precompiles/pairing/bn254/fields.hpp 7 0 100.00% 7 0 100.00% 78 0 100.00% 0 0 - 0 0 - +lib/evmone_precompiles/pairing/bn254/pairing.cpp 46 0 100.00% 4 0 100.00% 106 0 100.00% 36 0 100.00% 13 0 100.00% +lib/evmone_precompiles/pairing/bn254/utils.hpp 34 0 100.00% 24 0 100.00% 312 0 100.00% 12 0 100.00% 4 0 100.00% +lib/evmone_precompiles/pairing/field_template.hpp 39 0 100.00% 24 0 100.00% 65 0 100.00% 10 0 100.00% 0 0 - +lib/evmone_precompiles/ripemd160.cpp 24 0 100.00% 12 0 100.00% 71 0 100.00% 10 0 100.00% 0 0 - +lib/evmone_precompiles/secp256k1.cpp 74 0 100.00% 5 0 100.00% 112 0 100.00% 48 0 100.00% 4 0 100.00% +lib/evmone_precompiles/secp256r1.cpp 26 0 100.00% 2 0 100.00% 31 0 100.00% 20 0 100.00% 6 0 100.00% +lib/evmone_precompiles/sha256.cpp 108 25 76.85% 10 3 70.00% 307 67 78.18% 40 20 50.00% 4 4 0.00% +test/blockchaintest/blockchaintest.cpp 48 13 72.92% 11 4 63.64% 90 29 67.78% 16 6 62.50% 3 2 33.33% +test/blockchaintest/blockchaintest_runner.cpp 652 153 76.53% 6 1 83.33% 305 41 86.56% 244 96 60.66% 16 9 43.75% +test/state/account.hpp 5 0 100.00% 1 0 100.00% 3 0 100.00% 6 0 100.00% 3 0 100.00% +test/state/block.cpp 26 0 100.00% 5 0 100.00% 76 0 100.00% 16 0 100.00% 2 0 100.00% +test/state/block.hpp 1 0 100.00% 1 0 100.00% 3 0 100.00% 0 0 - 0 0 - +test/state/bloom_filter.cpp 10 0 100.00% 4 0 100.00% 33 0 100.00% 8 0 100.00% 0 0 - +test/state/bloom_filter.hpp 1 0 100.00% 1 0 100.00% 1 0 100.00% 0 0 - 0 0 - +test/state/errors.hpp 28 6 78.57% 4 1 75.00% 112 7 93.75% 44 3 93.18% 0 0 - +test/state/ethash_difficulty.cpp 38 5 86.84% 4 0 100.00% 55 4 92.73% 30 5 83.33% 0 0 - +test/state/hash_utils.hpp 1 0 100.00% 1 0 100.00% 3 0 100.00% 0 0 - 0 0 - +test/state/host.cpp 217 0 100.00% 22 0 100.00% 329 0 100.00% 136 0 100.00% 34 0 100.00% +test/state/host.hpp 8 0 100.00% 2 0 100.00% 3 0 100.00% 0 0 - 0 0 - +test/state/precompiles.cpp 293 0 100.00% 49 0 100.00% 542 0 100.00% 144 0 100.00% 17 0 100.00% +test/state/precompiles_stubs.cpp 23 13 43.48% 3 1 66.67% 47 22 53.19% 14 11 21.43% 5 5 0.00% +test/state/requests.cpp 54 0 100.00% 4 0 100.00% 99 0 100.00% 38 0 100.00% 9 0 100.00% +test/state/requests.hpp 4 1 75.00% 4 1 75.00% 8 1 87.50% 0 0 - 0 0 - +test/state/state.cpp 274 3 98.91% 27 0 100.00% 440 4 99.09% 188 2 98.94% 22 0 100.00% +test/state/state.hpp 3 0 100.00% 2 0 100.00% 2 0 100.00% 0 0 - 0 0 - +test/state/state_view.hpp 2 0 100.00% 2 0 100.00% 2 0 100.00% 0 0 - 0 0 - +test/state/system_contracts.cpp 26 1 96.15% 6 1 83.33% 53 1 98.11% 14 0 100.00% 0 0 - +test/state/transaction.hpp 1 0 100.00% 1 0 100.00% 1 0 100.00% 0 0 - 0 0 - +test/statetest/statetest.cpp 50 19 62.00% 11 4 63.64% 106 28 73.58% 30 15 50.00% 9 8 11.11% +test/statetest/statetest_runner.cpp 156 42 73.08% 1 0 100.00% 46 13 71.74% 42 20 52.38% 0 0 - + +Files which contain no functions: +build/cov/test/evmone/version.h 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - +lib/evmone/instructions_xmacro.hpp 0 0 - 0 0 - 0 0 - 0 0 - 0 0 - +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +TOTAL 7447 2142 71.24% 486 21 95.68% 5562 275 95.06% 2585 803 68.94% 206 36 82.52%