1*0a6a1f1dSLionel Sambuc/* $NetBSD: memset.S,v 1.5 2014/05/23 03:17:31 uebayasi Exp $ */ 2b6cbf720SGianluca Guida 3b6cbf720SGianluca Guida/*- 4b6cbf720SGianluca Guida * Copyright (c) 2003 The NetBSD Foundation, Inc. 5b6cbf720SGianluca Guida * All rights reserved. 6b6cbf720SGianluca Guida * 7b6cbf720SGianluca Guida * This code is derived from software contributed to The NetBSD Foundation 8b6cbf720SGianluca Guida * by David Laight. 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 * 19b6cbf720SGianluca Guida * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20b6cbf720SGianluca Guida * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21b6cbf720SGianluca Guida * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22b6cbf720SGianluca Guida * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23b6cbf720SGianluca Guida * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24b6cbf720SGianluca Guida * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25b6cbf720SGianluca Guida * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26b6cbf720SGianluca Guida * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27b6cbf720SGianluca Guida * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28b6cbf720SGianluca Guida * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29b6cbf720SGianluca Guida * POSSIBILITY OF SUCH DAMAGE. 30b6cbf720SGianluca Guida */ 31b6cbf720SGianluca Guida 32b6cbf720SGianluca Guida#include <machine/asm.h> 33b6cbf720SGianluca Guida 34b6cbf720SGianluca Guida#if defined(LIBC_SCCS) 35*0a6a1f1dSLionel Sambuc RCSID("$NetBSD: memset.S,v 1.5 2014/05/23 03:17:31 uebayasi Exp $") 36b6cbf720SGianluca Guida#endif 37b6cbf720SGianluca Guida 38b6cbf720SGianluca Guida#ifdef BZERO 39b6cbf720SGianluca GuidaENTRY(bzero) 40b6cbf720SGianluca Guida#else 41b6cbf720SGianluca GuidaENTRY(memset) 42b6cbf720SGianluca Guida#endif 43b6cbf720SGianluca Guida#ifdef BZERO 44b6cbf720SGianluca Guida movl 8(%esp),%ecx 45b6cbf720SGianluca Guida xor %eax,%eax 46b6cbf720SGianluca Guida#else 47b6cbf720SGianluca Guida movl 12(%esp),%ecx 48b6cbf720SGianluca Guida movzbl 8(%esp),%eax /* unsigned char, zero extend */ 49b6cbf720SGianluca Guida#endif 50b6cbf720SGianluca Guida cmpl $0x0f,%ecx /* avoid mispredicted branch... */ 51b6cbf720SGianluca Guida 52b6cbf720SGianluca Guida pushl %edi 53b6cbf720SGianluca Guida movl 8(%esp),%edi 54b6cbf720SGianluca Guida 55b6cbf720SGianluca Guida /* 56b6cbf720SGianluca Guida * if the string is too short, it's really not worth the overhead 57b6cbf720SGianluca Guida * of aligning to word boundries, etc. So we jump to a plain 58b6cbf720SGianluca Guida * unaligned set. 59b6cbf720SGianluca Guida * 60b6cbf720SGianluca Guida * NB aligning the transfer is actually pointless on my athlon 700, 61b6cbf720SGianluca Guida * It does make a difference to a PII though. 62b6cbf720SGianluca Guida * 63b6cbf720SGianluca Guida * The PII, PIII and PIV all seem to have a massive performance 64b6cbf720SGianluca Guida * drop when the initial target address is an odd multiple of 4. 65b6cbf720SGianluca Guida */ 66b6cbf720SGianluca Guida jbe .Lby_bytes 67b6cbf720SGianluca Guida 68b6cbf720SGianluca Guida#ifndef BZERO 69b6cbf720SGianluca Guida movb %al,%ah /* copy char to all bytes in word */ 70b6cbf720SGianluca Guida movl %eax,%edx 71b6cbf720SGianluca Guida sall $16,%eax 72b6cbf720SGianluca Guida orl %edx,%eax 73b6cbf720SGianluca Guida#endif 74b6cbf720SGianluca Guida 75b6cbf720SGianluca Guida movl %edi,%edx /* detect misalignment */ 76b6cbf720SGianluca Guida neg %edx 77b6cbf720SGianluca Guida andl $7,%edx 78b6cbf720SGianluca Guida jnz .Lalign 79b6cbf720SGianluca Guida.Laligned: 80b6cbf720SGianluca Guida movl %eax,-4(%edi,%ecx) /* zap last 4 bytes */ 81b6cbf720SGianluca Guida shrl $2,%ecx /* zero by words */ 82b6cbf720SGianluca Guida rep 83b6cbf720SGianluca Guida stosl 84b6cbf720SGianluca Guida.Ldone: 85b6cbf720SGianluca Guida#ifndef BZERO 86b6cbf720SGianluca Guida movl 8(%esp),%eax /* return address of buffer */ 87b6cbf720SGianluca Guida#endif 88b6cbf720SGianluca Guida pop %edi 89b6cbf720SGianluca Guida ret 90b6cbf720SGianluca Guida 91b6cbf720SGianluca Guida.Lalign: 92b6cbf720SGianluca Guida movl %eax,(%edi) /* zap first 8 bytes */ 93b6cbf720SGianluca Guida movl %eax,4(%edi) 94b6cbf720SGianluca Guida subl %edx,%ecx /* remove from main count */ 95b6cbf720SGianluca Guida add %edx,%edi 96b6cbf720SGianluca Guida jmp .Laligned 97b6cbf720SGianluca Guida 98b6cbf720SGianluca Guida.Lby_bytes: 99b6cbf720SGianluca Guida rep 100b6cbf720SGianluca Guida stosb 101b6cbf720SGianluca Guida 102b6cbf720SGianluca Guida#ifndef BZERO 103b6cbf720SGianluca Guida movl 8(%esp),%eax /* return address of buffer */ 104b6cbf720SGianluca Guida#endif 105b6cbf720SGianluca Guida popl %edi 106b6cbf720SGianluca Guida ret 107*0a6a1f1dSLionel Sambuc#ifdef BZERO 108*0a6a1f1dSLionel SambucEND(bzero) 109*0a6a1f1dSLionel Sambuc#else 110*0a6a1f1dSLionel SambucEND(memset) 111*0a6a1f1dSLionel Sambuc#endif 112