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