InstructionsX64.asm 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. ;RandomX ALU + FPU test
  2. ;https://github.com/tevador/RandomX
  3. ;License: GPL v3
  4. PUBLIC ADD_64
  5. PUBLIC ADD_32
  6. PUBLIC SUB_64
  7. PUBLIC SUB_32
  8. PUBLIC MUL_64
  9. PUBLIC MULH_64
  10. PUBLIC MUL_32
  11. PUBLIC IMUL_32
  12. PUBLIC IMULH_64
  13. PUBLIC DIV_64
  14. PUBLIC IDIV_64
  15. PUBLIC AND_64
  16. PUBLIC AND_32
  17. PUBLIC OR_64
  18. PUBLIC OR_32
  19. PUBLIC XOR_64
  20. PUBLIC XOR_32
  21. PUBLIC SHL_64
  22. PUBLIC SHR_64
  23. PUBLIC SAR_64
  24. PUBLIC ROL_64
  25. PUBLIC ROR_64
  26. PUBLIC FPINIT
  27. PUBLIC FADD_64
  28. PUBLIC FSUB_64
  29. PUBLIC FMUL_64
  30. PUBLIC FDIV_64
  31. PUBLIC FABSQRT
  32. PUBLIC FROUND
  33. CONST SEGMENT
  34. __XMMABS DB 0ffH, 0ffH, 0ffH, 0ffH, 0ffH, 0ffH, 0ffH, 07fH, 0ffH, 0ffH, 0ffH, 0ffH, 0ffH, 0ffH, 0ffH, 07fH
  35. CONST ENDS
  36. .code
  37. ADD_64 PROC
  38. mov rax, QWORD PTR [rcx]
  39. add rax, QWORD PTR [rdx]
  40. mov QWORD PTR [r8], rax
  41. ret 0
  42. ADD_64 ENDP
  43. ADD_32 PROC
  44. mov eax, DWORD PTR [rcx]
  45. add eax, DWORD PTR [rdx]
  46. mov QWORD PTR [r8], rax
  47. ret 0
  48. ADD_32 ENDP
  49. SUB_64 PROC
  50. mov rax, QWORD PTR [rcx]
  51. sub rax, QWORD PTR [rdx]
  52. mov QWORD PTR [r8], rax
  53. ret 0
  54. SUB_64 ENDP
  55. SUB_32 PROC
  56. mov eax, DWORD PTR [rcx]
  57. sub eax, DWORD PTR [rdx]
  58. mov QWORD PTR [r8], rax
  59. ret 0
  60. SUB_32 ENDP
  61. MUL_64 PROC
  62. mov rax, QWORD PTR [rcx]
  63. imul rax, QWORD PTR [rdx]
  64. mov QWORD PTR [r8], rax
  65. ret 0
  66. MUL_64 ENDP
  67. MULH_64 PROC
  68. mov rax, QWORD PTR [rdx]
  69. mul QWORD PTR [rcx]
  70. mov QWORD PTR [r8], rdx
  71. ret 0
  72. MULH_64 ENDP
  73. MUL_32 PROC
  74. mov r9d, DWORD PTR [rcx]
  75. mov eax, DWORD PTR [rdx]
  76. imul r9, rax
  77. mov QWORD PTR [r8], r9
  78. ret 0
  79. MUL_32 ENDP
  80. IMUL_32 PROC
  81. movsxd r9, DWORD PTR [rcx]
  82. movsxd rax, DWORD PTR [rdx]
  83. imul r9, rax
  84. mov QWORD PTR [r8], r9
  85. ret 0
  86. IMUL_32 ENDP
  87. IMULH_64 PROC
  88. mov rax, QWORD PTR [rdx]
  89. imul QWORD PTR [rcx]
  90. mov QWORD PTR [r8], rdx
  91. ret 0
  92. IMULH_64 ENDP
  93. DIV_64 PROC
  94. mov r9d, DWORD PTR [rdx]
  95. mov eax, 1
  96. test r9d, r9d
  97. cmovne eax, r9d
  98. xor edx, edx
  99. mov r9d, eax
  100. mov rax, QWORD PTR [rcx]
  101. div r9
  102. mov QWORD PTR [r8], rax
  103. ret 0
  104. DIV_64 ENDP
  105. IDIV_64 PROC
  106. mov rax, QWORD PTR [rcx]
  107. mov rcx, -9223372036854775808
  108. cmp rax, rcx
  109. jne SHORT SAFE_IDIV_64
  110. cmp QWORD PTR [rdx], -1
  111. jne SHORT SAFE_IDIV_64
  112. mov QWORD PTR [r8], rcx
  113. ret 0
  114. SAFE_IDIV_64:
  115. mov ecx, DWORD PTR [rdx]
  116. test ecx, ecx
  117. mov edx, 1
  118. cmovne edx, ecx
  119. movsxd rcx, edx
  120. cqo
  121. idiv rcx
  122. mov QWORD PTR [r8], rax
  123. ret 0
  124. IDIV_64 ENDP
  125. AND_64 PROC
  126. mov rax, QWORD PTR [rcx]
  127. and rax, QWORD PTR [rdx]
  128. mov QWORD PTR [r8], rax
  129. ret 0
  130. AND_64 ENDP
  131. AND_32 PROC
  132. mov eax, DWORD PTR [rcx]
  133. and eax, DWORD PTR [rdx]
  134. mov QWORD PTR [r8], rax
  135. ret 0
  136. AND_32 ENDP
  137. OR_64 PROC
  138. mov rax, QWORD PTR [rcx]
  139. or rax, QWORD PTR [rdx]
  140. mov QWORD PTR [r8], rax
  141. ret 0
  142. OR_64 ENDP
  143. OR_32 PROC
  144. mov eax, DWORD PTR [rcx]
  145. or eax, DWORD PTR [rdx]
  146. mov QWORD PTR [r8], rax
  147. ret 0
  148. OR_32 ENDP
  149. XOR_64 PROC
  150. mov rax, QWORD PTR [rcx]
  151. xor rax, QWORD PTR [rdx]
  152. mov QWORD PTR [r8], rax
  153. ret 0
  154. XOR_64 ENDP
  155. XOR_32 PROC
  156. mov eax, DWORD PTR [rcx]
  157. xor eax, DWORD PTR [rdx]
  158. mov QWORD PTR [r8], rax
  159. ret 0
  160. XOR_32 ENDP
  161. SHL_64 PROC
  162. mov rax, QWORD PTR [rcx]
  163. mov rcx, QWORD PTR [rdx]
  164. shl rax, cl
  165. mov QWORD PTR [r8], rax
  166. ret 0
  167. SHL_64 ENDP
  168. SHR_64 PROC
  169. mov rax, QWORD PTR [rcx]
  170. mov rcx, QWORD PTR [rdx]
  171. shr rax, cl
  172. mov QWORD PTR [r8], rax
  173. ret 0
  174. SHR_64 ENDP
  175. SAR_64 PROC
  176. mov rax, QWORD PTR [rcx]
  177. mov rcx, QWORD PTR [rdx]
  178. sar rax, cl
  179. mov QWORD PTR [r8], rax
  180. ret 0
  181. SAR_64 ENDP
  182. ROL_64 PROC
  183. mov rax, QWORD PTR [rcx]
  184. mov rcx, QWORD PTR [rdx]
  185. rol rax, cl
  186. mov QWORD PTR [r8], rax
  187. ret 0
  188. ROL_64 ENDP
  189. ROR_64 PROC
  190. mov rax, QWORD PTR [rcx]
  191. mov rcx, QWORD PTR [rdx]
  192. ror rax, cl
  193. mov QWORD PTR [r8], rax
  194. ret 0
  195. ROR_64 ENDP
  196. FPINIT PROC
  197. mov DWORD PTR [rsp+8], 40896
  198. ldmxcsr DWORD PTR [rsp+8]
  199. ret 0
  200. FPINIT ENDP
  201. FADD_64 PROC
  202. cvtsi2sd xmm0, QWORD PTR [rcx]
  203. addsd xmm0, xmm1
  204. movsd QWORD PTR [r8], xmm0
  205. ret 0
  206. FADD_64 ENDP
  207. FSUB_64 PROC
  208. cvtsi2sd xmm0, QWORD PTR [rcx]
  209. subsd xmm0, xmm1
  210. movsd QWORD PTR [r8], xmm0
  211. ret 0
  212. FSUB_64 ENDP
  213. FMUL_64 PROC
  214. cvtsi2sd xmm0, QWORD PTR [rcx]
  215. mulsd xmm0, xmm1
  216. movsd QWORD PTR [r8], xmm0
  217. ret 0
  218. FMUL_64 ENDP
  219. FDIV_64 PROC
  220. cvtsi2sd xmm0, QWORD PTR [rcx]
  221. divsd xmm0, xmm1
  222. movsd QWORD PTR [r8], xmm0
  223. ret 0
  224. FDIV_64 ENDP
  225. FABSQRT PROC
  226. cvtsi2sd xmm0, QWORD PTR [rcx]
  227. andps xmm0, XMMWORD PTR __XMMABS
  228. sqrtsd xmm1, xmm0
  229. movsd QWORD PTR [r8], xmm1
  230. ret 0
  231. FABSQRT ENDP
  232. FROUND PROC
  233. cvtsi2sd xmm0, QWORD PTR [rcx]
  234. movsd QWORD PTR [r8], xmm0
  235. mov rax, QWORD PTR [rcx]
  236. shl rax, 13
  237. and eax, 24576
  238. or eax, 40896
  239. mov DWORD PTR [rsp+8], eax
  240. ldmxcsr DWORD PTR [rsp+8]
  241. ret 0
  242. FROUND ENDP
  243. END