xref: /plan9/sys/src/libc/386/strcat.s (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier	TEXT	strcat(SB),$0
2*3e12c5d1SDavid du Colombier
3*3e12c5d1SDavid du Colombier	MOVL	$0, AX
4*3e12c5d1SDavid du Colombier	MOVL	$-1, CX
5*3e12c5d1SDavid du Colombier	CLD
6*3e12c5d1SDavid du Colombier
7*3e12c5d1SDavid du Colombier/*
8*3e12c5d1SDavid du Colombier * find length of second string
9*3e12c5d1SDavid du Colombier */
10*3e12c5d1SDavid du Colombier
11*3e12c5d1SDavid du Colombier	MOVL	p2+4(FP), DI
12*3e12c5d1SDavid du Colombier	REPN;	SCASB
13*3e12c5d1SDavid du Colombier
14*3e12c5d1SDavid du Colombier	MOVL	DI, BX
15*3e12c5d1SDavid du Colombier	SUBL	p2+4(FP), BX
16*3e12c5d1SDavid du Colombier
17*3e12c5d1SDavid du Colombier/*
18*3e12c5d1SDavid du Colombier * find end of first string
19*3e12c5d1SDavid du Colombier */
20*3e12c5d1SDavid du Colombier
21*3e12c5d1SDavid du Colombier	MOVL	p1+0(FP), DI
22*3e12c5d1SDavid du Colombier	REPN;	SCASB
23*3e12c5d1SDavid du Colombier
24*3e12c5d1SDavid du Colombier/*
25*3e12c5d1SDavid du Colombier * copy the memory
26*3e12c5d1SDavid du Colombier */
27*3e12c5d1SDavid du Colombier	SUBL	$1, DI
28*3e12c5d1SDavid du Colombier	MOVL	p2+4(FP), SI
29*3e12c5d1SDavid du Colombier/*
30*3e12c5d1SDavid du Colombier * copy whole longs
31*3e12c5d1SDavid du Colombier */
32*3e12c5d1SDavid du Colombier	MOVL	BX, CX
33*3e12c5d1SDavid du Colombier	SHRL	$2, CX
34*3e12c5d1SDavid du Colombier	REP;	MOVSL
35*3e12c5d1SDavid du Colombier/*
36*3e12c5d1SDavid du Colombier * copy the rest, by bytes
37*3e12c5d1SDavid du Colombier */
38*3e12c5d1SDavid du Colombier	ANDL	$3, BX
39*3e12c5d1SDavid du Colombier	MOVL	BX, CX
40*3e12c5d1SDavid du Colombier	REP;	MOVSB
41*3e12c5d1SDavid du Colombier
42*3e12c5d1SDavid du Colombier	MOVL	p1+0(FP), AX
43*3e12c5d1SDavid du Colombier	RET
44