]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libc/386/memmove.s
audiohda: make it work with sb600 onboard sound
[plan9front.git] / sys / src / libc / 386 / memmove.s
1 TEXT memmove(SB), $0
2         MOVL    p1+0(FP), DI
3         MOVL    DI, AX                  /* return value */
4         MOVL    p2+4(FP), SI
5         MOVL    n+8(FP), BX
6         CMPL    BX, $0
7         JGT     _ok
8         JEQ     _return                 /* nothing to do if n == 0 */
9         MOVL    $0, SI                  /* fault if n < 0 */
10
11 /*
12  * check and set for backwards:
13  *      (p2 < p1) && ((p2+n) > p1)
14  */
15 _ok:
16         CMPL    SI, DI
17         JGT     _forward
18         JEQ     _return                 /* nothing to do if p2 == p1 */
19         MOVL    SI, DX
20         ADDL    BX, DX
21         CMPL    DX, DI
22         JGT     _back
23
24 /*
25  * copy whole longs
26  */
27 _forward:
28         MOVL    BX, CX
29         CLD
30         SHRL    $2, CX
31         ANDL    $3, BX
32         REP;    MOVSL
33
34 /*
35  * copy the rest, by bytes
36  */
37         JEQ     _return                 /* flags set by above ANDL */
38         MOVL    BX, CX
39         REP;    MOVSB
40
41         RET
42
43 /*
44  * whole thing backwards has
45  * adjusted addresses
46  */
47 _back:
48         ADDL    BX, DI
49         ADDL    BX, SI
50         STD
51         SUBL    $4, DI
52         SUBL    $4, SI
53 /*
54  * copy whole longs
55  */
56         MOVL    BX, CX
57         SHRL    $2, CX
58         ANDL    $3, BX
59         REP;    MOVSL
60 /*
61  * copy the rest, by bytes
62  */
63         JEQ     _return                 /* flags set by above ANDL */
64
65         ADDL    $3, DI
66         ADDL    $3, SI
67         MOVL    BX, CX
68         REP;    MOVSB
69
70 _return:
71         RET