xref: /openbsd/lib/libc/arch/alpha/string/bzero.S (revision 9b9d2a55)
1*9b9d2a55Sguenther/*	$OpenBSD: bzero.S,v 1.5 2015/08/31 02:53:56 guenther Exp $	*/
239bae441Sniklas/*	$NetBSD: bzero.S,v 1.2 1996/10/17 03:08:12 cgd Exp $	*/
339bae441Sniklas
4df930be7Sderaadt/*
5df930be7Sderaadt * Copyright (c) 1995 Carnegie-Mellon University.
6df930be7Sderaadt * All rights reserved.
7df930be7Sderaadt *
8df930be7Sderaadt * Author: Trevor Blackwell
9df930be7Sderaadt *
10df930be7Sderaadt * Permission to use, copy, modify and distribute this software and
11df930be7Sderaadt * its documentation is hereby granted, provided that both the copyright
12df930be7Sderaadt * notice and this permission notice appear in all copies of the
13df930be7Sderaadt * software, derivative works or modified versions, and any portions
14df930be7Sderaadt * thereof, and that both notices appear in supporting documentation.
15df930be7Sderaadt *
16df930be7Sderaadt * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17df930be7Sderaadt * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
18df930be7Sderaadt * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19df930be7Sderaadt *
20df930be7Sderaadt * Carnegie Mellon requests users of this software to return to
21df930be7Sderaadt *
22df930be7Sderaadt *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
23df930be7Sderaadt *  School of Computer Science
24df930be7Sderaadt *  Carnegie Mellon University
25df930be7Sderaadt *  Pittsburgh PA 15213-3890
26df930be7Sderaadt *
27df930be7Sderaadt * any improvements or extensions that they make and grant Carnegie the
28df930be7Sderaadt * rights to redistribute these changes.
29df930be7Sderaadt */
30df930be7Sderaadt
31*9b9d2a55Sguenther#include "SYS.h"
32df930be7Sderaadt
33df930be7SderaadtLEAF(bzero,2)
34df930be7Sderaadt	ble	a1,bzero_done
35df930be7Sderaadt	bic	a1,63,t3	/* t3 is # bytes to do 64 bytes at a time */
36df930be7Sderaadt
37df930be7Sderaadt	/* If nothing in first word, ignore it */
38df930be7Sderaadt	subq	zero,a0,t0
39df930be7Sderaadt	and	t0,7,t0		/* t0 = (0-size)%8 */
40df930be7Sderaadt	beq	t0,bzero_nostart1
41df930be7Sderaadt
42df930be7Sderaadt	cmpult	a1,t0,t1	/* if size > size%8 goto noshort */
43df930be7Sderaadt	beq	t1,bzero_noshort
44df930be7Sderaadt
45df930be7Sderaadt	/*
46df930be7Sderaadt	 * The whole thing is less than a word.
47df930be7Sderaadt	 * Mask off 1..7 bytes, and finish.
48df930be7Sderaadt	 */
49df930be7Sderaadt	ldq_u	t2,0(a0)
50df930be7Sderaadt	lda	t0,-1(zero)	/* t0=-1 */
51df930be7Sderaadt	mskql	t0,a1,t0	/* Get ff in bytes (a0%8)..((a0+a1-1)%8) */
52df930be7Sderaadt	insql	t0,a0,t0
53df930be7Sderaadt	bic	t2,t0,t2	/* zero those bytes in word */
54df930be7Sderaadt	stq_u	t2,0(a0)
55df930be7Sderaadt	RET
56df930be7Sderaadt
57df930be7Sderaadtbzero_noshort:
58df930be7Sderaadt	/* Handle the first partial word */
59df930be7Sderaadt	ldq_u	t2,0(a0)
60df930be7Sderaadt	subq	a1,t0,a1
61df930be7Sderaadt	mskql	t2,a0,t2	/* zero bytes (a0%8)..7 in word */
62df930be7Sderaadt	stq_u	t2,0(a0)
63df930be7Sderaadt
64df930be7Sderaadt	addq	a0,t0,a0	/* round a0 up to next word */
65df930be7Sderaadt	bic	a1,63,t3	/* recalc t3 (# bytes to do 64 bytes at a
66df930be7Sderaadt				   time) */
67df930be7Sderaadt
68df930be7Sderaadtbzero_nostart1:
69df930be7Sderaadt	/*
70df930be7Sderaadt	 * Loop, zeroing 64 bytes at a time
71df930be7Sderaadt	 */
72df930be7Sderaadt	beq	t3,bzero_lp_done
73df930be7Sderaadtbzero_lp:
74df930be7Sderaadt	stq	zero,0(a0)
75df930be7Sderaadt	stq	zero,8(a0)
76df930be7Sderaadt	stq	zero,16(a0)
77df930be7Sderaadt	stq	zero,24(a0)
78df930be7Sderaadt	subq	t3,64,t3
79df930be7Sderaadt	stq	zero,32(a0)
80df930be7Sderaadt	stq	zero,40(a0)
81df930be7Sderaadt	stq	zero,48(a0)
82df930be7Sderaadt	stq	zero,56(a0)
83df930be7Sderaadt	addq	a0,64,a0
84df930be7Sderaadt	bne	t3,bzero_lp
85df930be7Sderaadt
86df930be7Sderaadtbzero_lp_done:
87df930be7Sderaadt	/*
88df930be7Sderaadt	 * Handle the last 0..7 words.
89df930be7Sderaadt	 * We mask off the low bits, so we don't need an extra
90df930be7Sderaadt	 * compare instruction for the loop (just a bne. heh-heh)
91df930be7Sderaadt	 */
92df930be7Sderaadt	and	a1,0x38,t4
93df930be7Sderaadt	beq	t4,bzero_finish_lp_done
94df930be7Sderaadtbzero_finish_lp:
95df930be7Sderaadt	stq	zero,0(a0)
96df930be7Sderaadt	subq	t4,8,t4
97df930be7Sderaadt	addq	a0,8,a0
98df930be7Sderaadt	bne	t4,bzero_finish_lp
99df930be7Sderaadt
100df930be7Sderaadt	/* Do the last partial word */
101df930be7Sderaadtbzero_finish_lp_done:
102df930be7Sderaadt	and	a1,7,t5		/* 0..7 bytes left */
103df930be7Sderaadt	beq	t5,bzero_done	/* mskqh won't change t0 if t5==0, but I
104df930be7Sderaadt				   don't want to touch, say, a new VM page */
105df930be7Sderaadt	ldq	t0,0(a0)
106df930be7Sderaadt	mskqh	t0,t5,t0
107df930be7Sderaadt	stq	t0,0(a0)
108df930be7Sderaadtbzero_done:
109df930be7Sderaadt	RET
110df930be7Sderaadt
111*9b9d2a55Sguenther	END_WEAK(bzero)
112