]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libmp/amd64/mpvecadd.s
kernel: implement portable userinit() and simplify process creation
[plan9front.git] / sys / src / libmp / amd64 / mpvecadd.s
1 /*
2  *      mpvecadd(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *sum)
3  *
4  *              sum[0:alen] = a[0:alen-1] + b[0:blen-1]
5  *
6  *      prereq: alen >= blen, sum has room for alen+1 digits
7  */
8 TEXT    mpvecadd(SB),$0
9
10         MOVL    alen+8(FP),DX
11         MOVL    blen+24(FP),CX
12         MOVQ    RARG, SI
13         MOVQ    b+16(FP),BX
14         SUBL    CX,DX
15         MOVQ    sum+32(FP),DI
16         XORL    BP,BP                   /* this also sets carry to 0 */
17
18         /* skip addition if b is zero */
19         TESTL   CX,CX
20         JZ      _add1
21
22         /* sum[0:blen-1],carry = a[0:blen-1] + b[0:blen-1] */
23 _addloop1:
24         MOVL    (SI)(BP*4), AX
25         ADCL    (BX)(BP*4), AX
26         MOVL    AX,(DI)(BP*4)
27         INCL    BP
28         LOOP    _addloop1
29
30 _add1:
31         /* jump if alen > blen */
32         INCL    DX
33         MOVL    DX,CX
34         LOOP    _addloop2
35
36         /* sum[alen] = carry */
37
38 _addend:
39         ADCL    $0, CX
40         MOVL    CX,(DI)(BP*4)
41         RET
42
43         /* sum[blen:alen-1],carry = a[blen:alen-1] + 0 */
44 _addloop2:
45         MOVL    (SI)(BP*4),AX
46         ADCL    $0,AX
47         MOVL    AX,(DI)(BP*4)
48         INCL    BP
49         LOOP    _addloop2
50         JMP     _addend
51