mirror of
				https://git.wownero.com/wownero/RandomWOW.git
				synced 2024-08-15 00:23:14 +00:00 
			
		
		
		
	
						commit
						277791085c
					
				
					 9 changed files with 2633 additions and 2 deletions
				
			
		|  | @ -173,6 +173,42 @@ if(ARM_ID STREQUAL "aarch64" OR ARM_ID STREQUAL "arm64" OR ARM_ID STREQUAL "armv | |||
|   endif() | ||||
| endif() | ||||
| 
 | ||||
| # RISC-V | ||||
| if(ARCH_ID STREQUAL "riscv64") | ||||
|   list(APPEND randomx_sources | ||||
|     src/jit_compiler_rv64_static.S | ||||
|     src/jit_compiler_rv64.cpp) | ||||
|   # cheat because cmake and ccache hate each other | ||||
|   set_property(SOURCE src/jit_compiler_rv64_static.S PROPERTY LANGUAGE C) | ||||
|   set_property(SOURCE src/jit_compiler_rv64_static.S PROPERTY XCODE_EXPLICIT_FILE_TYPE sourcecode.asm) | ||||
| 
 | ||||
|   # default build uses the RV64GC baseline | ||||
|   set(RVARCH "rv64gc") | ||||
| 
 | ||||
|   # for native builds, enable Zba and Zbb if supported by the CPU | ||||
|   if(ARCH STREQUAL "native") | ||||
|     enable_language(ASM) | ||||
|     try_run(RANDOMX_ZBA_RUN_FAIL | ||||
|         RANDOMX_ZBA_COMPILE_OK | ||||
|         ${CMAKE_CURRENT_BINARY_DIR}/ | ||||
|         ${CMAKE_CURRENT_SOURCE_DIR}/src/tests/riscv64_zba.s | ||||
|         COMPILE_DEFINITIONS "-march=rv64gc_zba") | ||||
|     if (RANDOMX_ZBA_COMPILE_OK AND NOT RANDOMX_ZBA_RUN_FAIL) | ||||
|       set(RVARCH "${RVARCH}_zba") | ||||
|     endif() | ||||
|     try_run(RANDOMX_ZBB_RUN_FAIL | ||||
|         RANDOMX_ZBB_COMPILE_OK | ||||
|         ${CMAKE_CURRENT_BINARY_DIR}/ | ||||
|         ${CMAKE_CURRENT_SOURCE_DIR}/src/tests/riscv64_zbb.s | ||||
|         COMPILE_DEFINITIONS "-march=rv64gc_zbb") | ||||
|     if (RANDOMX_ZBB_COMPILE_OK AND NOT RANDOMX_ZBB_RUN_FAIL) | ||||
|       set(RVARCH "${RVARCH}_zbb") | ||||
|     endif() | ||||
|   endif() | ||||
| 
 | ||||
|   add_flag("-march=${RVARCH}") | ||||
| endif() | ||||
| 
 | ||||
| set(RANDOMX_INCLUDE "${CMAKE_CURRENT_SOURCE_DIR}/src" CACHE STRING "RandomX Include path") | ||||
| 
 | ||||
| add_library(randomx ${randomx_sources}) | ||||
|  |  | |||
|  | @ -116,12 +116,19 @@ namespace randomx { | |||
| 
 | ||||
| #if defined(_M_X64) || defined(__x86_64__) | ||||
| 	#define RANDOMX_HAVE_COMPILER 1 | ||||
| 	#define RANDOMX_COMPILER_X86 | ||||
| 	class JitCompilerX86; | ||||
| 	using JitCompiler = JitCompilerX86; | ||||
| #elif defined(__aarch64__) | ||||
| 	#define RANDOMX_HAVE_COMPILER 1 | ||||
| 	#define RANDOMX_COMPILER_A64 | ||||
| 	class JitCompilerA64; | ||||
| 	using JitCompiler = JitCompilerA64; | ||||
| #elif defined(__riscv) && __riscv_xlen == 64 | ||||
| 	#define RANDOMX_HAVE_COMPILER 1 | ||||
| 	#define RANDOMX_COMPILER_RV64 | ||||
| 	class JitCompilerRV64; | ||||
| 	using JitCompiler = JitCompilerRV64; | ||||
| #else | ||||
| 	#define RANDOMX_HAVE_COMPILER 0 | ||||
| 	class JitCompilerFallback; | ||||
|  |  | |||
|  | @ -28,10 +28,48 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #if defined(_M_X64) || defined(__x86_64__) | ||||
| #include "common.hpp" | ||||
| 
 | ||||
| namespace randomx { | ||||
| 
 | ||||
| 	struct CodeBuffer { | ||||
| 		uint8_t* code; | ||||
| 		int32_t codePos; | ||||
| 		int32_t rcpCount; | ||||
| 
 | ||||
| 		void emit(const uint8_t* src, int32_t len) { | ||||
| 			memcpy(&code[codePos], src, len); | ||||
| 			codePos += len; | ||||
| 		} | ||||
| 
 | ||||
| 		template<typename T> | ||||
| 		void emit(T src) { | ||||
| 			memcpy(&code[codePos], &src, sizeof(src)); | ||||
| 			codePos += sizeof(src); | ||||
| 		} | ||||
| 
 | ||||
| 		void emitAt(int32_t codePos, const uint8_t* src, int32_t len) { | ||||
| 			memcpy(&code[codePos], src, len); | ||||
| 		} | ||||
| 
 | ||||
| 		template<typename T> | ||||
| 		void emitAt(int32_t codePos, T src) { | ||||
| 			memcpy(&code[codePos], &src, sizeof(src)); | ||||
| 		} | ||||
| 	}; | ||||
| 
 | ||||
| 	struct CompilerState : public CodeBuffer { | ||||
| 		int32_t instructionOffsets[RANDOMX_PROGRAM_SIZE]; | ||||
| 		int registerUsage[RegistersCount]; | ||||
| 	}; | ||||
| } | ||||
| 
 | ||||
| #if defined(RANDOMX_COMPILER_X86) | ||||
| #include "jit_compiler_x86.hpp" | ||||
| #elif defined(__aarch64__) | ||||
| #elif defined(RANDOMX_COMPILER_A64) | ||||
| #include "jit_compiler_a64.hpp" | ||||
| #elif defined(RANDOMX_COMPILER_RV64) | ||||
| #include "jit_compiler_rv64.hpp" | ||||
| #else | ||||
| #include "jit_compiler_fallback.hpp" | ||||
| #endif | ||||
|  |  | |||
							
								
								
									
										1175
									
								
								src/jit_compiler_rv64.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1175
									
								
								src/jit_compiler_rv64.cpp
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										69
									
								
								src/jit_compiler_rv64.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								src/jit_compiler_rv64.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,69 @@ | |||
| /*
 | ||||
| Copyright (c) 2023 tevador <tevador@gmail.com> | ||||
| 
 | ||||
| All rights reserved. | ||||
| 
 | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are met: | ||||
| 	* Redistributions of source code must retain the above copyright | ||||
| 	  notice, this list of conditions and the following disclaimer. | ||||
| 	* Redistributions in binary form must reproduce the above copyright | ||||
| 	  notice, this list of conditions and the following disclaimer in the | ||||
| 	  documentation and/or other materials provided with the distribution. | ||||
| 	* Neither the name of the copyright holder nor the | ||||
| 	  names of its contributors may be used to endorse or promote products | ||||
| 	  derived from this software without specific prior written permission. | ||||
| 
 | ||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||||
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||||
| FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
| DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||
| SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||
| CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||||
| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <cstdint> | ||||
| #include <cstring> | ||||
| #include <vector> | ||||
| #include "jit_compiler.hpp" | ||||
| 
 | ||||
| namespace randomx { | ||||
| 
 | ||||
| 	class Program; | ||||
| 	struct ProgramConfiguration; | ||||
| 	class SuperscalarProgram; | ||||
| 	class Instruction; | ||||
| 
 | ||||
| 	class JitCompilerRV64 { | ||||
| 	public: | ||||
| 		JitCompilerRV64(); | ||||
| 		~JitCompilerRV64(); | ||||
| 		void generateProgram(Program&, ProgramConfiguration&); | ||||
| 		void generateProgramLight(Program&, ProgramConfiguration&, uint32_t); | ||||
| 		void generateSuperscalarHash(SuperscalarProgram programs[RANDOMX_CACHE_ACCESSES], std::vector<uint64_t>&); | ||||
| 		void generateDatasetInitCode() {} | ||||
| 		ProgramFunc* getProgramFunc() { | ||||
| 			return (ProgramFunc*)entryProgram; | ||||
| 		} | ||||
| 		DatasetInitFunc* getDatasetInitFunc() { | ||||
| 			return (DatasetInitFunc*)entryDataInit; | ||||
| 		} | ||||
| 		uint8_t* getCode() { | ||||
| 			return state.code; | ||||
| 		} | ||||
| 		size_t getCodeSize(); | ||||
| 		void enableWriting(); | ||||
| 		void enableExecution(); | ||||
| 		void enableAll(); | ||||
| 	private: | ||||
| 		CompilerState state; | ||||
| 		void* entryDataInit; | ||||
| 		void* entryProgram; | ||||
| 	}; | ||||
| } | ||||
							
								
								
									
										1235
									
								
								src/jit_compiler_rv64_static.S
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1235
									
								
								src/jit_compiler_rv64_static.S
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							
							
								
								
									
										53
									
								
								src/jit_compiler_rv64_static.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								src/jit_compiler_rv64_static.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,53 @@ | |||
| /*
 | ||||
| Copyright (c) 2023 tevador <tevador@gmail.com> | ||||
| 
 | ||||
| All rights reserved. | ||||
| 
 | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are met: | ||||
| 	* Redistributions of source code must retain the above copyright | ||||
| 	  notice, this list of conditions and the following disclaimer. | ||||
| 	* Redistributions in binary form must reproduce the above copyright | ||||
| 	  notice, this list of conditions and the following disclaimer in the | ||||
| 	  documentation and/or other materials provided with the distribution. | ||||
| 	* Neither the name of the copyright holder nor the | ||||
| 	  names of its contributors may be used to endorse or promote products | ||||
| 	  derived from this software without specific prior written permission. | ||||
| 
 | ||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | ||||
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||||
| FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
| DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||
| SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||
| CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||||
| OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| */ | ||||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| extern "C" { | ||||
| 	void randomx_riscv64_literals(); | ||||
| 	void randomx_riscv64_literals_end(); | ||||
| 	void randomx_riscv64_data_init(); | ||||
| 	void randomx_riscv64_fix_data_call(); | ||||
| 	void randomx_riscv64_prologue(); | ||||
| 	void randomx_riscv64_loop_begin(); | ||||
| 	void randomx_riscv64_data_read(); | ||||
| 	void randomx_riscv64_data_read_light(); | ||||
| 	void randomx_riscv64_fix_loop_call(); | ||||
| 	void randomx_riscv64_spad_store(); | ||||
| 	void randomx_riscv64_spad_store_hardaes(); | ||||
| 	void randomx_riscv64_spad_store_softaes(); | ||||
| 	void randomx_riscv64_loop_end(); | ||||
| 	void randomx_riscv64_fix_continue_loop(); | ||||
| 	void randomx_riscv64_epilogue(); | ||||
| 	void randomx_riscv64_softaes(); | ||||
| 	void randomx_riscv64_program_end(); | ||||
| 	void randomx_riscv64_ssh_init(); | ||||
| 	void randomx_riscv64_ssh_load(); | ||||
| 	void randomx_riscv64_ssh_prefetch(); | ||||
| 	void randomx_riscv64_ssh_end(); | ||||
| } | ||||
							
								
								
									
										9
									
								
								src/tests/riscv64_zba.s
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/tests/riscv64_zba.s
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| /* RISC-V - test if the Zba extension is present */ | ||||
| 
 | ||||
| .text | ||||
| .global main
 | ||||
| 
 | ||||
| main: | ||||
|     sh1add x6, x6, x7 | ||||
|     li x10, 0 | ||||
|     ret | ||||
							
								
								
									
										9
									
								
								src/tests/riscv64_zbb.s
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/tests/riscv64_zbb.s
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,9 @@ | |||
| /* RISC-V - test if the Zbb extension is present */ | ||||
| 
 | ||||
| .text | ||||
| .global main
 | ||||
| 
 | ||||
| main: | ||||
|     ror x6, x6, x7 | ||||
|     li x10, 0 | ||||
|     ret | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue