]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libc/amd64/memccpy.s
d878faaf54419378d92b4ee16db3195e96fd035a
[plan9front.git] / sys / src / libc / amd64 / memccpy.s
1         TEXT    memccpy(SB),$0
2
3         MOVL    n+24(FP), CX
4         CMPL    CX, $0
5         JEQ     none
6         MOVQ    p2+8(FP), DI
7         MOVBLZX c+16(FP), AX
8         CLD
9 /*
10  * find the character in the second string
11  */
12
13         REPN;   SCASB
14         JEQ     found
15
16 /*
17  * if not found, set count to 'n'
18  */
19 none:
20         MOVL    $0, AX
21         MOVL    n+24(FP), BX
22         JMP     memcpy
23
24 /*
25  * if found, set count to bytes thru character
26  */
27 found:
28         MOVQ    DI, AX
29         SUBQ    p2+8(FP), AX
30         MOVQ    AX, BX
31         ADDQ    RARG, AX
32
33 /*
34  * copy the memory
35  */
36
37 memcpy:
38         MOVQ    RARG, DI
39         MOVQ    p2+8(FP), SI
40 /*
41  * copy whole longs, if aligned
42  */
43         MOVQ    DI, DX
44         ORQ     SI, DX
45         ANDL    $3, DX
46         JNE     c3
47         MOVL    BX, CX
48         SHRQ    $2, CX
49         REP;    MOVSL
50 /*
51  * copy the rest, by bytes
52  */
53         ANDL    $3, BX
54 c3:
55         MOVL    BX, CX
56         REP;    MOVSB
57
58         RET