1/*
2 * ====================================================
3 * Copyright (C) 1998, 2002 by Red Hat Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and distribute this
6 * software is freely granted, provided that this notice
7 * is preserved.
8 * ====================================================
9 */
10
11	#include "i386mach.h"
12
13	.global SYM (memcpy)
14       SOTYPE_FUNCTION(memcpy)
15
16SYM (memcpy):
17
18#ifdef __iamcu__
19	pushl esi
20	pushl edi
21	movl eax,edi
22	movl edx,esi
23
24	rep movsb
25
26	popl edi
27	popl esi
28#else
29	pushl ebp
30	movl esp,ebp
31	pushl esi
32	pushl edi
33	pushl ebx
34	movl 8(ebp),edi
35	movl 16(ebp),ecx
36	movl 12(ebp),esi
37	cld
38
39#ifndef __OPTIMIZE_SIZE__
40
41	cmpl $8,ecx
42	jbe .L3
43
44/* move any preceding bytes until destination address is long word aligned */
45
46	movl edi,edx
47	movl ecx,ebx
48	andl $3,edx
49	jz .L11
50	movl $4,ecx
51	subl edx,ecx
52	andl $3,ecx
53	subl ecx,ebx
54	rep
55	movsb
56
57	mov ebx,ecx
58
59/* move bytes a long word at a time */
60
61.L11:
62	shrl $2,ecx
63	.p2align 2
64	rep
65	movsl
66
67	movl ebx,ecx
68	andl $3,ecx
69
70#endif /* !__OPTIMIZE_SIZE__ */
71
72/* handle any remaining bytes */
73
74.L3:
75	rep
76	movsb
77.L5:
78	movl 8(ebp),eax
79
80	leal -12(ebp),esp
81	popl ebx
82	popl edi
83	popl esi
84	leave
85#endif
86	ret
87
88#if defined(__linux__) && defined(__ELF__)
89.section .note.GNU-stack,"",%progbits
90#endif
91