1*b83ebebaSscole/* $NetBSD: bzero.S,v 1.1 2016/08/05 15:06:02 scole Exp $ */ 2*b83ebebaSscole 3*b83ebebaSscole/*- 4*b83ebebaSscole * Copyright (c) 2000 Doug Rabson 5*b83ebebaSscole * All rights reserved. 6*b83ebebaSscole * 7*b83ebebaSscole * Redistribution and use in source and binary forms, with or without 8*b83ebebaSscole * modification, are permitted provided that the following conditions 9*b83ebebaSscole * are met: 10*b83ebebaSscole * 1. Redistributions of source code must retain the above copyright 11*b83ebebaSscole * notice, this list of conditions and the following disclaimer. 12*b83ebebaSscole * 2. Redistributions in binary form must reproduce the above copyright 13*b83ebebaSscole * notice, this list of conditions and the following disclaimer in the 14*b83ebebaSscole * documentation and/or other materials provided with the distribution. 15*b83ebebaSscole * 16*b83ebebaSscole * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17*b83ebebaSscole * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*b83ebebaSscole * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*b83ebebaSscole * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20*b83ebebaSscole * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*b83ebebaSscole * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22*b83ebebaSscole * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23*b83ebebaSscole * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24*b83ebebaSscole * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25*b83ebebaSscole * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*b83ebebaSscole * SUCH DAMAGE. 27*b83ebebaSscole * 28*b83ebebaSscole * __FBSDID("$FreeBSD: releng/10.1/lib/libc/ia64/string/bzero.S 125669 2004-02-10 20:45:28Z cperciva $"); 29*b83ebebaSscole */ 30*b83ebebaSscole 31*b83ebebaSscole#include <machine/asm.h> 32*b83ebebaSscole 33*b83ebebaSscole/* 34*b83ebebaSscole * void 35*b83ebebaSscole * bzero(void *b, size_t len); 36*b83ebebaSscole */ 37*b83ebebaSscoleENTRY(bzero, 2) 38*b83ebebaSscole 39*b83ebebaSscole cmp.le p6,p0=in1,r0 // bail if len <= 0 40*b83ebebaSscole(p6) br.ret.spnt.few rp 41*b83ebebaSscole ;; 42*b83ebebaSscole mov r14=ar.lc // save ar.lc 43*b83ebebaSscole 44*b83ebebaSscole cmp.ltu p6,p0=17,in1 // check for small 45*b83ebebaSscole(p6) br.dptk.few 3f 46*b83ebebaSscole 47*b83ebebaSscole1: add r15=-1,in1 ;; 48*b83ebebaSscole mov ar.lc=r15 ;; 49*b83ebebaSscole2: st1 [in0]=r0,1 // zero one byte 50*b83ebebaSscole br.cloop.sptk.few 2b // loop 51*b83ebebaSscole 52*b83ebebaSscole ;; 53*b83ebebaSscole mov ar.lc=r14 // done 54*b83ebebaSscole br.ret.sptk.few rp 55*b83ebebaSscole 56*b83ebebaSscole // Zero up to 8byte alignment 57*b83ebebaSscole 58*b83ebebaSscole3: tbit.nz p6,p0=in0,0 ;; 59*b83ebebaSscole(p6) st1 [in0]=r0,1 60*b83ebebaSscole(p6) add in1=-1,in1 ;; 61*b83ebebaSscole 62*b83ebebaSscole tbit.nz p6,p0=in0,1 ;; 63*b83ebebaSscole(p6) st2 [in0]=r0,2 64*b83ebebaSscole(p6) add in1=-2,in1 ;; 65*b83ebebaSscole 66*b83ebebaSscole tbit.nz p6,p0=in0,2 ;; 67*b83ebebaSscole(p6) st4 [in0]=r0,4 68*b83ebebaSscole(p6) add in1=-4,in1 69*b83ebebaSscole 70*b83ebebaSscole ;; 71*b83ebebaSscole shr.u r15=in1,3 // word count 72*b83ebebaSscole extr.u in1=in1,0,3 ;; // trailing bytes 73*b83ebebaSscole cmp.eq p6,p0=r15,r0 // check for zero 74*b83ebebaSscole cmp.ne p7,p0=in1,r0 75*b83ebebaSscole(p6) br.dpnt.few 1b // zero last bytes 76*b83ebebaSscole 77*b83ebebaSscole add r15=-1,r15 ;; 78*b83ebebaSscole mov ar.lc=r15 ;; 79*b83ebebaSscole4: st8 [in0]=r0,8 80*b83ebebaSscole br.cloop.sptk.few 4b 81*b83ebebaSscole 82*b83ebebaSscole(p7) br.dpnt.few 1b // zero last bytes 83*b83ebebaSscole 84*b83ebebaSscole ;; 85*b83ebebaSscole mov ar.lc=r14 // done 86*b83ebebaSscole br.ret.sptk.few rp 87*b83ebebaSscole 88*b83ebebaSscoleEND(bzero) 89