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