OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [newlib-1.17.0/] [newlib/] [libc/] [machine/] [z8k/] [memset.S] - Blame information for rev 148

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 148 jeremybenn
/*
2
 * memset routine for Z8000
3
 * Copyright (C) 2004 Christian Groessler 
4
 *
5
 * Permission to use, copy, modify, and distribute this file
6
 * for any purpose is hereby granted without fee, provided that
7
 * the above copyright notice and this notice appears in all
8
 * copies.
9
 *
10
 * This file is distributed WITHOUT ANY WARRANTY; without even the implied
11
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
 */
13
 
14
/* void *memset(void *buffer, int value, size_t length);
15
 */
16
 
17
        name    "memset.S"
18
 
19
        .text
20
        even
21
global  _memset
22
 
23
_memset:
24
 
25
#ifdef __Z8001__
26
        segm
27
 
28
#ifdef __STD_CALL__
29
        ldl     rr6,rr14(#4)
30
        ld      r5,rr14(#8)
31
        ldl     rr2,rr14(#10)
32
#else
33
        pushl   @rr14,rr6
34
#endif
35
 
36
/* rr2  - length
37
 * rl5  - value
38
 * rr6  - buffer
39
 */
40
        testl   rr2
41
        jr      z,finish
42
 
43
        ldb     rh5,rl5
44
        ld      r1,r5           /* r1 contains value */
45
        bit     r7,#0
46
        jr      z,not_odd
47
 
48
        ldb     @rr6,rl1
49
        inc     r7,#1
50
        subl    rr2,#1
51
        jr      z,finish
52
 
53
not_odd:ld      r0,r3           /* remember length */
54
        srl     r3,#1
55
        jr      z,no_words
56
 
57
        ldl     rr4,rr6
58
        ld      @rr6,r1
59
        inc     r7,#2
60
        dec     r3,#1
61
        jr      z,no_words
62
 
63
        ldir    @rr6,@rr4,r3    /* fill words */
64
 
65
no_words:
66
        bit     r0,#0           /* one byte remaining? */
67
        jr      z,finish
68
 
69
        ldb     @rr6,rl1
70
 
71
finish:
72
#ifdef __STD_CALL__
73
        ldl     rr6,rr14(#4)
74
#else
75
        popl    rr2,@rr14
76
#endif
77
 
78
 
79
#else           /* above Z8001, below Z8002 */
80
 
81
 
82
        unsegm
83
 
84
#ifdef __STD_CALL__
85
        ld      r7,r15(#2)
86
        ld      r6,r15(#4)
87
        ld      r5,r15(#6)
88
#else
89
        ld      r2,r7           /* buffer pointer return value */
90
#endif
91
 
92
/* r5  - length
93
 * r6  - value
94
 * r7  - buffer
95
 */
96
        test    r5
97
        jr      z,finish
98
 
99
        ldb     rh6,rl6
100
        ld      r1,r6           /* r1 contains value */
101
        bit     r7,#0
102
        jr      z,not_odd
103
 
104
        ldb     @r7,rl1
105
        inc     r7,#1
106
        dec     r5,#1
107
        jr      z,finish
108
 
109
not_odd:ld      r0,r5           /* remember length */
110
        srl     r5,#1
111
        jr      z,no_words
112
 
113
        ld      r4,r7
114
        ld      @r7,r1
115
        inc     r7,#2
116
        dec     r5,#1
117
        jr      z,no_words
118
 
119
        ldir    @r7,@r4,r5      /* fill words */
120
 
121
no_words:
122
        bit     r0,#0           /* one byte remaining? */
123
        jr      z,finish
124
 
125
        ldb     @r7,rl1
126
 
127
finish:
128
#ifdef __STD_CALL__
129
        ld      r7,r15(#2)
130
#endif
131
 
132
#endif  /* Z8002 */
133
 
134
        ret
135
        .end

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.