source: trunk/libs/newlib/src/newlib/libc/machine/hppa/memset.S @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 2.4 KB
Line 
1/*
2 *  (c) Copyright 1986 HEWLETT-PACKARD COMPANY
3 *
4 *  To anyone who acknowledges that this file is provided "AS IS"
5 *  without any express or implied warranty:
6 *      permission to use, copy, modify, and distribute this file
7 *  for any purpose is hereby granted without fee, provided that
8 *  the above copyright notice and this notice appears in all
9 *  copies, and that the name of Hewlett-Packard Company not be
10 *  used in advertising or publicity pertaining to distribution
11 *  of the software without specific, written prior permission.
12 *  Hewlett-Packard Company makes no representations about the
13 *  suitability of this software for any purpose.
14 */
15
16/* SPECTRUM_ID: @(#)memset.s    37.4     86/08/25 */
17/*
18 * memset(s, c, n)
19 *
20 * Sets first n chars in memory area s to value of character c.
21 * Returns s.
22 */
23#ifndef _NAMESPACE_CLEAN
24#define NOSECDEF   /* prevent _memset from being defined as entry */
25#endif
26
27#include "DEFS.h"
28
29#define TO      arg0
30#define FILLCHAR arg1
31#define COUNT   arg2
32#define TMP     r31
33
34ENTRY(memset)
35        comb,<= COUNT,r0,msexit /* return if count not positive */
36        copy    TO,ret0         /* return value is start of copy */
37        comibf,<,n      5,COUNT,msbyteloop /* be straightforward */
38
39        dep     FILLCHAR,23,8,FILLCHAR  /* dup low byte  */
40        dep     FILLCHAR,15,16,FILLCHAR /* into high bytes */
41
42        add             TO,COUNT,TMP    /* TMP points just past fill area */
43        stbys,m         FILLCHAR,0(TO)  /* fill out first word */
44        /*
45         * If we're pointing to high-order byte, no fill will happen,
46         * but permissions will be checked.  We don't want this (we
47         * might be pointing at the beginning of a protected region),
48         * so we branch around stbys if neither low bits are set.
49         */
50        bb,<,n          TMP,31,filend   /* if low bit is set, stbys */
51        bb,>=,n         TMP,30,endfil   /* if next lowest bit isn't set */
52                                        /*  (and lowest isn't, either) */
53                                        /*  do not stbys */
54filend:
55        stbys,m,e       FILLCHAR,0(TMP) /* fill out the last */
56endfil:
57        addi            4, TO, TO
58        sub             TMP,TO,COUNT    /* will now divide by 4 */
59        comb,=,n        COUNT,r0,msexit /* If count is zero ret. */
60
61        extru,<>        COUNT,31,4,r1
62        b               msquadloop
63        depi            0,31,4,COUNT    /* will now divide by 16 */
64
65
66mswordloop:
67        addib,<>        -4,r1,mswordloop
68        stws,ma         FILLCHAR,4(TO)
69
70        comb,=,n        COUNT,r0,msexit /* If count is zero ret. */
71
72msquadloop:
73        stws,ma         FILLCHAR,4(TO)
74        stws,ma         FILLCHAR,4(TO)
75        stws,ma         FILLCHAR,4(TO)
76        addib,<>        -16,COUNT,msquadloop
77        stws,ma         FILLCHAR,4(TO)
78        b,n             msexit
79
80msbyteloop:
81        addib,<>        -1,COUNT,msbyteloop
82        stbs,ma         FILLCHAR,1(TO)
83
84msexit:
85EXIT(memset)
Note: See TracBrowser for help on using the repository browser.