Jelajahi Sumber

Merge pull request #48 from tevador/pr-ds4

Support Dataset size larger than 4 GiB
tevador 7 tahun lalu
induk
melakukan
25337d3241

+ 1 - 1
src/virtual_machine.cpp

@@ -88,7 +88,7 @@ void randomx_vm::initialize() {
 	config.readReg2 = 4 + (addressRegisters & 1);
 	addressRegisters >>= 1;
 	config.readReg3 = 6 + (addressRegisters & 1);
-	datasetOffset = (program.getEntropy(13) & randomx::DatasetExtraItems) * randomx::CacheLineSize;
+	datasetOffset = (program.getEntropy(13) % (randomx::DatasetExtraItems + 1)) * randomx::CacheLineSize;
 	store64(&config.eMask[0], randomx::getFloatMask(program.getEntropy(14)));
 	store64(&config.eMask[1], randomx::getFloatMask(program.getEntropy(15)));
 }

+ 1 - 1
src/virtual_machine.hpp

@@ -60,7 +60,7 @@ protected:
 		randomx_cache* cachePtr = nullptr;
 		randomx_dataset* datasetPtr;
 	};
-	uint32_t datasetOffset;
+	uint64_t datasetOffset;
 };
 
 namespace randomx {

+ 1 - 1
src/vm_interpreted.cpp

@@ -273,7 +273,7 @@ namespace randomx {
 	}
 
 	template<class Allocator, bool softAes>
-	void InterpretedVm<Allocator, softAes>::datasetRead(uint32_t address, int_reg_t(&r)[RegistersCount]) {
+	void InterpretedVm<Allocator, softAes>::datasetRead(uint64_t address, int_reg_t(&r)[RegistersCount]) {
 		uint64_t* datasetLine = (uint64_t*)(mem.memory + address);
 		for (int i = 0; i < RegistersCount; ++i)
 			r[i] ^= datasetLine[i];

+ 1 - 1
src/vm_interpreted.hpp

@@ -80,7 +80,7 @@ namespace randomx {
 		void run(void* seed) override;
 		void setDataset(randomx_dataset* dataset) override;
 	protected:
-		virtual void datasetRead(uint32_t blockNumber, int_reg_t(&r)[RegistersCount]);
+		virtual void datasetRead(uint64_t blockNumber, int_reg_t(&r)[RegistersCount]);
 	private:
 		void execute();
 		void precompileProgram(int_reg_t(&r)[RegistersCount], rx_vec_f128(&f)[RegisterCountFlt], rx_vec_f128(&e)[RegisterCountFlt], rx_vec_f128(&a)[RegisterCountFlt]);

+ 1 - 1
src/vm_interpreted_light.cpp

@@ -38,7 +38,7 @@ namespace randomx {
 	}
 
 	template<class Allocator, bool softAes>
-	void InterpretedLightVm<Allocator, softAes>::datasetRead(uint32_t address, int_reg_t(&r)[8]) {
+	void InterpretedLightVm<Allocator, softAes>::datasetRead(uint64_t address, int_reg_t(&r)[8]) {
 		uint32_t itemNumber = address / CacheLineSize;
 		int_reg_t rl[8];
 		

+ 1 - 1
src/vm_interpreted_light.hpp

@@ -50,7 +50,7 @@ namespace randomx {
 		void setDataset(randomx_dataset* dataset) override { }
 		void setCache(randomx_cache* cache) override;
 	protected:
-		void datasetRead(uint32_t address, int_reg_t(&r)[8]) override;
+		void datasetRead(uint64_t address, int_reg_t(&r)[8]) override;
 	};
 
 	using InterpretedLightVmDefault = InterpretedLightVm<AlignedAllocator<CacheLineSize>, true>;