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