|
|
;;;;;;;;;;;;;;;;;;;;;; ; copy ;;;;;;;;;;;;;;;;;;;;;; ; Copies ; Params: ; rsi <= the src ; rdi <= the dest ; ; Nidified registers: ; rax ;;;;;;;;;;;;;;;;;;;;;;; <%=name%>_copy: <% for (let i=0; i<=n64; i++) { %> mov rax, [rsi + <%= i*8 %>] mov [rdi + <%= i*8 %>], rax <% } %> ret
;;;;;;;;;;;;;;;;;;;;;; ; copy an array of integers ;;;;;;;;;;;;;;;;;;;;;; ; Copies ; Params: ; rsi <= the src ; rdi <= the dest ; rdx <= number of integers to copy ; ; Nidified registers: ; rax ;;;;;;;;;;;;;;;;;;;;;;; <%=name%>_copyn: <%=name%>_copyn_loop: mov r8, rsi mov r9, rdi mov rax, <%= n64+1 %> mul rdx mov rcx, rax cld rep movsq mov rsi, r8 mov rdi, r9 ret
;;;;;;;;;;;;;;;;;;;;;; ; 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
|