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