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