arnaucube
arnaucube/circomPublic Self-hosted repository
circom/c/buildasm/copy.asm.ejs
c/buildasm/copy.asm.ejsRaw
  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;;;;;;;;;;;;;;;;;;;;;;
 20; copy an array of integers
 21;;;;;;;;;;;;;;;;;;;;;;
 22; Copies
 23; Params:
 24;   rsi <= the src
 25;   rdi <= the dest
 26;   rdx <= number of integers to copy
 27;
 28; Nidified registers:
 29;   rax
 30;;;;;;;;;;;;;;;;;;;;;;;
 31<%=name%>_copyn:
 32<%=name%>_copyn_loop:
 33        mov     r8, rsi
 34        mov     r9, rdi
 35        mov     rax, <%= n64+1 %>
 36        mul     rdx
 37        mov     rcx, rax
 38        cld
 39   rep  movsq
 40        mov     rsi, r8
 41        mov     rdi, r9
 42        ret
 43
 44;;;;;;;;;;;;;;;;;;;;;;
 45; rawCopyS2L
 46;;;;;;;;;;;;;;;;;;;;;;
 47; Convert a 64 bit integer to a long format field element
 48; Params:
 49;   rsi <= the integer
 50;   rdi <= Pointer to the overwritted element
 51;
 52; Nidified registers:
 53;   rax
 54;;;;;;;;;;;;;;;;;;;;;;;
 55
 56rawCopyS2L:
 57        mov     al, 0x80
 58        shl     rax, 56
 59        mov     [rdi], rax    ; set the result to LONG normal
 60
 61        cmp     rsi, 0
 62        js      u64toLong_adjust_neg
 63
 64        mov     [rdi + 8], rsi
 65        xor     rax, rax
 66<% for (let i=1; i<n64; i++) { %>
 67        mov     [rdi + <%= 8+i*8 %>], rax
 68<% } %>
 69        ret
 70
 71u64toLong_adjust_neg:
 72        add    rsi, [q]         ; Set the first digit
 73        mov    [rdi + 8], rsi   ;
 74
 75        mov    rsi, -1          ; all ones
 76<% for (let i=1; i<n64; i++) { %>
 77        mov    rax, rsi                       ; Add to q
 78        adc    rax, [q + <%= i*8 %> ]
 79        mov    [rdi + <%= (i+1)*8 %>], rax
 80<% } %>
 81        ret
 82
 83;;;;;;;;;;;;;;;;;;;;;;
 84; toInt
 85;;;;;;;;;;;;;;;;;;;;;;
 86; Convert a 64 bit integer to a long format field element
 87; Params:
 88;   rsi <= Pointer to the element
 89; Returs:
 90;   rax <= The value
 91;;;;;;;;;;;;;;;;;;;;;;;
 92<%=name%>_toInt:
 93        mov     rax, [rdi]
 94        bt      rax, 63
 95        jc      <%=name%>_long
 96        movsx   rax, eax
 97        ret
 98
 99<%=name%>_long:
100        mov     rax, [rdi + 8]
101        mov     rcx, rax
102        shr     rcx, 31
103        jnz     <%=name%>_longNeg
104<% for (let i=1; i< n64; i++) { %>
105        mov     rcx, [rdi + <%= i*8+8 %>]
106        test    rcx, rcx
107        jnz     <%=name%>_longNeg
108<% } %>
109        ret
110
111<%=name%>_longNeg:
112        mov     rax, [rdi + 8]
113        sub     rax, [q]
114        jnc     <%=name%>_longErr
115<% for (let i=1; i<n64; i++) { %>
116        mov     rcx, [rdi + <%= i*8+8 %>]
117        sbb     rcx, [q + <%= i*8 %>]
118        jnc     <%=name%>_longErr
119<% } %>
120        mov     rcx, rax
121        sar     rcx, 31
122        add     rcx, 1
123        jnz     <%=name%>_longErr
124        ret
125
126<%=name%>_longErr:
127        push    rdi
128        mov     rdi, 0
129        call    <%=name%>_fail
130        pop     rdi
131
132
133