jit_compiler_x86_static.asm 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. ; Copyright (c) 2018-2019, tevador <tevador@gmail.com>
  2. ;
  3. ; All rights reserved.
  4. ;
  5. ; Redistribution and use in source and binary forms, with or without
  6. ; modification, are permitted provided that the following conditions are met:
  7. ; * Redistributions of source code must retain the above copyright
  8. ; notice, this list of conditions and the following disclaimer.
  9. ; * Redistributions in binary form must reproduce the above copyright
  10. ; notice, this list of conditions and the following disclaimer in the
  11. ; documentation and/or other materials provided with the distribution.
  12. ; * Neither the name of the copyright holder nor the
  13. ; names of its contributors may be used to endorse or promote products
  14. ; derived from this software without specific prior written permission.
  15. ;
  16. ; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  17. ; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18. ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19. ; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  20. ; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  21. ; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  22. ; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  23. ; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  24. ; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  25. ; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. IFDEF RAX
  27. _RANDOMX_JITX86_STATIC SEGMENT PAGE READ EXECUTE
  28. PUBLIC randomx_prefetch_scratchpad
  29. PUBLIC randomx_prefetch_scratchpad_end
  30. PUBLIC randomx_program_prologue
  31. PUBLIC randomx_program_loop_begin
  32. PUBLIC randomx_program_loop_load
  33. PUBLIC randomx_program_start
  34. PUBLIC randomx_program_read_dataset
  35. PUBLIC randomx_program_read_dataset_sshash_init
  36. PUBLIC randomx_program_read_dataset_sshash_fin
  37. PUBLIC randomx_dataset_init
  38. PUBLIC randomx_program_loop_store
  39. PUBLIC randomx_program_loop_end
  40. PUBLIC randomx_program_epilogue
  41. PUBLIC randomx_sshash_load
  42. PUBLIC randomx_sshash_prefetch
  43. PUBLIC randomx_sshash_end
  44. PUBLIC randomx_sshash_init
  45. PUBLIC randomx_program_end
  46. PUBLIC randomx_reciprocal_fast
  47. include asm/configuration.asm
  48. RANDOMX_SCRATCHPAD_MASK EQU (RANDOMX_SCRATCHPAD_L3-64)
  49. RANDOMX_DATASET_BASE_MASK EQU (RANDOMX_DATASET_BASE_SIZE-64)
  50. RANDOMX_CACHE_MASK EQU (RANDOMX_ARGON_MEMORY*16-1)
  51. RANDOMX_ALIGN EQU 4096
  52. SUPERSCALAR_OFFSET EQU ((((RANDOMX_ALIGN + 32 * RANDOMX_PROGRAM_SIZE) - 1) / (RANDOMX_ALIGN) + 1) * (RANDOMX_ALIGN))
  53. randomx_prefetch_scratchpad PROC
  54. mov rdx, rax
  55. and eax, RANDOMX_SCRATCHPAD_MASK
  56. prefetcht0 [rsi+rax]
  57. ror rdx, 32
  58. and edx, RANDOMX_SCRATCHPAD_MASK
  59. prefetcht0 [rsi+rdx]
  60. randomx_prefetch_scratchpad ENDP
  61. randomx_prefetch_scratchpad_end PROC
  62. randomx_prefetch_scratchpad_end ENDP
  63. ALIGN 64
  64. randomx_program_prologue PROC
  65. include asm/program_prologue_win64.inc
  66. movapd xmm13, xmmword ptr [mantissaMask]
  67. movapd xmm14, xmmword ptr [exp240]
  68. movapd xmm15, xmmword ptr [scaleMask]
  69. mov rdx, rax
  70. and eax, RANDOMX_SCRATCHPAD_MASK
  71. ror rdx, 32
  72. and edx, RANDOMX_SCRATCHPAD_MASK
  73. jmp rx_program_loop_begin
  74. randomx_program_prologue ENDP
  75. ALIGN 64
  76. include asm/program_xmm_constants.inc
  77. ALIGN 64
  78. randomx_program_loop_begin PROC
  79. rx_program_loop_begin::
  80. nop
  81. randomx_program_loop_begin ENDP
  82. randomx_program_loop_load PROC
  83. include asm/program_loop_load.inc
  84. randomx_program_loop_load ENDP
  85. randomx_program_start PROC
  86. nop
  87. randomx_program_start ENDP
  88. randomx_program_read_dataset PROC
  89. include asm/program_read_dataset.inc
  90. randomx_program_read_dataset ENDP
  91. randomx_program_read_dataset_sshash_init PROC
  92. include asm/program_read_dataset_sshash_init.inc
  93. randomx_program_read_dataset_sshash_init ENDP
  94. randomx_program_read_dataset_sshash_fin PROC
  95. include asm/program_read_dataset_sshash_fin.inc
  96. randomx_program_read_dataset_sshash_fin ENDP
  97. randomx_program_loop_store PROC
  98. include asm/program_loop_store.inc
  99. randomx_program_loop_store ENDP
  100. randomx_program_loop_end PROC
  101. nop
  102. randomx_program_loop_end ENDP
  103. ALIGN 64
  104. randomx_dataset_init PROC
  105. push rbx
  106. push rbp
  107. push rdi
  108. push rsi
  109. push r12
  110. push r13
  111. push r14
  112. push r15
  113. mov rdi, qword ptr [rcx] ;# cache->memory
  114. mov rsi, rdx ;# dataset
  115. mov rbp, r8 ;# block index
  116. push r9 ;# max. block index
  117. init_block_loop:
  118. prefetchw byte ptr [rsi]
  119. mov rbx, rbp
  120. db 232 ;# 0xE8 = call
  121. dd SUPERSCALAR_OFFSET - distance
  122. distance equ $ - offset randomx_dataset_init
  123. mov qword ptr [rsi+0], r8
  124. mov qword ptr [rsi+8], r9
  125. mov qword ptr [rsi+16], r10
  126. mov qword ptr [rsi+24], r11
  127. mov qword ptr [rsi+32], r12
  128. mov qword ptr [rsi+40], r13
  129. mov qword ptr [rsi+48], r14
  130. mov qword ptr [rsi+56], r15
  131. add rbp, 1
  132. add rsi, 64
  133. cmp rbp, qword ptr [rsp]
  134. jb init_block_loop
  135. pop r9
  136. pop r15
  137. pop r14
  138. pop r13
  139. pop r12
  140. pop rsi
  141. pop rdi
  142. pop rbp
  143. pop rbx
  144. ret
  145. randomx_dataset_init ENDP
  146. ALIGN 64
  147. randomx_program_epilogue PROC
  148. include asm/program_epilogue_store.inc
  149. include asm/program_epilogue_win64.inc
  150. randomx_program_epilogue ENDP
  151. ALIGN 64
  152. randomx_sshash_load PROC
  153. include asm/program_sshash_load.inc
  154. randomx_sshash_load ENDP
  155. randomx_sshash_prefetch PROC
  156. include asm/program_sshash_prefetch.inc
  157. randomx_sshash_prefetch ENDP
  158. randomx_sshash_end PROC
  159. nop
  160. randomx_sshash_end ENDP
  161. ALIGN 64
  162. randomx_sshash_init PROC
  163. lea r8, [rbx+1]
  164. include asm/program_sshash_prefetch.inc
  165. imul r8, qword ptr [r0_mul]
  166. mov r9, qword ptr [r1_add]
  167. xor r9, r8
  168. mov r10, qword ptr [r2_add]
  169. xor r10, r8
  170. mov r11, qword ptr [r3_add]
  171. xor r11, r8
  172. mov r12, qword ptr [r4_add]
  173. xor r12, r8
  174. mov r13, qword ptr [r5_add]
  175. xor r13, r8
  176. mov r14, qword ptr [r6_add]
  177. xor r14, r8
  178. mov r15, qword ptr [r7_add]
  179. xor r15, r8
  180. jmp rx_program_end
  181. randomx_sshash_init ENDP
  182. ALIGN 64
  183. include asm/program_sshash_constants.inc
  184. ALIGN 64
  185. randomx_program_end PROC
  186. rx_program_end::
  187. nop
  188. randomx_program_end ENDP
  189. randomx_reciprocal_fast PROC
  190. include asm/randomx_reciprocal.inc
  191. randomx_reciprocal_fast ENDP
  192. _RANDOMX_JITX86_STATIC ENDS
  193. ENDIF
  194. END