summaryrefslogtreecommitdiff
path: root/newlib/libc/machine/i386/memcpy.S
blob: bf1dd6be20ec6fa8ab2ab26e3672be29d2eeadf3 (plain)
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
 * ====================================================
 * Copyright (C) 1998 by Cygnus Solutions. All rights reserved.
 *
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================
 */

	#include "i386mach.h"

	.global	SYM (memcpy)

SYM (memcpy):

	pushl ebp
	movl esp,ebp
	subl $16,esp
	pushl edi
	pushl esi
	movl 8(ebp),edi
	movl 12(ebp),esi
	movl 16(ebp),ecx
	cld

#ifndef __OPTIMIZE_SIZE__
/* if aligned on long boundary, move doublewords at a time first */

	movl edi,eax
	orl esi,eax
	testb $3,al
	jne BYTEMOVE
	shrl $2,ecx
	rep
	movsl

/* calculate any remainder bytes after moving doublewords */

	movl 16(ebp),ecx
	andl $3,ecx
#endif /* not __OPTIMIZE_SIZE__ */
	
/* move any unaligned bytes or remainder bytes, one at a time */

BYTEMOVE: 
	rep
	movsb

/* return destination address */

	movl 8(ebp),eax

	leal -24(ebp),esp
	popl esi
	popl edi
	leave
	ret