xref: /openbsd/sys/lib/libkern/arch/i386/memmove.S (revision 76d0caae)
1/*	$OpenBSD: memmove.S,v 1.7 2014/11/29 18:51:23 tedu Exp $	*/
2
3/*-
4 * Copyright (c) 1993, 1994, 1995 Charles M. Hannum.  All rights reserved.
5 * Copyright (c) 1990 The Regents of the University of California.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to Berkeley by
9 * William Jolitz.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its contributors
20 *    may be used to endorse or promote products derived from this software
21 *    without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36#include <machine/param.h>
37#include <machine/asm.h>
38
39/*
40 * Emulate bcopy() by swapping the first two arguments, and jumping
41 * into memmove(), which handles overlapping regions.
42 */
43ENTRY(bcopy)
44	pushl	%esi
45	pushl	%edi
46	movl	12(%esp),%esi
47	movl	16(%esp),%edi
48	jmp	docopy
49
50/*
51 * memmove(caddr_t dst, caddr_t src, size_t len);
52 * Copy len bytes, coping with overlapping space.
53 */
54ENTRY(memmove)
55	pushl	%esi
56	pushl	%edi
57	movl	12(%esp),%edi
58	movl	16(%esp),%esi
59docopy:
60	movl	20(%esp),%ecx
61	movl	%edi,%eax
62	subl	%esi,%eax
63	cmpl	%ecx,%eax		# overlapping?
64	jb	1f
65	jmp	docopyf			# nope
66/*
67 * memcpy() doesn't worry about overlap and always copies forward
68 */
69ENTRY(memcpy)
70	pushl	%esi
71	pushl	%edi
72	movl	12(%esp),%edi
73	movl	16(%esp),%esi
74	movl	20(%esp),%ecx
75docopyf:
76	movl	%edi,%eax		# setup return value for memcpy/memmove
77	shrl	$2,%ecx			# copy by 32-bit words
78	rep
79	movsl
80	movl	20(%esp),%ecx
81	andl	$3,%ecx			# any bytes left?
82	rep
83	movsb
84	popl	%edi
85	popl	%esi
86	ret
87
88	_ALIGN_TEXT
891:	movl	%edi,%eax		# setup return value for memmove
90	addl	%ecx,%edi		# copy backward
91	addl	%ecx,%esi
92	std
93	andl	$3,%ecx			# any fractional bytes?
94	decl	%edi
95	decl	%esi
96	rep
97	movsb
98	movl	20(%esp),%ecx		# copy remainder by 32-bit words
99	shrl	$2,%ecx
100	subl	$3,%esi
101	subl	$3,%edi
102	rep
103	movsl
104	popl	%edi
105	popl	%esi
106	cld
107	ret
108
109