mirror of
https://github.com/wownero/RandomX.git
synced 2026-10-23 10:18:33 +02:00
Vector FPU instructions
JitCompilerX86 - static code written in asm Updated ALU/FPU tests Updated instruction weights
This commit is contained in:
+113
-46
@@ -1,19 +1,19 @@
|
||||
; 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<http://www.gnu.org/licenses/>.
|
||||
;# 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<http://www.gnu.org/licenses/>.
|
||||
|
||||
PUBLIC executeProgram
|
||||
|
||||
@@ -47,6 +47,7 @@ executeProgram PROC
|
||||
; xmm7 -> "f7"
|
||||
; xmm8 -> "f0"
|
||||
; xmm9 -> "f1"
|
||||
; xmm10 -> absolute value mask
|
||||
|
||||
; STACK STRUCTURE:
|
||||
; |
|
||||
@@ -71,11 +72,12 @@ executeProgram PROC
|
||||
push r13
|
||||
push r14
|
||||
push r15
|
||||
sub rsp, 64
|
||||
movdqu xmmword ptr [rsp+48], xmm6
|
||||
movdqu xmmword ptr [rsp+32], xmm7
|
||||
movdqu xmmword ptr [rsp+16], xmm8
|
||||
movdqu xmmword ptr [rsp+0], xmm9
|
||||
sub rsp, 80
|
||||
movdqu xmmword ptr [rsp+64], xmm6
|
||||
movdqu xmmword ptr [rsp+48], xmm7
|
||||
movdqu xmmword ptr [rsp+32], xmm8
|
||||
movdqu xmmword ptr [rsp+16], xmm9
|
||||
movdqu xmmword ptr [rsp+0], xmm10
|
||||
|
||||
; function arguments
|
||||
push rcx ; RegisterFile& registerFile
|
||||
@@ -86,7 +88,15 @@ executeProgram PROC
|
||||
mov rbp, rsp ; beginning of VM stack
|
||||
mov rdi, 1048577 ; number of VM instructions to execute + 1
|
||||
|
||||
; load VM register values
|
||||
xorps xmm10, xmm10
|
||||
cmpeqpd xmm10, xmm10
|
||||
psrlq xmm10, 1 ; mask for absolute value = 0x7fffffffffffffff7fffffffffffffff
|
||||
|
||||
; reset rounding mode
|
||||
mov dword ptr [rsp-8], 40896
|
||||
ldmxcsr dword ptr [rsp-8]
|
||||
|
||||
; load integer registers
|
||||
mov r8, qword ptr [rcx+0]
|
||||
mov r9, qword ptr [rcx+8]
|
||||
mov r10, qword ptr [rcx+16]
|
||||
@@ -95,16 +105,56 @@ executeProgram PROC
|
||||
mov r13, qword ptr [rcx+40]
|
||||
mov r14, qword ptr [rcx+48]
|
||||
mov r15, qword ptr [rcx+56]
|
||||
mov dword ptr [rsp-8], 40896
|
||||
ldmxcsr dword ptr [rsp-8]
|
||||
|
||||
; load register f0 hi, lo
|
||||
xorps xmm8, xmm8
|
||||
cvtsi2sd xmm8, qword ptr [rcx+72]
|
||||
pslldq xmm8, 8
|
||||
cvtsi2sd xmm8, qword ptr [rcx+64]
|
||||
cvtsi2sd xmm9, qword ptr [rcx+72]
|
||||
cvtsi2sd xmm2, qword ptr [rcx+80]
|
||||
cvtsi2sd xmm3, qword ptr [rcx+88]
|
||||
cvtsi2sd xmm4, qword ptr [rcx+96]
|
||||
cvtsi2sd xmm5, qword ptr [rcx+104]
|
||||
cvtsi2sd xmm6, qword ptr [rcx+112]
|
||||
|
||||
; load register f1 hi, lo
|
||||
xorps xmm9, xmm9
|
||||
cvtsi2sd xmm9, qword ptr [rcx+88]
|
||||
pslldq xmm9, 8
|
||||
cvtsi2sd xmm9, qword ptr [rcx+80]
|
||||
|
||||
; load register f2 hi, lo
|
||||
xorps xmm2, xmm2
|
||||
cvtsi2sd xmm2, qword ptr [rcx+104]
|
||||
pslldq xmm2, 8
|
||||
cvtsi2sd xmm2, qword ptr [rcx+96]
|
||||
|
||||
; load register f3 hi, lo
|
||||
xorps xmm3, xmm3
|
||||
cvtsi2sd xmm3, qword ptr [rcx+120]
|
||||
pslldq xmm3, 8
|
||||
cvtsi2sd xmm3, qword ptr [rcx+112]
|
||||
|
||||
lea rcx, [rcx+64]
|
||||
|
||||
; load register f4 hi, lo
|
||||
xorps xmm4, xmm4
|
||||
cvtsi2sd xmm4, qword ptr [rcx+72]
|
||||
pslldq xmm4, 8
|
||||
cvtsi2sd xmm4, qword ptr [rcx+64]
|
||||
|
||||
; load register f5 hi, lo
|
||||
xorps xmm5, xmm5
|
||||
cvtsi2sd xmm5, qword ptr [rcx+88]
|
||||
pslldq xmm5, 8
|
||||
cvtsi2sd xmm5, qword ptr [rcx+80]
|
||||
|
||||
; load register f6 hi, lo
|
||||
xorps xmm6, xmm6
|
||||
cvtsi2sd xmm6, qword ptr [rcx+104]
|
||||
pslldq xmm6, 8
|
||||
cvtsi2sd xmm6, qword ptr [rcx+96]
|
||||
|
||||
; load register f7 hi, lo
|
||||
xorps xmm7, xmm7
|
||||
cvtsi2sd xmm7, qword ptr [rcx+120]
|
||||
pslldq xmm7, 8
|
||||
cvtsi2sd xmm7, qword ptr [rcx+112]
|
||||
|
||||
; program body
|
||||
|
||||
@@ -125,21 +175,23 @@ rx_finish:
|
||||
mov qword ptr [rcx+40], r13
|
||||
mov qword ptr [rcx+48], r14
|
||||
mov qword ptr [rcx+56], r15
|
||||
movd qword ptr [rcx+64], xmm8
|
||||
movd qword ptr [rcx+72], xmm9
|
||||
movd qword ptr [rcx+80], xmm2
|
||||
movd qword ptr [rcx+88], xmm3
|
||||
movd qword ptr [rcx+96], xmm4
|
||||
movd qword ptr [rcx+104], xmm5
|
||||
movd qword ptr [rcx+112], xmm6
|
||||
movd qword ptr [rcx+120], xmm7
|
||||
movdqa xmmword ptr [rcx+64], xmm8
|
||||
movdqa xmmword ptr [rcx+80], xmm9
|
||||
movdqa xmmword ptr [rcx+96], xmm2
|
||||
movdqa xmmword ptr [rcx+112], xmm3
|
||||
lea rcx, [rcx+64]
|
||||
movdqa xmmword ptr [rcx+64], xmm4
|
||||
movdqa xmmword ptr [rcx+80], xmm5
|
||||
movdqa xmmword ptr [rcx+96], xmm6
|
||||
movdqa xmmword ptr [rcx+112], xmm7
|
||||
|
||||
; load callee-saved registers
|
||||
movdqu xmm9, xmmword ptr [rsp]
|
||||
movdqu xmm8, xmmword ptr [rsp+16]
|
||||
movdqu xmm7, xmmword ptr [rsp+32]
|
||||
movdqu xmm6, xmmword ptr [rsp+48]
|
||||
add rsp, 64
|
||||
movdqu xmm10, xmmword ptr [rsp]
|
||||
movdqu xmm9, xmmword ptr [rsp+16]
|
||||
movdqu xmm8, xmmword ptr [rsp+32]
|
||||
movdqu xmm7, xmmword ptr [rsp+48]
|
||||
movdqu xmm6, xmmword ptr [rsp+64]
|
||||
add rsp, 80
|
||||
pop r15
|
||||
pop r14
|
||||
pop r13
|
||||
@@ -171,7 +223,7 @@ rx_read_dataset:
|
||||
pop r8
|
||||
ret 0
|
||||
|
||||
rx_read_dataset_full:
|
||||
rx_read_dataset_r:
|
||||
mov edx, dword ptr [rbx] ; ma
|
||||
mov rax, qword ptr [rbx+8] ; dataset
|
||||
mov rax, qword ptr [rax+rdx]
|
||||
@@ -179,12 +231,27 @@ rx_read_dataset_full:
|
||||
xor ecx, dword ptr [rbx+4] ; mx
|
||||
mov dword ptr [rbx+4], ecx
|
||||
test ecx, 0FFF8h
|
||||
jne short rx_read_dataset_full_ret
|
||||
jne short rx_read_dataset_r_ret
|
||||
and ecx, -8
|
||||
mov dword ptr [rbx], ecx
|
||||
mov rdx, qword ptr [rbx+8]
|
||||
prefetcht0 byte ptr [rdx+rcx]
|
||||
rx_read_dataset_full_ret:
|
||||
rx_read_dataset_r_ret:
|
||||
ret 0
|
||||
|
||||
rx_read_dataset_f:
|
||||
mov edx, dword ptr [rbx] ; ma
|
||||
mov rax, qword ptr [rbx+8] ; dataset
|
||||
cvtdq2pd xmm0, qword ptr [rax+rdx]
|
||||
add dword ptr [rbx], 8
|
||||
xor ecx, dword ptr [rbx+4] ; mx
|
||||
mov dword ptr [rbx+4], ecx
|
||||
test ecx, 0FFF8h
|
||||
jne short rx_read_dataset_f_ret
|
||||
and ecx, -8
|
||||
mov dword ptr [rbx], ecx
|
||||
prefetcht0 byte ptr [rax+rcx]
|
||||
rx_read_dataset_f_ret:
|
||||
ret 0
|
||||
executeProgram ENDP
|
||||
|
||||
|
||||
Reference in New Issue
Block a user