Retro68/gcc/newlib/libc/machine/hppa/memset.S
2012-03-27 01:51:53 +02:00

86 lines
2.4 KiB
ArmAsm

/*
* (c) Copyright 1986 HEWLETT-PACKARD COMPANY
*
* To anyone who acknowledges that this file is provided "AS IS"
* without any express or implied warranty:
* permission to use, copy, modify, and distribute this file
* for any purpose is hereby granted without fee, provided that
* the above copyright notice and this notice appears in all
* copies, and that the name of Hewlett-Packard Company not be
* used in advertising or publicity pertaining to distribution
* of the software without specific, written prior permission.
* Hewlett-Packard Company makes no representations about the
* suitability of this software for any purpose.
*/
/* SPECTRUM_ID: @(#)memset.s 37.4 86/08/25 */
/*
* memset(s, c, n)
*
* Sets first n chars in memory area s to value of character c.
* Returns s.
*/
#ifndef _NAMESPACE_CLEAN
#define NOSECDEF /* prevent _memset from being defined as entry */
#endif
#include "DEFS.h"
#define TO arg0
#define FILLCHAR arg1
#define COUNT arg2
#define TMP r31
ENTRY(memset)
comb,<= COUNT,r0,msexit /* return if count not positive */
copy TO,ret0 /* return value is start of copy */
comibf,<,n 5,COUNT,msbyteloop /* be straightforward */
dep FILLCHAR,23,8,FILLCHAR /* dup low byte */
dep FILLCHAR,15,16,FILLCHAR /* into high bytes */
add TO,COUNT,TMP /* TMP points just past fill area */
stbys,m FILLCHAR,0(TO) /* fill out first word */
/*
* If we're pointing to high-order byte, no fill will happen,
* but permissions will be checked. We don't want this (we
* might be pointing at the beginning of a protected region),
* so we branch around stbys if neither low bits are set.
*/
bb,<,n TMP,31,filend /* if low bit is set, stbys */
bb,>=,n TMP,30,endfil /* if next lowest bit isn't set */
/* (and lowest isn't, either) */
/* do not stbys */
filend:
stbys,m,e FILLCHAR,0(TMP) /* fill out the last */
endfil:
addi 4, TO, TO
sub TMP,TO,COUNT /* will now divide by 4 */
comb,=,n COUNT,r0,msexit /* If count is zero ret. */
extru,<> COUNT,31,4,r1
b msquadloop
depi 0,31,4,COUNT /* will now divide by 16 */
mswordloop:
addib,<> -4,r1,mswordloop
stws,ma FILLCHAR,4(TO)
comb,=,n COUNT,r0,msexit /* If count is zero ret. */
msquadloop:
stws,ma FILLCHAR,4(TO)
stws,ma FILLCHAR,4(TO)
stws,ma FILLCHAR,4(TO)
addib,<> -16,COUNT,msquadloop
stws,ma FILLCHAR,4(TO)
b,n msexit
msbyteloop:
addib,<> -1,COUNT,msbyteloop
stbs,ma FILLCHAR,1(TO)
msexit:
EXIT(memset)