2.11BSD/src/lib/libc/pdp/gen/bzero.s
/*
* Copyright (c) 1987 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
*/
#ifdef LIBC_SCCS
<@(#)bzero.s 1.2 (Berkeley) 8/21/87\0>
.even
#endif LIBC_SCCS
#include "DEFS.h"
/*
* bzero(b, length)
* caddr_t b;
* u_int length;
*
* Zero length bytes starting at b. Bzero uses a cost analysis heuristic to
* determine if it's worth while to try zeroing memory by words. If length >
* N, then try for a word zero. This routine will fail if N < 8.
* 8 is a good value for N:
*
* Algorithm Cost (in instructions)
* byte loop 2 * length
* word loop overhead [worst case] 11
* word loop 0.625 * length
*
* N * 2 > 11 + N * 0.625
* N > 8
*/
#undef N
#define N 8.
ENTRY(bzero)
mov 4(sp),r0 / if ((r0 = length) == 0)
beq 2f / return
mov 2(sp),r1 / r1 = b
cmp r0,$N / if (length > N)
bhi 3f / do words
1:
clrb (r1)+ / do *b++ = 0
sob r0,1b / while (--length)
2:
rts pc / and return
/*
* The length of the zero justifies using a word loop, handling any leading
* and trailing odd bytes separately.
*/
3:
bit $1,r1 / if (odd leading byte)
beq 4f / { zero it
clrb (r1)+ / length--
dec r0 / }
4:
mov r0,-(sp) / save trailing byte indicator
asr r0 / length >>= 1 (unsigned)
bic $0100000,r0 / (length is now in remaining words to zero)
asr r0 / if (length >>= 1, wasodd(length))
bcc 5f / handle leading non multiple of four
clr (r1)+
5:
asr r0 / if (length >>= 1, wasodd(length))
bcc 6f / handle leading non multiple of eight
clr (r1)+
clr (r1)+
6:
clr (r1)+ / do
clr (r1)+ / clear eight bytes
clr (r1)+
clr (r1)+
sob r0,6b / while (--length)
bit $1,(sp)+ / if (odd trailing byte)
beq 7f
clrb (r1)+ / zero it
7:
rts pc / and return