xref: /plan9/sys/src/libc/386/memccpy.s (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1	TEXT	memccpy(SB),$0
2
3	MOVL	n+12(FP), CX
4	CMPL	CX, $0
5	JEQ	none
6	MOVL	p2+4(FP), DI
7	MOVBLZX	c+8(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 */
19none:
20	MOVL	$0, AX
21	MOVL	n+12(FP), BX
22	JMP	memcpy
23
24/*
25 * if found, set count to bytes thru character
26 */
27found:
28	MOVL	DI, AX
29	SUBL	p2+4(FP), AX
30	MOVL	AX, BX
31	ADDL	p1+0(FP), AX
32
33/*
34 * copy the memory
35 */
36
37memcpy:
38	MOVL	p1+0(FP), DI
39	MOVL	p2+4(FP), SI
40/*
41 * copy whole longs
42 */
43	MOVL	BX, CX
44	SHRL	$2, CX
45	REP;	MOVSL
46/*
47 * copy the rest, by bytes
48 */
49	ANDL	$3, BX
50	MOVL	BX, CX
51	REP;	MOVSB
52
53	RET
54