/* XMRig * Copyright (c) 2018-2021 SChernykh * Copyright (c) 2016-2021 XMRig , * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef XMRIG_CN_ALGO_H #define XMRIG_CN_ALGO_H #include #include #include "base/crypto/Algorithm.h" namespace xmrig { template class CnAlgo { public: constexpr CnAlgo() {}; constexpr inline Algorithm::Id base() const { static_assert(Algorithm::isCN(ALGO), "invalid CRYPTONIGHT algorithm"); return Algorithm::base(ALGO); } constexpr inline bool isHeavy() const { return Algorithm::family(ALGO) == Algorithm::CN_HEAVY; } constexpr inline bool isR() const { return ALGO == Algorithm::CN_R; } constexpr inline size_t memory() const { static_assert(Algorithm::isCN(ALGO), "invalid CRYPTONIGHT algorithm"); return Algorithm::l3(ALGO); } constexpr inline uint32_t iterations() const { static_assert(Algorithm::isCN(ALGO), "invalid CRYPTONIGHT algorithm"); return CN_ITER; } constexpr inline uint32_t mask() const { return static_cast(((memory() - 1) / 16) * 16); } constexpr inline uint32_t half_mem() const { return mask() < memory() / 2; } inline static uint32_t iterations(Algorithm::Id algo) { switch (algo) { case Algorithm::CN_0: case Algorithm::CN_1: case Algorithm::CN_2: case Algorithm::CN_R: case Algorithm::CN_RTO: return CN_ITER; case Algorithm::CN_FAST: case Algorithm::CN_HALF: # ifdef XMRIG_ALGO_CN_LITE case Algorithm::CN_LITE_0: case Algorithm::CN_LITE_1: # endif # ifdef XMRIG_ALGO_CN_HEAVY case Algorithm::CN_HEAVY_0: case Algorithm::CN_HEAVY_TUBE: case Algorithm::CN_HEAVY_XHV: # endif case Algorithm::CN_CCX: return CN_ITER / 2; case Algorithm::CN_RWZ: case Algorithm::CN_ZLS: return 0x60000; case Algorithm::CN_XAO: case Algorithm::CN_DOUBLE: return CN_ITER * 2; # ifdef XMRIG_ALGO_CN_PICO case Algorithm::CN_PICO_0: case Algorithm::CN_PICO_TLO: return CN_ITER / 8; # endif # ifdef XMRIG_ALGO_CN_FEMTO case Algorithm::CN_UPX2: return CN_ITER / 32; # endif # ifdef XMRIG_ALGO_CN_GPU case Algorithm::CN_GPU: return 0xC000; # endif default: break; } return 0; } inline static uint32_t mask(Algorithm::Id algo) { # ifdef XMRIG_ALGO_CN_PICO if (algo == Algorithm::CN_PICO_0) { return 0x1FFF0; } # endif # ifdef XMRIG_ALGO_CN_FEMTO if (algo == Algorithm::CN_UPX2) { return 0x1FFF0; } # endif # ifdef XMRIG_ALGO_CN_GPU if (algo == Algorithm::CN_GPU) { return 0x1FFFC0; } # endif # ifdef XMRIG_ALGO_GHOSTRIDER if (algo == Algorithm::CN_GR_1) { return 0x3FFF0; } if (algo == Algorithm::CN_GR_5) { return 0x1FFF0; } # endif return ((Algorithm::l3(algo) - 1) / 16) * 16; } private: constexpr const static uint32_t CN_ITER = 0x80000; }; template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 2; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 2; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 2; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 2; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 2; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 2; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 2; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER * 2; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER * 2; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return 0x60000; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return 0x60000; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 8; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 8; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 2; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 32; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return 0xC000; } template<> constexpr inline uint32_t CnAlgo::mask() const { return 0x1FFF0; } template<> constexpr inline uint32_t CnAlgo::mask() const { return 0x1FFF0; } template<> constexpr inline uint32_t CnAlgo::mask() const { return 0x1FFFC0; } #ifdef XMRIG_ALGO_GHOSTRIDER template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 4; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 4; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 2; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 2; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 8; } template<> constexpr inline uint32_t CnAlgo::iterations() const { return CN_ITER / 8; } template<> constexpr inline uint32_t CnAlgo::mask() const { return 0x3FFF0; } template<> constexpr inline uint32_t CnAlgo::mask() const { return 0x1FFF0; } #endif } /* namespace xmrig */ #endif /* XMRIG_CN_ALGO_H */