source: trunk/libs/newlib/src/newlib/libc/machine/z8k/memcpy.S

Last change on this file 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 * memcpy routine for Z8000
3 * Copyright (C) 2004 Christian Groessler <chris@groessler.org>
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 *memcpy(void *dest, const void *src, size_t length);
15 */
16
17        name    "memcpy.S"
18
19        .text
20        even
21global  _memcpy
22global  memmove_entry
23
24_memcpy:
25
26#ifdef __Z8001__
27        segm
28
29#ifdef __STD_CALL__
30        ldl     rr6,rr14(#4)
31        ldl     rr4,rr14(#8)
32        ldl     rr2,rr14(#12)
33#else
34        pushl   @rr14,rr6
35#endif
36
37/* rr2  - length        (high word ignored)
38 * rr4  - src
39 * rr6  - dest
40 */
41
42        testl   rr2
43        jr      z,finish
44
45memmove_entry:          /* external entry point from memmove */
46
47        bitb    rl7,#0          /* odd destination address? */
48        jr      nz,testsrc
49        bitb    rl5,#0          /* odd source address? */
50        jr      nz,odd_copy
51        jr      t,even_copy     /* dest even, src odd */
52
53testsrc:
54        bitb    rl5,#0
55        jr      z,odd_copy      /* src even, dest odd */
56        ldib    @rr6,@rr4,r3
57        jr      ov,finish       /* jump if r3 is zero now */
58
59/* copy words */
60even_copy:
61        ld      r2,r3           /* remember length */
62        srl     r3,#1
63        jr      z,no_words
64
65        ldir    @rr6,@rr4,r3
66
67no_words:
68        bitb    rl2,#0          /* odd length? */
69        jr      z,finish
70        ldib    @rr6,@rr4,r2    /* yes, copy last byte */
71        jr      finish
72
73/* copy bytes */
74odd_copy:
75        ldirb   @rr6,@rr4,r3
76
77finish:
78#ifdef __STD_CALL__
79        ldl     rr6,rr14(#4)
80#else
81        popl    rr2,@rr14
82#endif
83
84
85#else           /* above Z8001, below Z8002 */
86
87
88        unsegm
89
90#ifdef __STD_CALL__
91        ld      r7,r15(#2)
92        ld      r6,r15(#4)
93        ld      r5,r15(#6)
94#else
95        ld      r2,r7           /* buffer pointer return value */
96#endif
97
98/* r5  - length
99 * r6  - src
100 * r7  - dest
101 */
102        test    r5
103        jr      z,finish
104
105memmove_entry:          /* external entry point from memmove */
106
107        bitb    rl7,#0          /* odd destination address? */
108        jr      nz,testsrc
109        bitb    rl6,#0          /* odd source address? */
110        jr      nz,odd_copy
111        jr      t,even_copy     /* dest even, src odd */
112
113testsrc:
114        bitb    rl6,#0
115        jr      z,odd_copy      /* src even, dest odd */
116        ldib    @r7,@r6,r5
117        jr      ov,finish       /* jump if r5 is zero now */
118
119/* copy words */
120even_copy:
121        ld      r4,r5           /* remember length */
122        srl     r5,#1
123        jr      z,no_words
124
125        ldir    @r7,@r6,r5
126
127no_words:
128        bitb    rl4,#0          /* odd length? */
129        jr      z,finish
130        ldib    @r7,@r6,r4      /* yes, copy last byte */
131        jr      finish
132
133/* copy bytes */
134odd_copy:
135        ldirb   @r7,@r6,r5
136
137finish:
138#ifdef __STD_CALL__
139        ld      r7,r15(#2)
140#endif
141
142#endif  /* Z8002 */
143
144        ret
145        .end
Note: See TracBrowser for help on using the repository browser.