summaryrefslogtreecommitdiffstats
path: root/contrib/syslinux-4.02/dos/memmove.S
blob: 1ab2cb236b8ebb5518881a3a7752ebb8a0e86ff5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#
# memmove.S
#
# Simple 16-bit memmove() implementation
#

	.text
	.code16gcc
	.globl memmove
	.type memmove, @function
memmove:
	pushw %di
	pushw %si
	movw %ax,%di
	movw %dx,%si
	cmpw %si,%di
	ja 1f
	# The third argument is already in cx
	cld
	rep ; movsb
2:
	popw %si
	popw %di
	ret

1:	/* si <= di, need reverse copy */
	add %cx,%di
	add %cx,%si
	dec %di
	dec %si
	std
	rep ; movsb
	cld
	jmp 2b

	.size memmove,.-memmove