diff --git a/src/instructionsX64.asm b/src/instructionsX64.asm deleted file mode 100644 index b5a5193..0000000 --- a/src/instructionsX64.asm +++ /dev/null @@ -1,302 +0,0 @@ -; Copyright (c) 2018 tevador -; -; This file is part of RandomX. -; -; RandomX is free software: you can redistribute it and/or modify -; it under the terms of the GNU General Public License as published by -; the Free Software Foundation, either version 3 of the License, or -; (at your option) any later version. -; -; RandomX is distributed in the hope that it will be useful, -; but WITHOUT ANY WARRANTY; without even the implied warranty of -; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -; GNU General Public License for more details. -; -; You should have received a copy of the GNU General Public License -; along with RandomX. If not, see. - -PUBLIC ADD_64 -PUBLIC ADD_32 -PUBLIC SUB_64 -PUBLIC SUB_32 -PUBLIC MUL_64 -PUBLIC MULH_64 -PUBLIC MUL_32 -PUBLIC IMUL_32 -PUBLIC IMULH_64 -PUBLIC DIV_64 -PUBLIC IDIV_64 -PUBLIC AND_64 -PUBLIC AND_32 -PUBLIC OR_64 -PUBLIC OR_32 -PUBLIC XOR_64 -PUBLIC XOR_32 -PUBLIC SHL_64 -PUBLIC SHR_64 -PUBLIC SAR_64 -PUBLIC ROL_64 -PUBLIC ROR_64 -PUBLIC FPINIT -PUBLIC FPADD -PUBLIC FPSUB -PUBLIC FPMUL -PUBLIC FPDIV -PUBLIC FPSQRT -PUBLIC FPROUND - -.code - -ADD_64 PROC - mov rax, QWORD PTR [rcx] - add rax, QWORD PTR [rdx] - mov QWORD PTR [r8], rax - ret 0 -ADD_64 ENDP - -ADD_32 PROC - mov eax, DWORD PTR [rcx] - add eax, DWORD PTR [rdx] - mov QWORD PTR [r8], rax - ret 0 -ADD_32 ENDP - -SUB_64 PROC - mov rax, QWORD PTR [rcx] - sub rax, QWORD PTR [rdx] - mov QWORD PTR [r8], rax - ret 0 -SUB_64 ENDP - -SUB_32 PROC - mov eax, DWORD PTR [rcx] - sub eax, DWORD PTR [rdx] - mov QWORD PTR [r8], rax - ret 0 -SUB_32 ENDP - -MUL_64 PROC - mov rax, QWORD PTR [rcx] - imul rax, QWORD PTR [rdx] - mov QWORD PTR [r8], rax - ret 0 -MUL_64 ENDP - -MULH_64 PROC - mov rax, QWORD PTR [rdx] - mul QWORD PTR [rcx] - mov QWORD PTR [r8], rdx - ret 0 -MULH_64 ENDP - -MUL_32 PROC - mov r9d, DWORD PTR [rcx] - mov eax, DWORD PTR [rdx] - imul r9, rax - mov QWORD PTR [r8], r9 - ret 0 -MUL_32 ENDP - -IMUL_32 PROC - movsxd r9, DWORD PTR [rcx] - movsxd rax, DWORD PTR [rdx] - imul r9, rax - mov QWORD PTR [r8], r9 - ret 0 -IMUL_32 ENDP - -IMULH_64 PROC - mov rax, QWORD PTR [rdx] - imul QWORD PTR [rcx] - mov QWORD PTR [r8], rdx - ret 0 -IMULH_64 ENDP - -DIV_64 PROC - mov r9d, DWORD PTR [rdx] - mov eax, 1 - test r9d, r9d - cmovne eax, r9d - xor edx, edx - mov r9d, eax - mov rax, QWORD PTR [rcx] - div r9 - mov QWORD PTR [r8], rax - ret 0 -DIV_64 ENDP - -IDIV_64 PROC - mov rax, QWORD PTR [rcx] - cmp DWORD PTR [rdx], -1 - jne SHORT SAFE_IDIV_64 -; mov rcx, -9223372036854775808 -; cmp rax, rcx - mov rcx, rax - rol rcx, 1 - dec rcx - jnz SHORT SAFE_IDIV_64 - mov QWORD PTR [r8], rax - ret 0 -SAFE_IDIV_64: - mov ecx, DWORD PTR [rdx] - test ecx, ecx - mov edx, 1 - cmovne edx, ecx - movsxd rcx, edx - cqo - idiv rcx - mov QWORD PTR [r8], rax - ret 0 -IDIV_64 ENDP - -AND_64 PROC - mov rax, QWORD PTR [rcx] - and rax, QWORD PTR [rdx] - mov QWORD PTR [r8], rax - ret 0 -AND_64 ENDP - -AND_32 PROC - mov eax, DWORD PTR [rcx] - and eax, DWORD PTR [rdx] - mov QWORD PTR [r8], rax - ret 0 -AND_32 ENDP - -OR_64 PROC - mov rax, QWORD PTR [rcx] - or rax, QWORD PTR [rdx] - mov QWORD PTR [r8], rax - ret 0 -OR_64 ENDP - -OR_32 PROC - mov eax, DWORD PTR [rcx] - or eax, DWORD PTR [rdx] - mov QWORD PTR [r8], rax - ret 0 -OR_32 ENDP - -XOR_64 PROC - mov rax, QWORD PTR [rcx] - xor rax, QWORD PTR [rdx] - mov QWORD PTR [r8], rax - ret 0 -XOR_64 ENDP - -XOR_32 PROC - mov eax, DWORD PTR [rcx] - xor eax, DWORD PTR [rdx] - mov QWORD PTR [r8], rax - ret 0 -XOR_32 ENDP - -SHL_64 PROC - mov rax, QWORD PTR [rcx] - mov rcx, QWORD PTR [rdx] - shl rax, cl - mov QWORD PTR [r8], rax - ret 0 -SHL_64 ENDP - -SHR_64 PROC - mov rax, QWORD PTR [rcx] - mov rcx, QWORD PTR [rdx] - shr rax, cl - mov QWORD PTR [r8], rax - ret 0 -SHR_64 ENDP - -SAR_64 PROC - mov rax, QWORD PTR [rcx] - mov rcx, QWORD PTR [rdx] - sar rax, cl - mov QWORD PTR [r8], rax - ret 0 -SAR_64 ENDP - -ROL_64 PROC - mov rax, QWORD PTR [rcx] - mov rcx, QWORD PTR [rdx] - rol rax, cl - mov QWORD PTR [r8], rax - ret 0 -ROL_64 ENDP - -ROR_64 PROC - mov rax, QWORD PTR [rcx] - mov rcx, QWORD PTR [rdx] - ror rax, cl - mov QWORD PTR [r8], rax - ret 0 -ROR_64 ENDP - -FPINIT PROC - mov DWORD PTR [rsp+8], 40896 - ldmxcsr DWORD PTR [rsp+8] - ret 0 -FPINIT ENDP - -FPADD PROC - mov rax, QWORD PTR [rcx] - and rax, -2048 - cvtsi2sd xmm0, rax - addsd xmm0, xmm1 - movsd QWORD PTR [r8], xmm0 - ret 0 -FPADD ENDP - -FPSUB PROC - mov rax, QWORD PTR [rcx] - and rax, -2048 - cvtsi2sd xmm0, rax - subsd xmm0, xmm1 - movsd QWORD PTR [r8], xmm0 - ret 0 -FPSUB ENDP - -FPMUL PROC - mov rax, QWORD PTR [rcx] - and rax, -2048 - or rax, 2048 - cvtsi2sd xmm0, rax - mulsd xmm0, xmm1 - movsd QWORD PTR [r8], xmm0 - ret 0 -FPMUL ENDP - -FPDIV PROC - mov rax, QWORD PTR [rcx] - and rax, -2048 - or rax, 2048 - cvtsi2sd xmm0, rax - divsd xmm0, xmm1 - movsd QWORD PTR [r8], xmm0 - ret 0 -FPDIV ENDP - -FPSQRT PROC - mov rax, QWORD PTR [rcx] - mov rcx, 9223372036854773760 - and rax, rcx - cvtsi2sd xmm0, rax - sqrtsd xmm1, xmm0 - movsd QWORD PTR [r8], xmm1 - ret 0 -FPSQRT ENDP - -FPROUND PROC - mov rax, QWORD PTR [rcx] - mov rcx, rax - shl rax, 13 - and rcx, -2048 - and eax, 24576 - cvtsi2sd xmm0, rcx - movsd QWORD PTR [r8], xmm0 - or eax, 40896 - mov DWORD PTR [rsp+8], eax - ldmxcsr DWORD PTR [rsp+8] - ret 0 -FPROUND ENDP - -END \ No newline at end of file diff --git a/src/jit_compiler_x86.cpp b/src/jit_compiler_x86.cpp index 8989c14..865f932 100644 --- a/src/jit_compiler_x86.cpp +++ b/src/jit_compiler_x86.cpp @@ -29,11 +29,27 @@ namespace randomx { throw std::runtime_error("JIT compiler only supports x86-64 CPUs"); } - void JitCompilerX86::generateProgram(Program& p) { + JitCompilerX86::~JitCompilerX86() { } - void JitCompilerX86::generateProgramLight(Program& p) { + void JitCompilerX86::generateProgram(Program& p, ProgramConfiguration& pcfg) { + + } + + void JitCompilerX86::generateProgramLight(Program& p, ProgramConfiguration& pcfg) { + + } + + template + void JitCompilerX86::generateSuperscalarHash(SuperscalarProgram(&programs)[N], std::vector &reciprocalCache) { + + } + + template + void JitCompilerX86::generateSuperscalarHash(SuperscalarProgram(&programs)[RANDOMX_CACHE_ACCESSES], std::vector &reciprocalCache); + + void JitCompilerX86::generateDatasetInitCode() { } @@ -239,10 +255,10 @@ namespace randomx { void JitCompilerX86::generateProgramLight(Program& prog, ProgramConfiguration& pcfg) { generateProgramPrologue(prog, pcfg); //if (superscalar) { - emit(codeReadDatasetLightSshInit, readDatasetLightInitSize); - emitByte(CALL); - emit32(superScalarHashOffset - (codePos + 4)); - emit(codeReadDatasetLightSshFin, readDatasetLightFinSize); + emit(codeReadDatasetLightSshInit, readDatasetLightInitSize); + emitByte(CALL); + emit32(superScalarHashOffset - (codePos + 4)); + emit(codeReadDatasetLightSshFin, readDatasetLightFinSize); /*} else { memcpy(code + codePos, codeReadDatasetLight, readDatasetLightSize); @@ -283,7 +299,7 @@ namespace randomx { } template - void JitCompilerX86::generateSuperscalarHash(SuperscalarProgram(&programs)[RANDOMX_CACHE_ACCESSES], std::vector &reciprocalCache); + void JitCompilerX86::generateSuperscalarHash(SuperscalarProgram(&programs)[RANDOMX_CACHE_ACCESSES], std::vector &reciprocalCache); void JitCompilerX86::generateDatasetInitCode() { memcpy(code, codeDatasetInit, datasetInitSize); @@ -713,7 +729,7 @@ namespace randomx { emit(REX_XOR_RM); emitByte(0x04 + 8 * instr.dst); emitByte(0x06); - } + } else { emit(REX_XOR_RM); emitByte(0x86 + 8 * instr.dst); @@ -861,7 +877,7 @@ namespace randomx { void JitCompilerX86::h_CFROUND(Instruction& instr, int i) { emit(REX_MOV_RR64); - emitByte(0xc0 + instr.src); + emitByte(0xc0 + instr.src); int rotate = (13 - (instr.getImm32() & 63)) & 63; if (rotate != 0) { emit(ROL_RAX); @@ -895,24 +911,24 @@ namespace randomx { static inline uint8_t condition(Instruction& instr) { switch (instr.getModCond()) { - case 0: - return 0x96; //setbe - case 1: - return 0x97; //seta - case 2: - return 0x98; //sets - case 3: - return 0x99; //setns - case 4: - return 0x90; //seto - case 5: - return 0x91; //setno - case 6: - return 0x9c; //setl - case 7: - return 0x9d; //setge - default: - UNREACHABLE; + case 0: + return 0x96; //setbe + case 1: + return 0x97; //seta + case 2: + return 0x98; //sets + case 3: + return 0x99; //setns + case 4: + return 0x90; //seto + case 5: + return 0x91; //setno + case 6: + return 0x9c; //setl + case 7: + return 0x9d; //setge + default: + UNREACHABLE; } } @@ -993,7 +1009,7 @@ namespace randomx { void JitCompilerX86::h_ISTORE(Instruction& instr, int i) { genAddressRegDst(instr); //if (instr.getModCond()) - emit(REX_MOV_MR); + emit(REX_MOV_MR); //else // emit(MOVNTI); emitByte(0x04 + 8 * instr.src); @@ -1050,6 +1066,5 @@ namespace randomx { INST_HANDLE(NOP) }; - +} #endif -} \ No newline at end of file