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