Monero
Loading...
Searching...
No Matches
common.hpp
Go to the documentation of this file.
1/*
2Copyright (c) 2018-2019, tevador <tevador@gmail.com>
3
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8 * Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
13 * Neither the name of the copyright holder nor the
14 names of its contributors may be used to endorse or promote products
15 derived from this software without specific prior written permission.
16
17THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
21FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*/
28
29#pragma once
30
31#include <cstdint>
32#include <iostream>
33#include <climits>
34#include "blake2/endian.h"
35#include "configuration.h"
36#include "randomx.h"
37
38namespace randomx {
39
40 static_assert(RANDOMX_ARGON_MEMORY >= 8, "RANDOMX_ARGON_MEMORY must be at least 8.");
41 static_assert(RANDOMX_ARGON_MEMORY <= 2097152, "RANDOMX_ARGON_MEMORY must not exceed 2097152.");
42 static_assert((RANDOMX_ARGON_MEMORY & (RANDOMX_ARGON_MEMORY - 1)) == 0, "RANDOMX_ARGON_MEMORY must be a power of 2.");
43 static_assert(RANDOMX_ARGON_ITERATIONS > 0 && RANDOMX_ARGON_ITERATIONS < UINT32_MAX, "RANDOMX_ARGON_ITERATIONS must be a positive 32-bit integer.");
44 static_assert(RANDOMX_ARGON_LANES > 0 && RANDOMX_ARGON_LANES <= 16777215, "RANDOMX_ARGON_LANES out of range");
45 static_assert(RANDOMX_DATASET_BASE_SIZE >= 64, "RANDOMX_DATASET_BASE_SIZE must be at least 64.");
46 static_assert((RANDOMX_DATASET_BASE_SIZE & (RANDOMX_DATASET_BASE_SIZE - 1)) == 0, "RANDOMX_DATASET_BASE_SIZE must be a power of 2.");
47 static_assert(RANDOMX_DATASET_BASE_SIZE <= 4294967296ULL, "RANDOMX_DATASET_BASE_SIZE must not exceed 4294967296.");
48 static_assert(RANDOMX_DATASET_EXTRA_SIZE % 64 == 0, "RANDOMX_DATASET_EXTRA_SIZE must be divisible by 64.");
49 static_assert((uint64_t)RANDOMX_DATASET_BASE_SIZE + RANDOMX_DATASET_EXTRA_SIZE <= 17179869184, "Dataset size must not exceed 16 GiB.");
50 static_assert(RANDOMX_PROGRAM_SIZE > 0, "RANDOMX_PROGRAM_SIZE must be greater than 0");
51 static_assert(RANDOMX_PROGRAM_SIZE <= 32768, "RANDOMX_PROGRAM_SIZE must not exceed 32768");
52 static_assert(RANDOMX_PROGRAM_ITERATIONS > 0, "RANDOMX_PROGRAM_ITERATIONS must be greater than 0");
53 static_assert(RANDOMX_PROGRAM_COUNT > 0, "RANDOMX_PROGRAM_COUNT must be greater than 0");
54 static_assert((RANDOMX_SCRATCHPAD_L3 & (RANDOMX_SCRATCHPAD_L3 - 1)) == 0, "RANDOMX_SCRATCHPAD_L3 must be a power of 2.");
55 static_assert(RANDOMX_SCRATCHPAD_L3 >= RANDOMX_SCRATCHPAD_L2, "RANDOMX_SCRATCHPAD_L3 must be greater than or equal to RANDOMX_SCRATCHPAD_L2.");
56 static_assert((RANDOMX_SCRATCHPAD_L2 & (RANDOMX_SCRATCHPAD_L2 - 1)) == 0, "RANDOMX_SCRATCHPAD_L2 must be a power of 2.");
57 static_assert(RANDOMX_SCRATCHPAD_L2 >= RANDOMX_SCRATCHPAD_L1, "RANDOMX_SCRATCHPAD_L2 must be greater than or equal to RANDOMX_SCRATCHPAD_L1.");
58 static_assert(RANDOMX_SCRATCHPAD_L1 >= 64, "RANDOMX_SCRATCHPAD_L1 must be at least 64.");
59 static_assert((RANDOMX_SCRATCHPAD_L1 & (RANDOMX_SCRATCHPAD_L1 - 1)) == 0, "RANDOMX_SCRATCHPAD_L1 must be a power of 2.");
60 static_assert(RANDOMX_CACHE_ACCESSES > 1, "RANDOMX_CACHE_ACCESSES must be greater than 1");
61 static_assert(RANDOMX_SUPERSCALAR_LATENCY > 0, "RANDOMX_SUPERSCALAR_LATENCY must be greater than 0");
62 static_assert(RANDOMX_SUPERSCALAR_LATENCY <= 10000, "RANDOMX_SUPERSCALAR_LATENCY must not exceed 10000");
63 static_assert(RANDOMX_JUMP_BITS > 0, "RANDOMX_JUMP_BITS must be greater than 0.");
64 static_assert(RANDOMX_JUMP_OFFSET >= 0, "RANDOMX_JUMP_OFFSET must be greater than or equal to 0.");
65 static_assert(RANDOMX_JUMP_BITS + RANDOMX_JUMP_OFFSET <= 16, "RANDOMX_JUMP_BITS + RANDOMX_JUMP_OFFSET must not exceed 16.");
66
74
75 static_assert(wtSum == 256, "Sum of instruction frequencies must be 256.");
76
77
78 constexpr uint32_t ArgonBlockSize = 1024;
79 constexpr int ArgonSaltSize = sizeof("" RANDOMX_ARGON_SALT) - 1;
80 static_assert(ArgonSaltSize >= 8, "RANDOMX_ARGON_SALT must be at least 8 characters long");
88 constexpr uint32_t ConditionMask = ((1 << RANDOMX_JUMP_BITS) - 1);
90 constexpr int StoreL3Condition = 14;
91
92 //Prevent some unsafe configurations.
93#ifndef RANDOMX_UNSAFE
94 static_assert((uint64_t)ArgonBlockSize * RANDOMX_CACHE_ACCESSES * RANDOMX_ARGON_MEMORY + 33554432 >= (uint64_t)RANDOMX_DATASET_BASE_SIZE + RANDOMX_DATASET_EXTRA_SIZE, "Unsafe configuration: Memory-time tradeoffs");
95 static_assert((128 + RANDOMX_PROGRAM_SIZE * RANDOMX_FREQ_ISTORE / 256) * (RANDOMX_PROGRAM_COUNT * RANDOMX_PROGRAM_ITERATIONS) >= RANDOMX_SCRATCHPAD_L3, "Unsafe configuration: Insufficient Scratchpad writes");
96 static_assert(RANDOMX_PROGRAM_COUNT > 1, "Unsafe configuration: Program filtering strategies");
97 static_assert(RANDOMX_PROGRAM_SIZE >= 64, "Unsafe configuration: Low program entropy");
98 static_assert(RANDOMX_PROGRAM_ITERATIONS >= 400, "Unsafe configuration: High compilation overhead");
99#endif
100
101#ifdef TRACE
102 constexpr bool trace = true;
103#else
104 constexpr bool trace = false;
105#endif
106
107#ifndef UNREACHABLE
108#ifdef __GNUC__
109#define UNREACHABLE __builtin_unreachable()
110#elif _MSC_VER
111#define UNREACHABLE __assume(false)
112#else
113#define UNREACHABLE
114#endif
115#endif
116
117#if defined(_M_X64) || defined(__x86_64__)
118 #define RANDOMX_HAVE_COMPILER 1
119 class JitCompilerX86;
120 using JitCompiler = JitCompilerX86;
121#elif defined(__aarch64__)
122 #define RANDOMX_HAVE_COMPILER 1
123 class JitCompilerA64;
124 using JitCompiler = JitCompilerA64;
125#else
126 #define RANDOMX_HAVE_COMPILER 0
127 class JitCompilerFallback;
129#endif
130
132
134
135 struct fpu_reg_t {
136 double lo;
137 double hi;
138 };
139
143 constexpr int ScratchpadL1Mask = (ScratchpadL1 - 1) * 8;
144 constexpr int ScratchpadL2Mask = (ScratchpadL2 - 1) * 8;
145 constexpr int ScratchpadL1Mask16 = (ScratchpadL1 / 2 - 1) * 16;
146 constexpr int ScratchpadL2Mask16 = (ScratchpadL2 / 2 - 1) * 16;
147 constexpr int ScratchpadL3Mask = (ScratchpadL3 - 1) * 8;
148 constexpr int ScratchpadL3Mask64 = (ScratchpadL3 / 8 - 1) * 64;
149 constexpr int RegistersCount = 8;
150 constexpr int RegisterCountFlt = RegistersCount / 2;
151 constexpr int RegisterNeedsDisplacement = 5; //x86 r13 register
152 constexpr int RegisterNeedsSib = 4; //x86 r12 register
153
154 inline bool isZeroOrPowerOf2(uint64_t x) {
155 return (x & (x - 1)) == 0;
156 }
157
158 constexpr int mantissaSize = 52;
159 constexpr int exponentSize = 11;
160 constexpr uint64_t mantissaMask = (1ULL << mantissaSize) - 1;
161 constexpr uint64_t exponentMask = (1ULL << exponentSize) - 1;
162 constexpr int exponentBias = 1023;
163 constexpr int dynamicExponentBits = 4;
164 constexpr int staticExponentBits = 4;
165 constexpr uint64_t constExponentBits = 0x300;
167
170 uint8_t* memory = nullptr;
171 };
172
173 //register file in little-endian byte order
179 };
180
181 typedef void(ProgramFunc)(RegisterFile&, MemoryRegisters&, uint8_t* /* scratchpad */, uint64_t);
182 typedef void(DatasetInitFunc)(randomx_cache* cache, uint8_t* dataset, uint32_t startBlock, uint32_t endBlock);
183
186 typedef void(CacheInitializeFunc)(randomx_cache*, const void*, size_t);
187}
Definition: jit_compiler_fallback.hpp:42
#define RANDOMX_SCRATCHPAD_L2
Definition: configuration.h:68
#define RANDOMX_SUPERSCALAR_LATENCY
Definition: configuration.h:47
#define RANDOMX_ARGON_MEMORY
Definition: configuration.h:32
#define RANDOMX_SCRATCHPAD_L1
Definition: configuration.h:71
#define RANDOMX_FREQ_IADD_M
Definition: configuration.h:86
#define RANDOMX_JUMP_OFFSET
Definition: configuration.h:77
#define RANDOMX_CACHE_ACCESSES
Definition: configuration.h:44
#define RANDOMX_FREQ_IROL_R
Definition: configuration.h:100
#define RANDOMX_FREQ_FMUL_R
Definition: configuration.h:110
#define RANDOMX_FREQ_IMUL_M
Definition: configuration.h:90
#define RANDOMX_FREQ_IXOR_M
Definition: configuration.h:98
#define RANDOMX_FREQ_IMULH_M
Definition: configuration.h:92
#define RANDOMX_FREQ_IROR_R
Definition: configuration.h:99
#define RANDOMX_ARGON_LANES
Definition: configuration.h:38
#define RANDOMX_FREQ_CBRANCH
Definition: configuration.h:115
#define RANDOMX_FREQ_IMUL_R
Definition: configuration.h:89
#define RANDOMX_FREQ_ISTORE
Definition: configuration.h:119
#define RANDOMX_FREQ_FSUB_R
Definition: configuration.h:107
#define RANDOMX_FREQ_FSQRT_R
Definition: configuration.h:112
#define RANDOMX_FREQ_ISWAP_R
Definition: configuration.h:101
#define RANDOMX_SCRATCHPAD_L3
Definition: configuration.h:65
#define RANDOMX_FREQ_ISUB_M
Definition: configuration.h:88
#define RANDOMX_FREQ_FADD_M
Definition: configuration.h:106
#define RANDOMX_FREQ_ISMULH_R
Definition: configuration.h:93
#define RANDOMX_FREQ_FSWAP_R
Definition: configuration.h:104
#define RANDOMX_ARGON_SALT
Definition: configuration.h:41
#define RANDOMX_FREQ_IADD_RS
Definition: configuration.h:85
#define RANDOMX_FREQ_CFROUND
Definition: configuration.h:116
#define RANDOMX_PROGRAM_COUNT
Definition: configuration.h:62
#define RANDOMX_FREQ_FSUB_M
Definition: configuration.h:108
#define RANDOMX_ARGON_ITERATIONS
Definition: configuration.h:35
#define RANDOMX_FREQ_ISMULH_M
Definition: configuration.h:94
#define RANDOMX_FREQ_INEG_R
Definition: configuration.h:96
#define RANDOMX_FREQ_ISUB_R
Definition: configuration.h:87
#define RANDOMX_PROGRAM_SIZE
Definition: configuration.h:56
#define RANDOMX_JUMP_BITS
Definition: configuration.h:74
#define RANDOMX_DATASET_EXTRA_SIZE
Definition: configuration.h:53
#define RANDOMX_FREQ_FSCAL_R
Definition: configuration.h:109
#define RANDOMX_PROGRAM_ITERATIONS
Definition: configuration.h:59
#define RANDOMX_FREQ_FADD_R
Definition: configuration.h:105
#define RANDOMX_FREQ_IMUL_RCP
Definition: configuration.h:95
#define RANDOMX_FREQ_FDIV_M
Definition: configuration.h:111
#define RANDOMX_FREQ_NOP
Definition: configuration.h:122
#define RANDOMX_FREQ_IMULH_R
Definition: configuration.h:91
#define RANDOMX_DATASET_BASE_SIZE
Definition: configuration.h:50
#define RANDOMX_FREQ_IXOR_R
Definition: configuration.h:97
Definition: allocator.cpp:35
constexpr int ConditionOffset
Definition: common.hpp:89
void() DatasetInitFunc(randomx_cache *cache, uint8_t *dataset, uint32_t startBlock, uint32_t endBlock)
Definition: common.hpp:182
constexpr uint32_t ArgonBlockSize
Definition: common.hpp:78
constexpr uint32_t DatasetExtraItems
Definition: common.hpp:87
constexpr int StoreL3Condition
Definition: common.hpp:90
uint64_t int_reg_t
Definition: common.hpp:133
constexpr int ScratchpadL1Mask
Definition: common.hpp:143
JitCompilerFallback JitCompiler
Definition: common.hpp:128
constexpr uint64_t constExponentBits
Definition: common.hpp:165
constexpr uint32_t CacheLineAlignMask
Definition: common.hpp:84
constexpr int RegisterCountFlt
Definition: common.hpp:150
constexpr int RegisterNeedsSib
Definition: common.hpp:152
constexpr int ScratchpadL1Mask16
Definition: common.hpp:145
constexpr int RegistersCount
Definition: common.hpp:149
constexpr size_t CacheLineSize
Definition: common.hpp:82
constexpr int exponentBias
Definition: common.hpp:162
constexpr uint64_t dynamicMantissaMask
Definition: common.hpp:166
void() CacheDeallocFunc(randomx_cache *)
Definition: common.hpp:185
constexpr int SuperscalarMaxSize
Definition: common.hpp:81
uint32_t addr_t
Definition: common.hpp:131
constexpr uint64_t exponentMask
Definition: common.hpp:161
constexpr uint32_t ScratchpadL2
Definition: common.hpp:141
constexpr int wtSum
Definition: common.hpp:67
constexpr int ScratchpadL3Mask64
Definition: common.hpp:148
constexpr uint64_t DatasetSize
Definition: common.hpp:86
constexpr uint32_t CacheSize
Definition: common.hpp:85
void() ProgramFunc(RegisterFile &, MemoryRegisters &, uint8_t *, uint64_t)
Definition: common.hpp:181
constexpr int ScratchpadL2Mask
Definition: common.hpp:144
constexpr int RegisterNeedsDisplacement
Definition: common.hpp:151
constexpr int exponentSize
Definition: common.hpp:159
constexpr int ScratchpadL3Mask
Definition: common.hpp:147
constexpr uint32_t ConditionMask
Definition: common.hpp:88
constexpr int ArgonSaltSize
Definition: common.hpp:79
constexpr uint32_t ScratchpadL1
Definition: common.hpp:140
constexpr int dynamicExponentBits
Definition: common.hpp:163
constexpr uint64_t mantissaMask
Definition: common.hpp:160
bool isZeroOrPowerOf2(uint64_t x)
Definition: common.hpp:154
void() DatasetDeallocFunc(randomx_dataset *)
Definition: common.hpp:184
constexpr int staticExponentBits
Definition: common.hpp:164
constexpr bool trace
Definition: common.hpp:104
constexpr uint32_t ScratchpadL3
Definition: common.hpp:142
constexpr int ScratchpadL2Mask16
Definition: common.hpp:146
void() CacheInitializeFunc(randomx_cache *, const void *, size_t)
Definition: common.hpp:186
constexpr int ScratchpadSize
Definition: common.hpp:83
constexpr int mantissaSize
Definition: common.hpp:158
#define RANDOMX_DATASET_ITEM_SIZE
Definition: randomx.h:36
unsigned int uint32_t
Definition: stdint.h:126
#define UINT32_MAX
Definition: stdint.h:188
unsigned char uint8_t
Definition: stdint.h:124
unsigned __int64 uint64_t
Definition: stdint.h:136
Definition: common.hpp:168
uint8_t * memory
Definition: common.hpp:170
addr_t mx
Definition: common.hpp:169
addr_t ma
Definition: common.hpp:169
Definition: common.hpp:174
fpu_reg_t a[RegisterCountFlt]
Definition: common.hpp:178
fpu_reg_t f[RegisterCountFlt]
Definition: common.hpp:176
fpu_reg_t e[RegisterCountFlt]
Definition: common.hpp:177
int_reg_t r[RegistersCount]
Definition: common.hpp:175
Definition: common.hpp:135
double lo
Definition: common.hpp:136
double hi
Definition: common.hpp:137
Definition: dataset.hpp:46
Definition: dataset.hpp:40
randomx_cache * cache
Definition: tests.cpp:19