|
|
;;;;;;;;;;;;;;;;;;;;;;
|
|
; rawCopyS2L
|
|
;;;;;;;;;;;;;;;;;;;;;;
|
|
; Convert a 64 bit integer to a long format field element
|
|
; Params:
|
|
; rsi <= the integer
|
|
; rdi <= Pointer to the overwritted element
|
|
;
|
|
; Nidified registers:
|
|
; rax
|
|
;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
rawCopyS2L:
|
|
mov al, 0x80
|
|
shl rax, 56
|
|
mov [rdi], rax ; set the result to LONG normal
|
|
|
|
cmp rsi, 0
|
|
js u64toLong_adjust_neg
|
|
|
|
mov [rdi + 8], rsi
|
|
xor rax, rax
|
|
<% for (let i=1; i<n64; i++) { %>
|
|
mov [rdi + <%= 8+i*8 %>], rax
|
|
<% } %>
|
|
ret
|
|
|
|
u64toLong_adjust_neg:
|
|
add rsi, [q] ; Set the first digit
|
|
mov [rdi + 8], rsi ;
|
|
|
|
mov rsi, -1 ; all ones
|
|
<% for (let i=1; i<n64; i++) { %>
|
|
mov rax, rsi ; Add to q
|
|
adc rax, [q + <%= i*8 %> ]
|
|
mov [rdi + <%= (i+1)*8 %>], rax
|
|
<% } %>
|
|
ret
|