xref: /netbsd-src/common/lib/libc/arch/ia64/string/bzero.S (revision b83ebeba7f767758d2778bb0f9d7a76534253621)
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