]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libmp/amd64/mpvecsub.s
pc, pc64: load idt early in trapinit0()
[plan9front.git] / sys / src / libmp / amd64 / mpvecsub.s
1 /*
2  *      mpvecsub(mpdigit *a, int alen, mpdigit *b, int blen, mpdigit *diff)
3  *
4  *              diff[0:alen-1] = a[0:alen-1] - b[0:blen-1]
5  *
6  *      prereq: alen >= blen, diff has room for alen digits
7  */
8 TEXT    mpvecsub(SB),$0
9
10 /*      MOVQ    a+0(FP),SI */
11         MOVQ    RARG, SI
12         MOVQ    b+16(FP),BX
13         MOVL    alen+8(FP),DX
14         MOVL    blen+24(FP),CX
15         MOVQ    diff+32(FP),DI
16         SUBL    CX,DX
17         XORL    BP,BP                   /* this also sets carry to 0 */
18
19         /* skip subraction if b is zero */
20         TESTL   CX,CX
21         JZ      _sub1
22
23         /* diff[0:blen-1],borrow = a[0:blen-1] - b[0:blen-1] */
24 _subloop1:
25         MOVL    (SI)(BP*4),AX
26         SBBL    (BX)(BP*4),AX
27         MOVL    AX,(DI)(BP*4)
28         INCL    BP
29         LOOP    _subloop1
30
31 _sub1:
32         INCL    DX
33         MOVL    DX,CX
34         LOOP    _subloop2
35         RET
36
37         /* diff[blen:alen-1] = a[blen:alen-1] - 0 */
38 _subloop2:
39         MOVL    (SI)(BP*4),AX
40         SBBL    $0,AX
41         MOVL    AX,(DI)(BP*4)
42         INCL    BP
43         LOOP    _subloop2
44         RET
45