1*0a6a1f1dSLionel Sambuc/* $NetBSD: memcpy.S,v 1.4 2014/03/22 19:38:46 jakllsch Exp $ */ 2b6cbf720SGianluca Guida 3b6cbf720SGianluca Guida/*- 4b6cbf720SGianluca Guida * Copyright (c) 1990 The Regents of the University of California. 5b6cbf720SGianluca Guida * All rights reserved. 6b6cbf720SGianluca Guida * 7b6cbf720SGianluca Guida * This code is derived from locore.s. 8b6cbf720SGianluca Guida * Optimised by David Laight 2003 9b6cbf720SGianluca Guida * 10b6cbf720SGianluca Guida * Redistribution and use in source and binary forms, with or without 11b6cbf720SGianluca Guida * modification, are permitted provided that the following conditions 12b6cbf720SGianluca Guida * are met: 13b6cbf720SGianluca Guida * 1. Redistributions of source code must retain the above copyright 14b6cbf720SGianluca Guida * notice, this list of conditions and the following disclaimer. 15b6cbf720SGianluca Guida * 2. Redistributions in binary form must reproduce the above copyright 16b6cbf720SGianluca Guida * notice, this list of conditions and the following disclaimer in the 17b6cbf720SGianluca Guida * documentation and/or other materials provided with the distribution. 18b6cbf720SGianluca Guida * 3. Neither the name of the University nor the names of its contributors 19b6cbf720SGianluca Guida * may be used to endorse or promote products derived from this software 20b6cbf720SGianluca Guida * without specific prior written permission. 21b6cbf720SGianluca Guida * 22b6cbf720SGianluca Guida * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23b6cbf720SGianluca Guida * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24b6cbf720SGianluca Guida * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25b6cbf720SGianluca Guida * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26b6cbf720SGianluca Guida * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27b6cbf720SGianluca Guida * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28b6cbf720SGianluca Guida * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29b6cbf720SGianluca Guida * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30b6cbf720SGianluca Guida * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31b6cbf720SGianluca Guida * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32b6cbf720SGianluca Guida * SUCH DAMAGE. 33b6cbf720SGianluca Guida */ 34b6cbf720SGianluca Guida 35b6cbf720SGianluca Guida#include <machine/asm.h> 36b6cbf720SGianluca Guida 37b6cbf720SGianluca Guida#if defined(LIBC_SCCS) 38*0a6a1f1dSLionel Sambuc RCSID("$NetBSD: memcpy.S,v 1.4 2014/03/22 19:38:46 jakllsch Exp $") 39b6cbf720SGianluca Guida#endif 40b6cbf720SGianluca Guida 41b6cbf720SGianluca Guida /* 42b6cbf720SGianluca Guida * (ov)bcopy (src,dst,cnt) 43b6cbf720SGianluca Guida * ws@tools.de (Wolfgang Solfrank, TooLs GmbH) +49-228-985800 44b6cbf720SGianluca Guida */ 45b6cbf720SGianluca Guida 46b6cbf720SGianluca Guida#ifdef BCOPY 47b6cbf720SGianluca GuidaENTRY(bcopy) 48b6cbf720SGianluca Guida#else 49b6cbf720SGianluca Guida#ifdef MEMMOVE 50b6cbf720SGianluca GuidaENTRY(memmove) 51b6cbf720SGianluca Guida#else 52b6cbf720SGianluca Guida#define MEMCPY 53b6cbf720SGianluca Guida#define NO_OVERLAP 54b6cbf720SGianluca GuidaENTRY(memcpy) 55b6cbf720SGianluca Guida#endif 56b6cbf720SGianluca Guida#endif 57b6cbf720SGianluca Guida push %esi 58b6cbf720SGianluca Guida mov %edi,%edx 59b6cbf720SGianluca Guida#if defined(MEMCPY) || defined(MEMMOVE) 60b6cbf720SGianluca Guida movl 8(%esp),%edi 61b6cbf720SGianluca Guida movl 12(%esp),%esi 62b6cbf720SGianluca Guida#else 63b6cbf720SGianluca Guida movl 8(%esp),%esi 64b6cbf720SGianluca Guida movl 12(%esp),%edi 65b6cbf720SGianluca Guida#endif 66b6cbf720SGianluca Guida movl 16(%esp),%ecx 67b6cbf720SGianluca Guida#if defined(NO_OVERLAP) 68b6cbf720SGianluca Guida movl %ecx,%eax 69b6cbf720SGianluca Guida#else 70b6cbf720SGianluca Guida movl %edi,%eax 71b6cbf720SGianluca Guida subl %esi,%eax 72b6cbf720SGianluca Guida cmpl %ecx,%eax /* overlapping? */ 73b6cbf720SGianluca Guida movl %ecx,%eax 74b6cbf720SGianluca Guida jb .Lbackwards 75b6cbf720SGianluca Guida#endif 76b6cbf720SGianluca Guida /* nope, copy forwards. */ 77b6cbf720SGianluca Guida shrl $2,%ecx /* copy by words */ 78b6cbf720SGianluca Guida rep 79b6cbf720SGianluca Guida movsl 80b6cbf720SGianluca Guida and $3,%eax /* any bytes left? */ 81b6cbf720SGianluca Guida jnz .Ltrailing 82b6cbf720SGianluca Guida.Ldone: 83b6cbf720SGianluca Guida#if defined(MEMCPY) || defined(MEMMOVE) 84b6cbf720SGianluca Guida movl 8(%esp),%eax 85b6cbf720SGianluca Guida#endif 86b6cbf720SGianluca Guida mov %edx,%edi 87b6cbf720SGianluca Guida pop %esi 88b6cbf720SGianluca Guida ret 89b6cbf720SGianluca Guida 90b6cbf720SGianluca Guida.Ltrailing: 91b6cbf720SGianluca Guida cmp $2,%eax 92b6cbf720SGianluca Guida jb 1f 93b6cbf720SGianluca Guida movw (%esi),%ax 94b6cbf720SGianluca Guida movw %ax,(%edi) 95b6cbf720SGianluca Guida je .Ldone 96b6cbf720SGianluca Guida movb 2(%esi),%al 97b6cbf720SGianluca Guida movb %al,2(%edi) 98b6cbf720SGianluca Guida jmp .Ldone 99b6cbf720SGianluca Guida1: movb (%esi),%al 100b6cbf720SGianluca Guida movb %al,(%edi) 101b6cbf720SGianluca Guida jmp .Ldone 102b6cbf720SGianluca Guida 103b6cbf720SGianluca Guida#if !defined(NO_OVERLAP) 104b6cbf720SGianluca Guida.Lbackwards: 105b6cbf720SGianluca Guida addl %ecx,%edi /* copy backwards. */ 106b6cbf720SGianluca Guida addl %ecx,%esi 107b6cbf720SGianluca Guida and $3,%eax /* any fractional bytes? */ 108b6cbf720SGianluca Guida jnz .Lback_align 109b6cbf720SGianluca Guida.Lback_aligned: 110b6cbf720SGianluca Guida shrl $2,%ecx 111b6cbf720SGianluca Guida subl $4,%esi 112b6cbf720SGianluca Guida subl $4,%edi 113b6cbf720SGianluca Guida std 114b6cbf720SGianluca Guida rep 115b6cbf720SGianluca Guida movsl 116b6cbf720SGianluca Guida cld 117b6cbf720SGianluca Guida jmp .Ldone 118b6cbf720SGianluca Guida 119b6cbf720SGianluca Guida.Lback_align: 120b6cbf720SGianluca Guida sub %eax,%esi 121b6cbf720SGianluca Guida sub %eax,%edi 122b6cbf720SGianluca Guida cmp $2,%eax 123b6cbf720SGianluca Guida jb 1f 124b6cbf720SGianluca Guida je 2f 125b6cbf720SGianluca Guida movb 2(%esi),%al 126b6cbf720SGianluca Guida movb %al,2(%edi) 127b6cbf720SGianluca Guida2: movw (%esi),%ax 128b6cbf720SGianluca Guida movw %ax,(%edi) 129b6cbf720SGianluca Guida jmp .Lback_aligned 130b6cbf720SGianluca Guida1: movb (%esi),%al 131b6cbf720SGianluca Guida movb %al,(%edi) 132b6cbf720SGianluca Guida jmp .Lback_aligned 133b6cbf720SGianluca Guida#endif 134*0a6a1f1dSLionel Sambuc 135*0a6a1f1dSLionel Sambuc#ifdef BCOPY 136*0a6a1f1dSLionel SambucEND(bcopy) 137*0a6a1f1dSLionel Sambuc#else 138*0a6a1f1dSLionel Sambuc#ifdef MEMMOVE 139*0a6a1f1dSLionel SambucEND(memmove) 140*0a6a1f1dSLionel Sambuc#else 141*0a6a1f1dSLionel SambucEND(memcpy) 142*0a6a1f1dSLionel Sambuc#endif 143*0a6a1f1dSLionel Sambuc#endif 144