diff --git a/src/CompiledLightVirtualMachine.cpp b/src/CompiledLightVirtualMachine.cpp index 9012047..ab3c8e3 100644 --- a/src/CompiledLightVirtualMachine.cpp +++ b/src/CompiledLightVirtualMachine.cpp @@ -25,17 +25,18 @@ namespace randomx { template void CompiledLightVm::setCache(randomx_cache* cache) { - this->mem.memory = cache->memory; - //datasetRange = (size - RANDOMX_DATASET_SIZE + CacheLineSize) / CacheLineSize; - this->compiler.generateSuperscalarHash(cache->programs, cache->reciprocalCache); + mem.memory = cache->memory; + compiler.generateSuperscalarHash(cache->programs, cache->reciprocalCache); //datasetBasePtr = ds.dataset.memory; } template - void CompiledLightVm::initialize() { + void CompiledLightVm::run(void* seed) { + VmBase::generateProgram(seed); randomx_vm::initialize(); - this->compiler.generateProgramLight(this->program, this->config); - //mem.ds.dataset.memory = datasetBasePtr + (datasetBase * CacheLineSize); + compiler.generateProgramLight(program, config); + //mem.memory = datasetBasePtr + (datasetBase * CacheLineSize); + CompiledVm::execute(); } template class CompiledLightVm, false>; diff --git a/src/CompiledLightVirtualMachine.hpp b/src/CompiledLightVirtualMachine.hpp index 20ebdbc..813ddbf 100644 --- a/src/CompiledLightVirtualMachine.hpp +++ b/src/CompiledLightVirtualMachine.hpp @@ -40,7 +40,12 @@ namespace randomx { } void setCache(randomx_cache* cache) override; void setDataset(randomx_dataset* dataset) override {} - void initialize() override; + void run(void* seed) override; + + using CompiledVm::mem; + using CompiledVm::compiler; + using CompiledVm::program; + using CompiledVm::config; }; using CompiledLightVmDefault = CompiledLightVm, true>; diff --git a/src/CompiledVirtualMachine.cpp b/src/CompiledVirtualMachine.cpp index c0305ff..639fc8c 100644 --- a/src/CompiledVirtualMachine.cpp +++ b/src/CompiledVirtualMachine.cpp @@ -19,32 +19,31 @@ along with RandomX. If not, see. #include "CompiledVirtualMachine.hpp" #include "common.hpp" -#include namespace randomx { static_assert(sizeof(MemoryRegisters) == 2 * sizeof(addr_t) + sizeof(uintptr_t), "Invalid alignment of struct randomx::MemoryRegisters"); static_assert(sizeof(RegisterFile) == 256, "Invalid alignment of struct randomx::RegisterFile"); - template void CompiledVm::setDataset(randomx_dataset* dataset) { - this->mem.memory = dataset->memory; - //datasetRange = (size - RANDOMX_DATASET_SIZE + CacheLineSize) / CacheLineSize; - //datasetBasePtr = ds.dataset.memory; + mem.memory = dataset->memory; + //datasetBasePtr = dataset.memory; } template - void CompiledVm::initialize() { + void CompiledVm::run(void* seed) { + VmBase::generateProgram(seed); randomx_vm::initialize(); - this->compiler.generateProgram(this->program, this->config); - //mem.ds.dataset.memory = datasetBasePtr + (datasetBase * CacheLineSize); + compiler.generateProgram(program, config); + //mem.memory = datasetBasePtr + (datasetBase * CacheLineSize); + execute(); } template void CompiledVm::execute() { //executeProgram(reg, mem, scratchpad, InstructionCount); - compiler.getProgramFunc()(this->reg, this->mem, this->scratchpad, RANDOMX_PROGRAM_ITERATIONS); + compiler.getProgramFunc()(reg, mem, scratchpad, RANDOMX_PROGRAM_ITERATIONS); } template class CompiledVm, false>; diff --git a/src/CompiledVirtualMachine.hpp b/src/CompiledVirtualMachine.hpp index 8f8b427..94fb856 100644 --- a/src/CompiledVirtualMachine.hpp +++ b/src/CompiledVirtualMachine.hpp @@ -42,9 +42,16 @@ namespace randomx { AlignedAllocator::freeMemory(ptr, sizeof(CompiledVm)); } void setDataset(randomx_dataset* dataset) override; - void execute() override; - void initialize() override; + void run(void* seed) override; + + using VmBase::mem; + using VmBase::program; + using VmBase::config; + using VmBase::reg; + using VmBase::scratchpad; protected: + void execute(); + JitCompilerX86 compiler; uint8_t* datasetBasePtr; }; diff --git a/src/InterpretedVirtualMachine.cpp b/src/InterpretedVirtualMachine.cpp index 259d2ef..5c40890 100644 --- a/src/InterpretedVirtualMachine.cpp +++ b/src/InterpretedVirtualMachine.cpp @@ -48,12 +48,14 @@ namespace randomx { } template - void InterpretedVm::initialize() { + void InterpretedVm::run(void* seed) { + VmBase::generateProgram(seed); randomx_vm::initialize(); for (unsigned i = 0; i < RANDOMX_PROGRAM_SIZE; ++i) { program(i).src %= RegistersCount; program(i).dst %= RegistersCount; } + execute(); } template diff --git a/src/InterpretedVirtualMachine.hpp b/src/InterpretedVirtualMachine.hpp index 62d2f25..bcf42ca 100644 --- a/src/InterpretedVirtualMachine.hpp +++ b/src/InterpretedVirtualMachine.hpp @@ -67,12 +67,12 @@ namespace randomx { void operator delete(void* ptr) { AlignedAllocator::freeMemory(ptr, sizeof(InterpretedVm)); } - void execute() override; + void run(void* seed) override; void setDataset(randomx_dataset* dataset) override; - void initialize() override; protected: virtual void datasetRead(uint32_t blockNumber, int_reg_t(&r)[8]); private: + void execute(); void precompileProgram(int_reg_t(&r)[8], __m128d (&f)[4], __m128d (&e)[4], __m128d (&a)[4]); void executeBytecode(int_reg_t(&r)[8], __m128d (&f)[4], __m128d (&e)[4], __m128d (&a)[4]); void executeBytecode(int& i, int_reg_t(&r)[8], __m128d (&f)[4], __m128d (&e)[4], __m128d (&a)[4]); diff --git a/src/VirtualMachine.cpp b/src/VirtualMachine.cpp index 05bf79b..9fd102e 100644 --- a/src/VirtualMachine.cpp +++ b/src/VirtualMachine.cpp @@ -104,17 +104,22 @@ namespace randomx { return scratchpad != nullptr; } - template - void VmBase::generate(void* seed, void* buffer, size_t bufferSize) { - fillAes1Rx4(seed, bufferSize, buffer); - } - template void VmBase::getFinalResult(void* out, size_t outSize) { hashAes1Rx4(scratchpad, ScratchpadSize, ®.a); blake2b(out, outSize, ®, sizeof(RegisterFile), nullptr, 0); } + template + void VmBase::initScratchpad(void* seed) { + fillAes1Rx4(seed, ScratchpadSize, scratchpad); + } + + template + void VmBase::generateProgram(void* seed) { + fillAes1Rx4(seed, sizeof(program), &program); + } + template class VmBase, false>; template class VmBase, true>; template class VmBase; diff --git a/src/VirtualMachine.hpp b/src/VirtualMachine.hpp index 15aa6b9..bf83a03 100644 --- a/src/VirtualMachine.hpp +++ b/src/VirtualMachine.hpp @@ -25,17 +25,22 @@ along with RandomX. If not, see. #include "Program.hpp" /* Global namespace for C binding */ -struct randomx_vm { +class randomx_vm { +public: virtual ~randomx_vm() = 0; virtual bool allocate() = 0; - virtual void generate(void* seed, void* buffer, size_t bufferSize) = 0; - void resetRoundingMode(); - virtual void initialize(); - virtual void execute() = 0; virtual void getFinalResult(void* out, size_t outSize) = 0; virtual void setDataset(randomx_dataset* dataset) { } virtual void setCache(randomx_cache* cache) { } + virtual void initScratchpad(void* seed) = 0; + virtual void run(void* seed) = 0; + void resetRoundingMode(); + randomx::RegisterFile *getRegisterFile() { + return ® + } +protected: + void initialize(); alignas(64) randomx::Program program; alignas(64) randomx::RegisterFile reg; alignas(16) randomx::ProgramConfiguration config; @@ -50,8 +55,10 @@ namespace randomx { public: ~VmBase() override; bool allocate() override; - void generate(void* seed, void* buffer, size_t bufferSize) override; + void initScratchpad(void* seed) override; void getFinalResult(void* out, size_t outSize) override; + protected: + void generateProgram(void* seed); }; } \ No newline at end of file diff --git a/src/randomx.cpp b/src/randomx.cpp index 87953cf..d45cfea 100644 --- a/src/randomx.cpp +++ b/src/randomx.cpp @@ -188,21 +188,14 @@ extern "C" { void randomx_calculate_hash(randomx_vm *machine, void *input, size_t inputSize, void *output) { alignas(16) uint64_t hash[8]; blake2b(hash, sizeof(hash), input, inputSize, nullptr, 0); - machine->generate(&hash, machine->scratchpad, randomx::ScratchpadSize); - //fillAes1Rx4((void*)hash, RANDOMX_SCRATCHPAD_L3, machine->scratchpad); + machine->initScratchpad(&hash); //dump((char*)scratchpad, RANDOMX_SCRATCHPAD_L3, "spad-before.txt"); machine->resetRoundingMode(); for (int chain = 0; chain < RANDOMX_PROGRAM_COUNT - 1; ++chain) { - machine->generate(&hash, &machine->program, sizeof(randomx::Program)); - //fillAes1Rx4((void*)hash, sizeof(RandomX::Program), vm->getProgramBuffer()); - machine->initialize(); - machine->execute(); - blake2b(hash, sizeof(hash), &machine->reg, sizeof(machine->reg), nullptr, 0); + machine->run(&hash); + blake2b(hash, sizeof(hash), machine->getRegisterFile(), sizeof(randomx::RegisterFile), nullptr, 0); } - machine->generate((void*)hash, &machine->program, sizeof(randomx::Program)); - //fillAes1Rx4((void*)hash, sizeof(RandomX::Program), vm->getProgramBuffer()); - machine->initialize(); - machine->execute(); + machine->run(&hash); machine->getFinalResult(output, 64); }