|
|
@@ -76,6 +76,24 @@ namespace randomx {
|
|
|
|
|
|
*/
|
|
|
|
|
|
+ //Calculate the required code buffer size that is sufficient for the largest possible program:
|
|
|
+
|
|
|
+ constexpr size_t MaxRandomXInstrCodeSize = 32; //FDIV_M requires up to 32 bytes of x86 code
|
|
|
+ constexpr size_t MaxSuperscalarInstrSize = 14; //IMUL_RCP requires 14 bytes of x86 code
|
|
|
+ constexpr size_t SuperscalarProgramHeader = 128; //overhead per superscalar program
|
|
|
+ constexpr size_t CodeAlign = 4096; //align code size to a multiple of 4 KiB
|
|
|
+ constexpr size_t ReserveCodeSize = CodeAlign; //function prologue/epilogue + reserve
|
|
|
+
|
|
|
+ constexpr size_t RandomXCodeSize = alignSize(ReserveCodeSize + MaxRandomXInstrCodeSize * RANDOMX_PROGRAM_SIZE, CodeAlign);
|
|
|
+ constexpr size_t SuperscalarSize = alignSize(ReserveCodeSize + (SuperscalarProgramHeader + MaxSuperscalarInstrSize * SuperscalarMaxSize) * RANDOMX_CACHE_ACCESSES, CodeAlign);
|
|
|
+
|
|
|
+ static_assert(RandomXCodeSize < INT32_MAX / 2, "RandomXCodeSize is too large");
|
|
|
+ static_assert(SuperscalarSize < INT32_MAX / 2, "SuperscalarSize is too large");
|
|
|
+
|
|
|
+ constexpr uint32_t CodeSize = RandomXCodeSize + SuperscalarSize;
|
|
|
+
|
|
|
+ constexpr int32_t superScalarHashOffset = RandomXCodeSize;
|
|
|
+
|
|
|
const uint8_t* codePrologue = (uint8_t*)&randomx_program_prologue;
|
|
|
const uint8_t* codeLoopBegin = (uint8_t*)&randomx_program_loop_begin;
|
|
|
const uint8_t* codeLoopLoad = (uint8_t*)&randomx_program_loop_load;
|
|
|
@@ -106,7 +124,6 @@ namespace randomx {
|
|
|
const int32_t codeSshInitSize = codeProgramEnd - codeShhInit;
|
|
|
|
|
|
const int32_t epilogueOffset = CodeSize - epilogueSize;
|
|
|
- constexpr int32_t superScalarHashOffset = 32768;
|
|
|
|
|
|
static const uint8_t REX_ADD_RR[] = { 0x4d, 0x03 };
|
|
|
static const uint8_t REX_ADD_RM[] = { 0x4c, 0x03 };
|
|
|
@@ -181,7 +198,7 @@ namespace randomx {
|
|
|
static const uint8_t REX_TEST[] = { 0x49, 0xF7 };
|
|
|
static const uint8_t JZ[] = { 0x0f, 0x84 };
|
|
|
static const uint8_t RET = 0xc3;
|
|
|
- static const uint8_t LEA_32[] = { 0x67, 0x41, 0x8d };
|
|
|
+ static const uint8_t LEA_32[] = { 0x41, 0x8d };
|
|
|
static const uint8_t MOVNTI[] = { 0x4c, 0x0f, 0xc3 };
|
|
|
static const uint8_t ADD_EBX_I[] = { 0x81, 0xc3 };
|
|
|
|
|
|
@@ -197,7 +214,7 @@ namespace randomx {
|
|
|
static const uint8_t* NOPX[] = { NOP1, NOP2, NOP3, NOP4, NOP5, NOP6, NOP7, NOP8 };
|
|
|
|
|
|
size_t JitCompilerX86::getCodeSize() {
|
|
|
- return codePos < prologueSize ? 0 : codePos - prologueSize;
|
|
|
+ return CodeSize;
|
|
|
}
|
|
|
|
|
|
JitCompilerX86::JitCompilerX86() {
|