You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
1.7 KiB

  1. ;;;;;;;;;;;;;;;;;;;;;;
  2. ; copy
  3. ;;;;;;;;;;;;;;;;;;;;;;
  4. ; Copies
  5. ; Params:
  6. ; rsi <= the src
  7. ; rdi <= the dest
  8. ;
  9. ; Nidified registers:
  10. ; rax
  11. ;;;;;;;;;;;;;;;;;;;;;;;
  12. <%=name%>_copy:
  13. <% for (let i=0; i<=n64; i++) { %>
  14. mov rax, [rsi + <%= i*8 %>]
  15. mov [rdi + <%= i*8 %>], rax
  16. <% } %>
  17. ret
  18. ;;;;;;;;;;;;;;;;;;;;;;
  19. ; copy an array of integers
  20. ;;;;;;;;;;;;;;;;;;;;;;
  21. ; Copies
  22. ; Params:
  23. ; rsi <= the src
  24. ; rdi <= the dest
  25. ; rdx <= number of integers to copy
  26. ;
  27. ; Nidified registers:
  28. ; rax
  29. ;;;;;;;;;;;;;;;;;;;;;;;
  30. <%=name%>_copyn:
  31. <%=name%>_copyn_loop:
  32. mov r8, rsi
  33. mov r9, rdi
  34. mov rax, <%= n64+1 %>
  35. mul rdx
  36. mov rcx, rax
  37. cld
  38. rep movsq
  39. mov rsi, r8
  40. mov rdi, r9
  41. ret
  42. ;;;;;;;;;;;;;;;;;;;;;;
  43. ; rawCopyS2L
  44. ;;;;;;;;;;;;;;;;;;;;;;
  45. ; Convert a 64 bit integer to a long format field element
  46. ; Params:
  47. ; rsi <= the integer
  48. ; rdi <= Pointer to the overwritted element
  49. ;
  50. ; Nidified registers:
  51. ; rax
  52. ;;;;;;;;;;;;;;;;;;;;;;;
  53. rawCopyS2L:
  54. mov al, 0x80
  55. shl rax, 56
  56. mov [rdi], rax ; set the result to LONG normal
  57. cmp rsi, 0
  58. js u64toLong_adjust_neg
  59. mov [rdi + 8], rsi
  60. xor rax, rax
  61. <% for (let i=1; i<n64; i++) { %>
  62. mov [rdi + <%= 8+i*8 %>], rax
  63. <% } %>
  64. ret
  65. u64toLong_adjust_neg:
  66. add rsi, [q] ; Set the first digit
  67. mov [rdi + 8], rsi ;
  68. mov rsi, -1 ; all ones
  69. <% for (let i=1; i<n64; i++) { %>
  70. mov rax, rsi ; Add to q
  71. adc rax, [q + <%= i*8 %> ]
  72. mov [rdi + <%= (i+1)*8 %>], rax
  73. <% } %>
  74. ret