xref: /plan9-contrib/sys/src/libc/amd64/memccpy.s (revision 272efad760864ee41cfe633b56aea9b4f5cf3ae7)
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 */
19none:
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 */
27found:
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
37memcpy:
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
54c3:
55	MOVL	BX, CX
56	REP;	MOVSB
57
58	RET
59