167117Sdfr/*-
267117Sdfr * Copyright (c) 2000 Doug Rabson
367117Sdfr * All rights reserved.
467117Sdfr *
567117Sdfr * Redistribution and use in source and binary forms, with or without
667117Sdfr * modification, are permitted provided that the following conditions
767117Sdfr * are met:
867117Sdfr * 1. Redistributions of source code must retain the above copyright
967117Sdfr *    notice, this list of conditions and the following disclaimer.
1067117Sdfr * 2. Redistributions in binary form must reproduce the above copyright
1167117Sdfr *    notice, this list of conditions and the following disclaimer in the
1267117Sdfr *    documentation and/or other materials provided with the distribution.
1367117Sdfr *
1467117Sdfr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1567117Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1667117Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1767117Sdfr * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1867117Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1967117Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2067117Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2167117Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2267117Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2367117Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2467117Sdfr * SUCH DAMAGE.
2567117Sdfr */
2667117Sdfr
2767117Sdfr#include <machine/asm.h>
28111777Sobrien__FBSDID("$FreeBSD: releng/10.3/lib/libc/ia64/string/bzero.S 125669 2004-02-10 20:45:28Z cperciva $");
2967117Sdfr
3067117SdfrENTRY(bzero, 2)
3167117Sdfr
3267117Sdfr	cmp.le	p6,p0=in1,r0			// bail if len <= 0
3367117Sdfr(p6)	br.ret.spnt.few rp
3485306Sdfr	;;
3567117Sdfr	mov	r14=ar.lc			// save ar.lc
3667117Sdfr
3767208Sdfr	cmp.ltu	p6,p0=17,in1			// check for small
3867208Sdfr(p6)	br.dptk.few 3f
3967117Sdfr
4083822Sdfr1:	add	r15=-1,in1 ;;
4183822Sdfr	mov	ar.lc=r15 ;;
4267117Sdfr2:	st1	[in0]=r0,1			// zero one byte
4367117Sdfr	br.cloop.sptk.few 2b			// loop
4467117Sdfr
4583822Sdfr	;;
4667117Sdfr	mov	ar.lc=r14			// done
4767117Sdfr	br.ret.sptk.few rp
4867117Sdfr
4967117Sdfr	// Zero up to 8byte alignment
5067208Sdfr
5183822Sdfr3:	tbit.nz	p6,p0=in0,0 ;;
5267117Sdfr(p6)	st1	[in0]=r0,1
5385306Sdfr(p6)	add	in1=-1,in1 ;;
5467117Sdfr
5583822Sdfr	tbit.nz	p6,p0=in0,1 ;;
5667117Sdfr(p6)	st2	[in0]=r0,2
5785306Sdfr(p6)	add	in1=-2,in1 ;;
5867117Sdfr
5983822Sdfr	tbit.nz	p6,p0=in0,2 ;;
6067117Sdfr(p6)	st4	[in0]=r0,4
6167117Sdfr(p6)	add	in1=-4,in1
6267117Sdfr
6383822Sdfr	;;
6467117Sdfr	shr.u	r15=in1,3			// word count
6567117Sdfr	extr.u	in1=in1,0,3 ;;			// trailing bytes
6667117Sdfr	cmp.eq	p6,p0=r15,r0			// check for zero
6767117Sdfr	cmp.ne	p7,p0=in1,r0
6867117Sdfr(p6)	br.dpnt.few 1b				// zero last bytes
6967117Sdfr
7067208Sdfr	add	r15=-1,r15 ;;
7183822Sdfr	mov	ar.lc=r15 ;;
7267208Sdfr4:	st8	[in0]=r0,8
7367208Sdfr	br.cloop.sptk.few 4b
7467117Sdfr
7567117Sdfr(p7)	br.dpnt.few 1b				// zero last bytes
7667117Sdfr
7783822Sdfr	;;
7867117Sdfr	mov	ar.lc=r14			// done
7967117Sdfr	br.ret.sptk.few rp
8067117Sdfr
8183822SdfrEND(bzero)
82