xref: /plan9-contrib/sys/src/libc/amd64/strcat.s (revision 272efad760864ee41cfe633b56aea9b4f5cf3ae7)
1*272efad7SDavid du Colombier	TEXT	strcat(SB),$0
2*272efad7SDavid du Colombier
3*272efad7SDavid du Colombier	MOVL	$0, AX
4*272efad7SDavid du Colombier	MOVQ	$-1, CX
5*272efad7SDavid du Colombier	CLD
6*272efad7SDavid du Colombier
7*272efad7SDavid du Colombier/*
8*272efad7SDavid du Colombier * find length of second string
9*272efad7SDavid du Colombier */
10*272efad7SDavid du Colombier
11*272efad7SDavid du Colombier	MOVQ	p2+8(FP), DI
12*272efad7SDavid du Colombier	REPN;	SCASB
13*272efad7SDavid du Colombier
14*272efad7SDavid du Colombier	MOVQ	DI, BX
15*272efad7SDavid du Colombier	SUBQ	p2+8(FP), BX
16*272efad7SDavid du Colombier
17*272efad7SDavid du Colombier/*
18*272efad7SDavid du Colombier * find end of first string
19*272efad7SDavid du Colombier */
20*272efad7SDavid du Colombier
21*272efad7SDavid du Colombier	MOVQ	RARG, DI
22*272efad7SDavid du Colombier	REPN;	SCASB
23*272efad7SDavid du Colombier
24*272efad7SDavid du Colombier/*
25*272efad7SDavid du Colombier * copy the memory
26*272efad7SDavid du Colombier */
27*272efad7SDavid du Colombier	SUBQ	$1, DI
28*272efad7SDavid du Colombier	MOVQ	p2+8(FP), SI
29*272efad7SDavid du Colombier/*
30*272efad7SDavid du Colombier * copy whole longs, if aligned
31*272efad7SDavid du Colombier */
32*272efad7SDavid du Colombier	MOVQ	DI, CX
33*272efad7SDavid du Colombier	ORQ	SI, CX
34*272efad7SDavid du Colombier	ANDL	$3, CX
35*272efad7SDavid du Colombier	JNE	c3
36*272efad7SDavid du Colombier	MOVQ	BX, CX
37*272efad7SDavid du Colombier	SHRQ	$2, CX
38*272efad7SDavid du Colombier	REP;	MOVSL
39*272efad7SDavid du Colombier/*
40*272efad7SDavid du Colombier * copy the rest, by bytes
41*272efad7SDavid du Colombier */
42*272efad7SDavid du Colombier	ANDL	$3, BX
43*272efad7SDavid du Colombierc3:
44*272efad7SDavid du Colombier	MOVQ	BX, CX
45*272efad7SDavid du Colombier	REP;	MOVSB
46*272efad7SDavid du Colombier
47*272efad7SDavid du Colombier	MOVQ	RARG, AX
48*272efad7SDavid du Colombier	RET
49