11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*	$OpenBSD: bcopy.S,v 1.5 2005/08/07 11:30:38 espie Exp $	*/
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*-
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (c) 1990 The Regents of the University of California.
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved.
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * This code is derived from locore.s.
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met:
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    documentation and/or other materials provided with the distribution.
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    may be used to endorse or promote products derived from this software
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *    without specific prior written permission.
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project *
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE.
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <machine/asm.h>
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	/*
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 * (ov)bcopy (src,dst,cnt)
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 *  ws@tools.de     (Wolfgang Solfrank, TooLs GmbH) +49-228-985800
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	 */
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef MEMCOPY
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectENTRY(memcpy)
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifdef MEMMOVE
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectENTRY(memmove)
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectENTRY(bcopy)
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	pushl	%esi
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	pushl	%edi
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#if defined(MEMCOPY) || defined(MEMMOVE)
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movl	12(%esp),%edi
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movl	16(%esp),%esi
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movl	%edi, %eax
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#else
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movl	12(%esp),%esi
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movl	16(%esp),%edi
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movl	20(%esp),%ecx
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movl	%ecx,%edx
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cmpl	%esi,%edi	/* potentially overlapping? */
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jnb	1f
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cld			/* nope, copy forwards. */
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	shrl	$2,%ecx		/* copy by words */
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	rep
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movsl
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movl	%edx,%ecx
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	andl	$3,%ecx		/* any bytes left? */
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	rep
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movsb
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	popl	%edi
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	popl	%esi
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	ret
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project1:
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	addl	%ecx,%edi	/* copy backwards. */
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	addl	%ecx,%esi
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	std
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	andl	$3,%ecx		/* any fractional bytes? */
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	decl	%edi
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	decl	%esi
821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	rep
831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movsb
841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movl	%edx,%ecx
851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	shrl	$2,%ecx
861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	subl	$3,%esi
871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	subl	$3,%edi
881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	rep
891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movsl
901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	popl	%edi
911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	popl	%esi
921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cld
931dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	ret
94