xref: /plan9-contrib/sys/src/libc/386/memcpy.s (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier	TEXT	memcpy(SB), $0
2*3e12c5d1SDavid du Colombier
3*3e12c5d1SDavid du Colombier	MOVL	p1+0(FP), DI
4*3e12c5d1SDavid du Colombier	MOVL	p2+4(FP), SI
5*3e12c5d1SDavid du Colombier	MOVL	n+8(FP), BX
6*3e12c5d1SDavid du Colombier	CMPL	BX, $0
7*3e12c5d1SDavid du Colombier	JGE	ok
8*3e12c5d1SDavid du Colombier	MOVL	$0, SI
9*3e12c5d1SDavid du Colombierok:
10*3e12c5d1SDavid du Colombier	CLD
11*3e12c5d1SDavid du Colombier/*
12*3e12c5d1SDavid du Colombier * check and set for backwards
13*3e12c5d1SDavid du Colombier */
14*3e12c5d1SDavid du Colombier	CMPL	SI, DI
15*3e12c5d1SDavid du Colombier	JLS	back
16*3e12c5d1SDavid du Colombier/*
17*3e12c5d1SDavid du Colombier * copy whole longs
18*3e12c5d1SDavid du Colombier */
19*3e12c5d1SDavid du Colombier	MOVL	BX, CX
20*3e12c5d1SDavid du Colombier	SHRL	$2, CX
21*3e12c5d1SDavid du Colombier	REP;	MOVSL
22*3e12c5d1SDavid du Colombier/*
23*3e12c5d1SDavid du Colombier * copy the rest, by bytes
24*3e12c5d1SDavid du Colombier */
25*3e12c5d1SDavid du Colombier	ANDL	$3, BX
26*3e12c5d1SDavid du Colombier	MOVL	BX, CX
27*3e12c5d1SDavid du Colombier	REP;	MOVSB
28*3e12c5d1SDavid du Colombier
29*3e12c5d1SDavid du Colombier	MOVL	p+0(FP),AX
30*3e12c5d1SDavid du Colombier	RET
31*3e12c5d1SDavid du Colombier/*
32*3e12c5d1SDavid du Colombier * whole thing backwards has
33*3e12c5d1SDavid du Colombier * adjusted addresses
34*3e12c5d1SDavid du Colombier */
35*3e12c5d1SDavid du Colombierback:
36*3e12c5d1SDavid du Colombier	ADDL	BX, DI
37*3e12c5d1SDavid du Colombier	ADDL	BX, SI
38*3e12c5d1SDavid du Colombier	SUBL	$4, DI
39*3e12c5d1SDavid du Colombier	SUBL	$4, SI
40*3e12c5d1SDavid du Colombier	STD
41*3e12c5d1SDavid du Colombier/*
42*3e12c5d1SDavid du Colombier * copy whole longs
43*3e12c5d1SDavid du Colombier */
44*3e12c5d1SDavid du Colombier	MOVL	BX, CX
45*3e12c5d1SDavid du Colombier	SHRL	$2, CX
46*3e12c5d1SDavid du Colombier	ANDL	$3, BX
47*3e12c5d1SDavid du Colombier	REP;	MOVSL
48*3e12c5d1SDavid du Colombier/*
49*3e12c5d1SDavid du Colombier * copy the rest, by bytes
50*3e12c5d1SDavid du Colombier */
51*3e12c5d1SDavid du Colombier	ADDL	$3, DI
52*3e12c5d1SDavid du Colombier	ADDL	$3, SI
53*3e12c5d1SDavid du Colombier	MOVL	BX, CX
54*3e12c5d1SDavid du Colombier	REP;	MOVSB
55*3e12c5d1SDavid du Colombier
56*3e12c5d1SDavid du Colombier	MOVL	p+0(FP),AX
57*3e12c5d1SDavid du Colombier	RET
58