xref: /plan9/sys/src/libc/386/memccpy.s (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier	TEXT	memccpy(SB),$0
2*3e12c5d1SDavid du Colombier
3*3e12c5d1SDavid du Colombier	MOVL	n+12(FP), CX
4*3e12c5d1SDavid du Colombier	CMPL	CX, $0
5*3e12c5d1SDavid du Colombier	JEQ	none
6*3e12c5d1SDavid du Colombier	MOVL	p2+4(FP), DI
7*3e12c5d1SDavid du Colombier	MOVBLZX	c+8(FP), AX
8*3e12c5d1SDavid du Colombier	CLD
9*3e12c5d1SDavid du Colombier/*
10*3e12c5d1SDavid du Colombier * find the character in the second string
11*3e12c5d1SDavid du Colombier */
12*3e12c5d1SDavid du Colombier
13*3e12c5d1SDavid du Colombier	REPN;	SCASB
14*3e12c5d1SDavid du Colombier	JEQ	found
15*3e12c5d1SDavid du Colombier
16*3e12c5d1SDavid du Colombier/*
17*3e12c5d1SDavid du Colombier * if not found, set count to 'n'
18*3e12c5d1SDavid du Colombier */
19*3e12c5d1SDavid du Colombiernone:
20*3e12c5d1SDavid du Colombier	MOVL	$0, AX
21*3e12c5d1SDavid du Colombier	MOVL	n+12(FP), BX
22*3e12c5d1SDavid du Colombier	JMP	memcpy
23*3e12c5d1SDavid du Colombier
24*3e12c5d1SDavid du Colombier/*
25*3e12c5d1SDavid du Colombier * if found, set count to bytes thru character
26*3e12c5d1SDavid du Colombier */
27*3e12c5d1SDavid du Colombierfound:
28*3e12c5d1SDavid du Colombier	MOVL	DI, AX
29*3e12c5d1SDavid du Colombier	SUBL	p2+4(FP), AX
30*3e12c5d1SDavid du Colombier	MOVL	AX, BX
31*3e12c5d1SDavid du Colombier	ADDL	p1+0(FP), AX
32*3e12c5d1SDavid du Colombier
33*3e12c5d1SDavid du Colombier/*
34*3e12c5d1SDavid du Colombier * copy the memory
35*3e12c5d1SDavid du Colombier */
36*3e12c5d1SDavid du Colombier
37*3e12c5d1SDavid du Colombiermemcpy:
38*3e12c5d1SDavid du Colombier	MOVL	p1+0(FP), DI
39*3e12c5d1SDavid du Colombier	MOVL	p2+4(FP), SI
40*3e12c5d1SDavid du Colombier/*
41*3e12c5d1SDavid du Colombier * copy whole longs
42*3e12c5d1SDavid du Colombier */
43*3e12c5d1SDavid du Colombier	MOVL	BX, CX
44*3e12c5d1SDavid du Colombier	SHRL	$2, CX
45*3e12c5d1SDavid du Colombier	REP;	MOVSL
46*3e12c5d1SDavid du Colombier/*
47*3e12c5d1SDavid du Colombier * copy the rest, by bytes
48*3e12c5d1SDavid du Colombier */
49*3e12c5d1SDavid du Colombier	ANDL	$3, BX
50*3e12c5d1SDavid du Colombier	MOVL	BX, CX
51*3e12c5d1SDavid du Colombier	REP;	MOVSB
52*3e12c5d1SDavid du Colombier
53*3e12c5d1SDavid du Colombier	RET
54