1*18ec38eaSchs/* $NetBSD: bzero.S,v 1.6 2013/09/07 19:06:29 chs Exp $ */ 237c9f0a6Schristos 337c9f0a6Schristos/*- 437c9f0a6Schristos * Copyright (c) 1997 The NetBSD Foundation, Inc. 537c9f0a6Schristos * All rights reserved. 637c9f0a6Schristos * 737c9f0a6Schristos * This code is derived from software contributed to The NetBSD Foundation 837c9f0a6Schristos * by J.T. Conklin. 937c9f0a6Schristos * 1037c9f0a6Schristos * Redistribution and use in source and binary forms, with or without 1137c9f0a6Schristos * modification, are permitted provided that the following conditions 1237c9f0a6Schristos * are met: 1337c9f0a6Schristos * 1. Redistributions of source code must retain the above copyright 1437c9f0a6Schristos * notice, this list of conditions and the following disclaimer. 1537c9f0a6Schristos * 2. Redistributions in binary form must reproduce the above copyright 1637c9f0a6Schristos * notice, this list of conditions and the following disclaimer in the 1737c9f0a6Schristos * documentation and/or other materials provided with the distribution. 1837c9f0a6Schristos * 1937c9f0a6Schristos * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 2037c9f0a6Schristos * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2137c9f0a6Schristos * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2237c9f0a6Schristos * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 2337c9f0a6Schristos * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2437c9f0a6Schristos * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2537c9f0a6Schristos * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2637c9f0a6Schristos * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2737c9f0a6Schristos * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2837c9f0a6Schristos * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2937c9f0a6Schristos * POSSIBILITY OF SUCH DAMAGE. 3037c9f0a6Schristos */ 3137c9f0a6Schristos 3237c9f0a6Schristos/*- 3337c9f0a6Schristos * Copyright (c) 1990 The Regents of the University of California. 3437c9f0a6Schristos * All rights reserved. 3537c9f0a6Schristos * 3637c9f0a6Schristos * This code is derived from software contributed to Berkeley by 3737c9f0a6Schristos * the Systems Programming Group of the University of Utah Computer 3837c9f0a6Schristos * Science Department. 3937c9f0a6Schristos * 4037c9f0a6Schristos * Redistribution and use in source and binary forms, with or without 4137c9f0a6Schristos * modification, are permitted provided that the following conditions 4237c9f0a6Schristos * are met: 4337c9f0a6Schristos * 1. Redistributions of source code must retain the above copyright 4437c9f0a6Schristos * notice, this list of conditions and the following disclaimer. 4537c9f0a6Schristos * 2. Redistributions in binary form must reproduce the above copyright 4637c9f0a6Schristos * notice, this list of conditions and the following disclaimer in the 4737c9f0a6Schristos * documentation and/or other materials provided with the distribution. 4837c9f0a6Schristos * 3. Neither the name of the University nor the names of its contributors 4937c9f0a6Schristos * may be used to endorse or promote products derived from this software 5037c9f0a6Schristos * without specific prior written permission. 5137c9f0a6Schristos * 5237c9f0a6Schristos * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 5337c9f0a6Schristos * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 5437c9f0a6Schristos * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 5537c9f0a6Schristos * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 5637c9f0a6Schristos * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 5737c9f0a6Schristos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 5837c9f0a6Schristos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 5937c9f0a6Schristos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 6037c9f0a6Schristos * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 6137c9f0a6Schristos * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 6237c9f0a6Schristos * SUCH DAMAGE. 6337c9f0a6Schristos */ 6437c9f0a6Schristos 6537c9f0a6Schristos#include <machine/asm.h> 6637c9f0a6Schristos 6737c9f0a6Schristos#if defined(LIBC_SCCS) && !defined(lint) 6837c9f0a6Schristos#if 0 6937c9f0a6Schristos RCSID("from: @(#)bzero.s 5.1 (Berkeley) 5/12/90") 7037c9f0a6Schristos#else 71*18ec38eaSchs RCSID("$NetBSD: bzero.S,v 1.6 2013/09/07 19:06:29 chs Exp $") 7237c9f0a6Schristos#endif 7337c9f0a6Schristos#endif /* LIBC_SCCS and not lint */ 7437c9f0a6Schristos 7537c9f0a6SchristosENTRY(bzero) 7607a0a325Smatt movl %d2,-(%sp) 7707a0a325Smatt movl 8(%sp),%a0 | destination 7807a0a325Smatt movl 12(%sp),%d1 | count 7937c9f0a6Schristos 801d398a17Smatt clrl %d2 8137c9f0a6Schristos 8237c9f0a6Schristos /* 8337c9f0a6Schristos * It isn't worth the overhead of aligning to {long}word boundries 8437c9f0a6Schristos * if the string is too short. 8537c9f0a6Schristos */ 8637c9f0a6Schristos cmpl #8,%d1 87*18ec38eaSchs jlt .Lbzbyte 8837c9f0a6Schristos 8937c9f0a6Schristos /* word align */ 9037c9f0a6Schristos movl %a0,%d0 9137c9f0a6Schristos btst #0,%d0 | if (dst & 1) 92*18ec38eaSchs jeq .Lbzalgndw | 9307a0a325Smatt movb %d2,(%a0)+ | *(char *)dst++ = 0 9437c9f0a6Schristos subql #1,%d1 | len-- 95*18ec38eaSchs.Lbzalgndw: 9637c9f0a6Schristos /* long word align */ 9737c9f0a6Schristos btst #1,%d0 | if (dst & 2) 98*18ec38eaSchs jeq .Lbzalgndl | 9907a0a325Smatt movw %d2,(%a0)+ | *(short *)dst++ = 0 10037c9f0a6Schristos subql #2,%d1 | len -= 2 101*18ec38eaSchs.Lbzalgndl: 10237c9f0a6Schristos /* zero by 8 longwords */ 10337c9f0a6Schristos movel %d1,%d0 10437c9f0a6Schristos lsrl #5,%d0 | cnt = len / 32 105*18ec38eaSchs jeq .Lbzlong | if (cnt) 10637c9f0a6Schristos andl #31,%d1 | len %= 32 10737c9f0a6Schristos subql #1,%d0 | set up for dbf 108*18ec38eaSchs.Lbz32loop: 10907a0a325Smatt movl %d2,(%a0)+ | zero 8 long words 11007a0a325Smatt movl %d2,(%a0)+ 11107a0a325Smatt movl %d2,(%a0)+ 11207a0a325Smatt movl %d2,(%a0)+ 11307a0a325Smatt movl %d2,(%a0)+ 11407a0a325Smatt movl %d2,(%a0)+ 11507a0a325Smatt movl %d2,(%a0)+ 11607a0a325Smatt movl %d2,(%a0)+ 1171d398a17Smatt#ifndef __mcoldfire__ 118*18ec38eaSchs dbf %d0,.Lbz32loop | till done 11937c9f0a6Schristos clrw %d0 1201d398a17Smatt#endif 12137c9f0a6Schristos subql #1,%d0 122*18ec38eaSchs jcc .Lbz32loop 12337c9f0a6Schristos 124*18ec38eaSchs.Lbzlong: 12537c9f0a6Schristos /* copy by longwords */ 12637c9f0a6Schristos movel %d1,%d0 12737c9f0a6Schristos lsrl #2,%d0 | cnt = len / 4 128*18ec38eaSchs jeq .Lbzbyte | if (cnt) 12937c9f0a6Schristos subql #1,%d0 | set up for dbf 130*18ec38eaSchs.Lbzlloop: 13107a0a325Smatt movl %d2,(%a0)+ | clear longwords 1321d398a17Smatt#ifdef __mcoldfire__ 1331d398a17Smatt subql #1,%d0 | decrement 134*18ec38eaSchs jcc .Lbzlloop | till done 1351d398a17Smatt#else 136*18ec38eaSchs dbf %d0,.Lbzlloop | till done 1371d398a17Smatt#endif 13837c9f0a6Schristos andl #3,%d1 | len %= 4 139*18ec38eaSchs jeq .Lbzdone 14037c9f0a6Schristos 14137c9f0a6Schristos subql #1,%d1 | set up for dbf 142*18ec38eaSchs.Lbzbloop: 14307a0a325Smatt movb %d2,(%a0)+ | zero bytes 144*18ec38eaSchs.Lbzbyte: 1451d398a17Smatt#ifdef __mcoldfire__ 1461d398a17Smatt subql #1,%d0 | decrement 147*18ec38eaSchs jcc .Lbzbloop | till done 1481d398a17Smatt#else 149*18ec38eaSchs dbf %d1,.Lbzbloop | till done 1501d398a17Smatt#endif 151*18ec38eaSchs.Lbzdone: 15207a0a325Smatt movl (%sp)+,%d2 15337c9f0a6Schristos rts 15465726debSmattEND(bzero) 155